Migrieren Sie die serielle CSV-Quelle

7

Ich verwende migrate, um Commerce-Produkte aus einer CSV-Datei zu importieren. Die CSV-Datei hat keine eigene Seriennummer, daher verwende ich csvrownum, aber das funktioniert natürlich nicht, wenn es bereits Produkte gibt. Ich werde ständig von den CSV-Dateien migrieren und benötige daher eine echte Seriennummer. Die große Frage ist also, wie kann ich Migrate anweisen, eine eigene Seriennummer zu generieren? prepareRowfühlt sich zu spät an, weil ich MigrateSQLMap anscheinend als Schlüsselfeld zur Verfügung stellen muss.

Hier ist eine grobe Version des Konstruktors der Klasse:

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');
}

quelle
Führen Sie Ihre Migrationen beim Testen zurück? Wenn nicht, kann dies zu Problemen mit doppelten Einträgen führen. Es könnte damit gemacht werden drush mr YourClassName. Die Verwendung csvrownumals Schlüsselfeld sollte kein Problem sein, soweit es einzigartig ist ...
drcelus
Ja, und es gab viele Fortschritte, als ich die Datenbank einfach weggeblasen habe.
AFAIK können Sie verwenden prepareRow, sofern Sie das Feld als vierten Parameter in Ihrem Konstruktor angeben .
Drcelus
1
Wie die Antwort zeigt, ist prepareRow zu spät, Sie möchten prepareKey.

Antworten:

4

Inzwischen habe ich das herausgefunden. Das zweite Argument von MigrateSQLMapist ein Feld => Schema-Array, und Sie können diese Felder function prepareKey($source_key, $row)beispielsweise nach Bedarf ausfüllen

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

Hinweis : prepareRowSie möchten zu spät prepareKey.

Pierre.Vriens
quelle
2

Sie müssen das nicht product_idexplizit zuordnen. Sie sollten in der Lage sein, diese Zeile einfach zu löschen:

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

Auf der anderen Seite benötigen Sie eine SKU. Wenn Sie sich darauf verlassen, dass csvnumrowdie externe ID bedeutet, dass Sie niemals ein Produkt aus der CSV entfernen können, fügen Sie am Ende einfach etwas mehr hinzu. Ich würde dringend empfehlen, eine zuverlässige externe ID zu finden ICH WÜRDE.

Damien Tournoud
quelle