web-dev-qa-db-fra.com

Comment importer la taxonomie avec la hiérarchie?

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.

7
Yogesh

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

enter image description here

vous pouvez maintenant vérifier votre taxonomie, le résultat sera comme dans l'image ci-dessous avec tid existant.

enter image description here

5
Mukunda Bhatta

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
5
froboy

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'

Source: https://api.drupal.org/api/drupal/core%21modules%21taxonomy%21migrations%21d7_taxonomy_term.yml/8.6.x

0
Valiyard

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
0
Stef Van Looveren

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.

0
Divesh Kumar

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]
0
kenorb

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;
0
trong