Migration mit dem Migrationsmodul


8

Ich verwende Drupal 7 und das neueste Migrate-Modul. Ich versuche, eine Klasse zum Migrieren von Produkten aus einer OpenCart-Datenbank in meine neue D7-Site zu erstellen. Ich habe alles SQL herausgefunden, das ich brauche, und das meiste davon programmiert. Aber ich habe ein wenig Probleme zu verstehen, wie ich die Kategorien machen werde.

Mein Migrationsziel ist Ubercart.

Was ich zu verstehen versuche, befindet sich im Modul migrate_example, einem Submodul von Migrate. Insbesondere schaue ich mir die Datei wine.inc in der WineWineMigration-Klasse an. Ich versuche den Begriff Migration zu verstehen.

Ich habe zwei Listen, die in den Ubercart-Produkten zu Taxonomiebegriffen werden. Erstens sind die Kategorien. Ich habe die Kategorien manuell eingerichtet. Wenn ich also die Liste dieser Kategorien überbringe (mithilfe der SQL-Funktion GROUP_CONCAT), habe ich eine Reihe von IDs, die ich mithilfe eines Arrays zuordnen werde, das alle ID-Konvertierungen enthält. Das ist in Ordnung, aber wenn ich mir die BestWith-Informationen ansehe, die sie migrieren, zeigt dies, dass sie die oben genannte WineBestWith-Klasse zum Importieren des Begriffs verwenden.

Das verwirrt mich, weil es wie eine Art sekundäre Migration von Begriffen aussieht. Passiert das? Würde ich hier mein Mapping-Array in diesen Begriff Migrationsklasse einfügen?

Das nächste, was ich tun muss, ist mit Tags umzugehen. In OpenCart gibt es eine Reihe von Freiform-Tags. Und wenn ich ein Produkt manuell in Ubercart erstelle, habe ich ein Feld für die automatische Vervollständigung von Tags. In diesem Feld kann ich einfach eine durch Kommas getrennte Liste von Begriffen eingeben und es werden mehrere Begriffe erstellt. Kann ich dasselbe im Migrationsmodul tun? Kann ich das Feld einfach der Liste der durch Kommas getrennten Begriffe zuordnen? Fügt das die Tags für jedes Produkt hinzu?

Antworten:


14

Ich arbeite gerade an demselben Problem, damit ich Ihre Verwirrung verstehe. Sie haben viele Fragen, aber ich denke, sie lassen sich zu einer einzigen Frage zusammenfassen:

Wie behandelt das Migrate-Modul die Migration einer normalisierten Datenbank in eine Drupal-Installation?

Es ist definitiv nicht einfach, aber hier ist mein Verständnis, wie es funktioniert. Wir beginnen von oben (WineWineMigration) und stellen Fragen, während wir gehen.

Wir beginnen mit einem Blick auf den Code oben in der WineWineMigrationKlasse.

...
$this->dependencies = array('WineVariety', 'WineRegion',
  'WineBestWith', 'WineUser', 'WineProducer');
...

Dies teilt dem Migrationsmodul mit, dass zum Migrieren Ihres Wine-Inhalts die abhängigen Migrationen - WineVariety, WineRegion, WineBestWith, WineUser, WineProduce - zuerst abgeschlossen werden müssen.

Wir haben hier also gelernt, dass Migrationen von anderen Migrationen abhängig sein können .

Als nächstes haben wir die Zuordnung zwischen der Tabelle, die derzeit die Basisweininformationen enthält, und dem Drupal-Knoten:

$this->map = new MigrateSQLMap($this->machineName,
  array(
    'wineid' => array(
      'type' => 'int',
      'unsigned' => TRUE,
      'not null' => TRUE,
      'description' => 'Wine ID',
      'alias' => 'w',
    )
  ),
  MigrateDestinationNode::getKeySchema()
);

Dies ist ziemlich einfach. Wenn Sie eine Klärung benötigen, werde ich diese bereitstellen.

Ich werde einige vorläufige Dinge überspringen, die nicht wirklich relevant sind, um die verschiedenen Kategorien und Weinobjekte miteinander zu verbinden.

Nun kommen wir zu den Feldzuordnungen. Beobachten:

// Mapped fields
$this->addFieldMapping('title', 'name')
     ->description(t('Mapping wine name in source to node title'));
$this->addFieldMapping('uid', 'accountid')
     ->sourceMigration('WineUser')
     ->defaultValue(1);
// TIP: By default, term relationship are assumed to be passed by name.
// In this case, the source values are IDs, so we specify the relevant
// migration (so the tid can be looked up in the map), and tell the term
// field handler that it is receiving tids instead of names
$this->addFieldMapping('migrate_example_wine_varieties', 'variety')
     ->sourceMigration('WineVariety')
     ->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('migrate_example_wine_regions', 'region')
     ->sourceMigration('WineRegion')
     ->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('migrate_example_wine_best_with', 'best_with')
     ->separator(',')
     ->sourceMigration('WineBestWith')
     ->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('field_migrate_example_wine_ratin', 'rating');
$this->addFieldMapping('field_migrate_example_top_vintag', 'best_vintages');

Sehen Sie, wo es heißt:

->sourceMigration(...)

Dies zeigt der Migration an, dass zum Zuordnen dieses Felds zuerst eine andere Migration durchgeführt werden muss. Ich glaube, dies ist die "sekundäre Migration", von der Sie gesprochen haben. Verwenden wir hier die regionFeldzuordnung als Beispiel. Brechen sie ab...

$this->addFieldMapping('migrate_example_wine_regions', 'region')
     ->sourceMigration('WineRegion')
     ->arguments(array('source_type' => 'tid'));

Dies besagt, dass die Kategorieregion in der Quellendatenbank einem Regionsvokabularbegriff zugeordnet ist. Wie im TIP-Kommentar im Codeblock für Feldzuordnungen angegeben, wird davon ausgegangen, dass Zuordnungen auf der Grundlage von Feldnamen vorgenommen werden. Da wir jedoch von einer sekundären Migration abhängig sind, müssen Sie die Migration angeben, von der sie abhängig sind, und sie anweisen Verwenden Sie Gezeiten anstelle von Feldnamen.

So ziemlich für jede normalisierte Tabelle, die Sie in Ihrer Quellendatenbank haben, geben Sie für jede eine Migration an, und dann geben Sie in den relevanten Feldzuordnungen, die diese Tabellen betreffen, abhängige Migrationen in Ihren Feldzuordnungsaufrufen an sowie die Erklärung der abhängigen Migrationen zu Beginn jeder Migration.

Ich hoffe das hilft. Ich verstehe das selbst nicht ganz und habe diese Frage als Gelegenheit genutzt, um mein Verständnis für die Beziehung zwischen Migrate und Datenbanken zu verbessern. Wenn ich etwas mehr lerne, werde ich meine Antwort entsprechend aktualisieren.


1
Lassen Sie mich wissen, wenn Sie etwas geklärt brauchen. Der Beitrag ist ein bisschen wie ein Brain Dump, den ich realisiere ...
Lester Peabody
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.