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 WineWineMigration
classe.
...
$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 region
mappage 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.