Nous mettons à jour notre site de D7 à D8, qui a un vocabulaire contenant une hiérarchie parent-enfant à plusieurs niveaux. La liste est trop longue (environ 5K-10K termes) pour être importée manuellement.
Nous avons essayé d'utiliser migrate dans D8 Core et de l'étendre à l'aide du module migrate_plus et migrate_tools . Cela fonctionne vraiment bien quand il n'y a pas de hiérarchie de termes.
Comment pouvons-nous le faire fonctionner pour importer un terme avec une hiérarchie. La valeur qu'il accepte pour le parent est le terme id. Si nous transmettons le nom du parent (comme nous l'importons pour la première fois), il crée le terme au niveau racine. Manquons-nous quelque chose? Si nous ne pouvons pas le faire uniquement avec ces modules, comment pouvons-nous étendre ces modules. Des références seraient également grandement appréciées.
Si vous souhaitez importer Taxonomy with Hierarchy
avec le tid
existant, puis procédez comme suit. Configurez votre configuration d'importation quelque chose comme ça
id: taxonomy_migration
class: null
field_plugin_method: null
cck_plugin_method: null
migration_tags:
- CSV
migration_group: null
label: 'Taxonomy migration from CSV'
source:
plugin: csv
path: test.csv //path of file
header_row_count: 1
keys:
- tid //unique key which is used for mapping while importing other content related with this taxonomy
process:
parent: //this is for your parent term id
plugin: migration_lookup
migration: taxonomy_migration //this is the current migration id which will help you to make parent child on taxonomy
source: pid //parent id source from your csv file
name: term
tid: tid
destination:
plugin: 'entity:taxonomy_term'
default_bundle: test_taxonomy //your vocabulary machine name where you want to import
migration_dependencies: null
migration_dependencies: null
maintenant votre fichier csv
sera comme ça
vous pouvez maintenant vérifier votre taxonomie, le résultat sera comme dans l'image ci-dessous avec tid
existant.
Il est un peu tard, mais je pense que je viens de résoudre ce problème ...
Dans votre fichier migrate.wwhat.yml, vous devez ajouter un plugin de processus dans la source parent:
destination:
plugin: entity:taxonomy_term
process:
vid: vocab
name: name
weight: weight
parent:
-
plugin: migration
migration: whatever // This should be the name of your current migration
source: parent // This is the name of the source field
no_stub: true
-
plugin: default_value // Not required, but useful for large data sets
default_value: 0
Pour moi, cela résout le problème:
# Only attempt to stub real (non-zero) parents.
parent_id:
-
plugin: skip_on_empty
method: process
source: parent
-
plugin: migration_lookup
migration: d7_taxonomy_term // this migration
parent:
plugin: default_value
default_value: 0
source: '@parent_id'
J'étais un peu déçu de l'utilisation des modules de migration et j'ai rapidement commencé à utiliser mes propres scripts. Sous un script pour importer une taxonomie avec hiérarchie:
// You would first have to create an array $results from csv or other source
// Make sure you have tid, title and parent in your set
foreach($results as $result) {
Term::create([
'tid' => $result->tid,
'name' => $result->name,
'vid' => 'MY_NEW_VOCABULARY'
])->enforceIsNew()->save();
}
// Reload and resave to add hierarchy
foreach($results as $result) {
$term = Term::load($result->tid);
$term->parent = ['target_id' => $result->parent];
$term->save();
}
// Smile! You imported your tags while keeping their tid and hierarchy
Il existe un module qui permet d'importer facilement des termes de taxonomie hiérarchique. Jetez un œil à Drupal 8 version du module et son nom est Importateur de taxonomie hiérarchique .
Cela peut importer des termes sur des niveaux imbriqués à partir d'un fichier CSV. Voici le lien du module.
https://www.drupal.org/project/hti
Il n'y a pas de limite pour la profondeur de la relation parent-enfant.
La solution alternative au module Migrate consiste à utiliser le module Term CSV Export Import qui prend en charge l'importation d'une liste de termes avec la structure parente.
Exemple de format de fichier CSV:
name,description,format,weight,parent_name,[any_additional_fields]
Voir ce patch: https://www.drupal.org/project/drupal/issues/2965938#comment-12587479
# This patch file was generated by NetBeans IDE
# It uses platform neutral UTF-8 encoding and \n newlines.
--- a/core/modules/migrate/src/MigrateExecutable.php
+++ b/core/modules/migrate/src/MigrateExecutable.php
@@ -363,8 +363,18 @@
$break = FALSE;
foreach ($value as $scalar_value) {
try {
- $new_value[] = $plugin->transform($scalar_value, $this, $row, $destination);
+// $new_value[] = $plugin->transform($scalar_value, $this, $row, $destination);
+ // reserve salar value
+ $result = $plugin->transform($scalar_value, $this, $row, $destination);
+ // fix parent_id always return null on MigrationLookup::transform
+ if (is_null($result)) {
+ if ($scalar_value) {
+ $new_value[] = $scalar_value;
}
+ } else {
+ $new_value[] = $result;
+ }
+ }
catch (MigrateSkipProcessException $e) {
$new_value[] = NULL;
$break = TRUE;