Configuration de la migration lors de la mise à niveau vers Drupal 8
Créez vos migrations initiales
- Créez les migrations en utilisant
drush migrate-upgrade --configure-only
, comme décrit dans la section « Mise à niveau avec Drush ». - Assurez-vous de disposer d’un aconfig/syncdirectory dans lequel sera enregistré l’étape suivante.
- Exportez les migrations en utilisant drush config:export.
- Créez votre propre module de migration personnalisé.
- Copiez uniquement les fichiers YML que vous souhaitez utiliser depuis le répertoire config/sync vers le répertoire config/install de votre nouveau module personnalisé, en les éditant pour supprimer les valeurs uuid et modifier l’identifiant, le groupe, le label et d’autres valeurs selon vos besoins.
- Copiez le fichier de groupe
migrate_plus.migration_group.migrate_drupal_7.yml
depuis config/sync vers le répertoire config/install de votre nouveau module personnalisé, en le renommant enmigrate_plus.migration_group.your_module.yml
. Vous aurez besoin du fichier de groupe car il contient les paramètres de la base de données.
Gestion de la migration
- Commencez par migrer les rôles utilisateur et les utilisateurs avant de passer aux nœuds.
- En continuant à ajouter des fichiers dans le répertoire config/install, rechargez le répertoire avec une commande telle que
drush config-import --partial --source=modules/custom/your_module/config/install
(ceci nécessite que le module Config soit activé).
Renommer des champs lors de la mise à niveau vers Drupal 8
Supposons que votre site Drupal 7 possède un type de contenu A avec les champs foo, bar et baz. Supposons aussi que vous souhaitez renommer le champ baz en zot dans Drupal 8. Ce type de modification est assez simple à réaliser lors de la migration avec Drush.
- Créez les migrations en utilisant
drush migrate-upgrade --configure-only
comme indiqué dans la page mentionnée ci-dessus. - Exécutez la migration du type de nœud et des champs. Cela générera le type de contenu A avec les champs foo, bar et baz.
- Créez manuellement le champ zot dans Drupal 8. Supprimez la base baz générée par la migration, mais que vous ne souhaitez pas utiliser.
- Le module Migrate Plus permet d’implémenter des modules connectables en tant qu’objets de configuration, facilitant leur chargement, modification et sauvegarde. Les migrations individuelles créées avec
drush migrate-upgrade --configure-only
peuvent désormais être vérifiées via admin/config/development/configuration/single/export en sélectionnant « Migration » comme type de configuration. Choisissez la migration du type de nœud (A). - Copiez-collez la migration dans admin/config/development/configuration/single/import, mais modifiez le mapping de champ pour que le champ cible soit
field_zot
tout en continuant à mapper la source defield_baz
. Le contenu exact de la définition dépendra du type de champ. Pour comprendre la structure des migrations, consultez les exemples dans la documentation de l’API Migrate. - Une fois la migration modifiée importée, vous pouvez lancer la migration du type de nœud A via Drush et vérifier que les données sont bien transférées vers le champ zot.
- Répétez la modification du mapping pour la migration des révisions du nœud (A) si vous prévoyez aussi de migrer les révisions.
Une autre méthode pour obtenir le même résultat est de créer manuellement le nouveau champ zot, comme décrit ci-dessus, et de modifier le mapping de champ de la migration des nœuds (A) en implémentant hook_migration_plugins_alter().
Écriture de plugins de processus personnalisés
Si vous devez définir une logique de transformation personnalisée (exemple : if-else), vous pouvez envisager d’écrire votre propre plugin de processus.
Un exemple dans la documentation de l’API Migrate utilise la migration utilisateur. Pour déterminer le code de langue de l’utilisateur, une logique if-else est nécessaire, et c’est pourquoi le module User fournit son propre plugin de processus UserLangcode.
L’exemple ci-dessus décrit où enregistrer le processus dans MODULE/src/Plugin/migrate/process
et comment l’annoter pour qu’il soit utilisable. Utilisez UserLangcode et d’autres plugins de processus comme exemples pour écrire le vôtre !
hook_migrate_prepare_row()
Si vous devez définir une logique de transformation personnalisée, vous pouvez aussi implémenter hook_migrate_prepare_row() dans votre module personnalisé et y coder votre logique.
Comme indiqué dans la documentation de l’API, ce hook reçoit trois arguments :
- Row $row
- MigrateSourceInterface $source
- MigrationInterface $migration
Vous pouvez utiliser $migration->id()
pour limiter votre logique à une migration spécifique.
Pour lire une propriété source dans une variable, utilisez Row::getSourceProperty() ; par exemple, si la ligne source contient une propriété nommée type, vous pouvez faire : $type = $row->getSourceProperty('type');
Pour définir une nouvelle propriété que vous pouvez utiliser comme source dans la définition de migration, utilisez Row::setSourceProperty().
Pour faire des requêtes à la base de données du site source, utilisez $source->getDatabase()->query()
, comme montré dans la documentation de l’interface de connexion.
Pour ignorer une ligne lors de la migration, vous pouvez lancer une nouvelle exception MigrateSkipRowException.
hook_migration_plugins_alter()
Une autre manière de configurer la migration est d’implémenter la fonction hook_migration_plugins_alter() dans votre module personnalisé.
Comme indiqué dans la documentation, ce hook reçoit un argument qui est un tableau associatif de toutes les migrations détectées. Vous pouvez modifier ou supprimer des migrations que vous ne souhaitez pas exécuter.
Migrate Plus fournit l’événement PREPARE_ROW
Si vous préférez écrire vos réponses personnalisées à l’événement prepare_row de manière orientée objet plutôt que d’implémenter hook_migrate_prepare_row(), vous pouvez le faire si vous avez activé le module Migrate Plus. Migrate Plus fournit un événement PREPARE_ROW auquel votre subscriber peut s’abonner. Vous pouvez consulter la documentation API Drupal 8 sur les événements. Pour un exemple d’implémentation d’un subscriber d’événement dans un autre contexte, voir cet exemple dans le guide du module Simple FB Connect.