Migration avec le module de migration

8

J'utilise Drupal 7 et le dernier module Migrate. J'essaie de créer une classe pour migrer les produits d'une base de données OpenCart vers mon nouveau site D7. J'ai compris tout le SQL dont j'ai besoin et j'ai programmé la majeure partie de cela. Mais j'ai un peu de mal à comprendre comment je vais faire les catégories.

Ma cible de migration est Ubercart.

Ce que j'essaie de comprendre se trouve dans le module migrate_example qui est un sous-module de Migrate. Plus précisément, je regarde le fichier wine.inc de la classe WineWineMigration. J'essaie de comprendre le terme migration.

J'ai deux listes qui deviendront des termes de taxonomie dans les produits Ubercart. Tout d'abord, les catégories. J'ai configuré les catégories manuellement, donc lorsque j'apporterai la liste de celles-ci (en utilisant la fonction SQL GROUP_CONCAT), j'aurai un tas d'ID que je mapperai en utilisant un tableau qui contiendra toutes les conversions d'ID. C'est très bien, mais quand je regarde leurs informations BestWith qu'ils migrent, cela montre qu'il utilise la classe WineBestWith ci-dessus pour importer le terme.

Je suis confus par cela car cela ressemble à une sorte de migration secondaire des termes. C'est ce qui se passe? De plus, est-ce là que je mettrais mon tableau de mappage, dans ce terme de classe de migration?

La prochaine chose que je dois faire est de gérer les balises. Dans OpenCart, nous avons un tas de balises de forme libre. Et lorsque je crée manuellement un produit dans Ubercart, j'ai un champ de saisie semi-automatique pour les balises. Dans ce domaine, je peux simplement mettre une liste de termes séparés par des virgules et cela crée plusieurs termes. Puis-je faire la même chose dans le module Migrate? Puis-je simplement mapper le champ à la liste des termes séparés par des virgules? Cela ajoutera-t-il les balises pour chaque produit?

Patrick
la source

Réponses:

14

Je travaille sur le même problème en ce moment, donc je comprends votre confusion. Vous avez beaucoup de questions, mais je pense qu'elles peuvent se résumer en une question singulière:

Comment le module Migrate gère-t-il la migration d'une base de données normalisée dans une installation Drupal?

Ce n'est certainement pas simple, mais voici ma compréhension de la façon dont cela fonctionne. Nous allons commencer par le haut (WineWineMigration) en descendant et poser des questions au fur et à mesure.

Nous commençons par regarder le code en haut de la WineWineMigrationclasse.

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

Cela indique au module Migrate que pour migrer votre contenu Wine, les migrations dépendantes - WineVariety, WineRegion, WineBestWith, WineUser, WineProduce - doivent être effectuées en premier.

Nous avons donc appris ici que les migrations peuvent dépendre d'autres migrations .

Ensuite, nous avons le mappage entre la table qui contient actuellement les informations de base sur le vin et le nœud Drupal:

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

C'est assez simple, donc si vous avez besoin d'éclaircissements, je vous les fournirai.

Je vais sauter des trucs intermédiaires qui ne sont pas vraiment pertinents pour connecter les différentes catégories et objets vin.

Nous arrivons maintenant aux mappages de champs. Observer:

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

Voyez où il est dit:

->sourceMigration(...)

Cela indique à la migration que pour mapper ce champ, une autre migration doit d'abord être satisfaite. Je pense que c'est la «migration secondaire» dont vous avez parlé. Utilisons le regionmappage de champ comme exemple ici. Le décomposer ...

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

Cela signifie que la région de catégorie dans la base de données source est mappée à un terme de vocabulaire de région. Comme l'indique le commentaire TIP dans le bloc de code des mappages de champ, il suppose que les mappages sont effectués en fonction des noms de champ, mais comme nous dépendons d'une migration secondaire comme vous le dites, nous devons spécifier la migration dont il dépend et lui demander de utilisez des tids au lieu des noms de champs.

Donc, à peu près pour chaque table normalisée que vous avez dans votre base de données source, vous allez spécifier une migration pour chacun, puis dans les mappages de champs pertinents qui impliquent ces tables, vous spécifierez des migrations dépendantes dans vos appels de mappage de champs , ainsi que la déclaration des migrations dépendantes au début de chaque migration.

J'espère que ça aide. Je ne comprends pas entièrement cela moi-même, j'ai donc utilisé cette question comme une opportunité pour améliorer ma compréhension de la façon dont Migrate relie les bases de données. Comme j'apprends un peu plus, je mettrai à jour ma réponse en conséquence.

Lester Peabody
la source
1
Faites-moi savoir si vous avez besoin de clarifier quelque chose. Le poste est un peu une décharge de cerveau, je me rends compte ...
Lester Peabody