CSVソースシリアルの移行


7

移行を使用して、CSVファイルからコマース製品をインポートしています。CSVファイルには独自のシリアルがないため、csvrownumを使用していますが、すでに製品がある場合は明らかに機能しません。CSVファイルから常に移行するため、実際のシリアルが必要です。したがって、大きな問題は、Migrateに独自のシリアルを生成するように指示するにはどうすればよいですか?prepareRowMigrateSQLMapにキーフィールドを指定する必要があるように見えるので、手遅れだと感じています。

クラスのコンストラクタの大まかなバージョンは次のとおりです。

public function __construct() {
  parent::__construct();
  $this->description = t('Test CSV');

  $columns = array(
    array('product_name', 'title'),
    array('url', 'url'),
    array('price', 'price'),
  );

  $this->source = new MigrateSourceCSV('/tmp/test.csv', $columns, array('header_rows' => 1));

  $this->destination = new MigrateDestinationCommerceProduct('commerce_product', 'product');

  $this->map = new MigrateSQLMap($this->machineName,
    array(
      'csvrownum' => array(
        'type' => 'int',
        'not null' => true,
      ),
    ),
    MigrateDestinationCommerceProduct::getKeySchema('commerce_product')
  );

  $this->addFieldMapping('product_id', 'csvrownum');
  $this->addFieldMapping('title', 'title');
  $this->addFieldMapping('field_url', 'url');
  $this->addFieldMapping('commerce_price', 'price');
}

テスト中に移行をロールバックしていますか?そうでない場合、重複エントリの問題が発生する可能性があります。それはで行うことができますdrush mr YourClassNamecsvrownumキーフィールドとして使用することは、それが一意である限り問題になりません...
drcelus

ええ、データベースを破壊しただけで、多くの進展がありました。

AFAIK prepareRowでは、コンストラクタで 4番目のパラメータとしてフィールドを提供する限り使用できます。
drcelus 2013年

1
答えが示すように、prepareRowは遅すぎるので、prepareKeyが必要です。

回答:


4

その間私はこれを理解しました。の2番目の引数MigrateSQLMapはフィールド=>スキーマ配列でありfunction prepareKey($source_key, $row)、必要に応じてこれらのフィールドに入力できます。

function prepareKey($source_key, $row) {
  $row->vendor_id = $this->vendorId;
  return parent::prepareKey($source_key, $row);
}

prepareRow手遅れです、あなたが欲しいですprepareKey


2

product_id明示的にマップする必要はありません。あなたはこの行をドロップすることができるはずです:

$this->addFieldMapping('product_id', 'csvrownum');

一方、SKUが必要になるcsvnumrowため、外部IDとして依存しているため、CSVから製品を削除することはできません。最後にいくつか追加するだけです...信頼できる外部を見つけることを強くお勧めしますID。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.