Wie importiere ich Taxonomie mit Hierarchie?

7

Wir aktualisieren unsere Site von D7 auf D8, deren Vokabular eine mehrstufige Eltern-Kind-Hierarchie enthält. Die Liste ist zu lang (ca. 5K-10K-Begriffe), um manuell importiert zu werden.

Wir haben versucht, migrate in D8 Core zu verwenden und es mit migrate_plus und migrate_tools zu erweitern . Diese funktionieren sehr gut, wenn es keine Termhierarchie gibt.

Wie können wir es zum Importieren von Begriffen mit Hierarchie zum Laufen bringen? Der Wert, den es für das übergeordnete Element akzeptiert, ist der Begriff id. Wenn wir den übergeordneten Namen übergeben (während wir ihn zum ersten Mal importieren), wird der Begriff auf Stammebene erstellt. Vermissen wir etwas? Wenn wir dies nicht nur mit diesen Modulen tun können, wie können wir diese Module erweitern? Referenzen wären auch sehr dankbar.

Yogesh
quelle
1
Könnte ein Fehler sein, da das Migrationsquell-Plugin für Taxonomiebegriffe Code enthält, der den übergeordneten Taxonomiebegriff explizit nachschlägt. Bearbeiten: Es gibt einen Test im Kern, der besagt, dass es tatsächlich funktioniert - api.drupal.org/api/drupal/…
mradcliffe
Es funktioniert, wenn die übergeordnete Term-ID übergeben wird, aber ich möchte, dass es gleichzeitig für den Import von übergeordneten und untergeordneten Importen funktioniert. Vielen Dank für das Teilen des Links. Überprüfen Sie den Link und prüfen Sie, ob mir etwas fehlt.
Yogesh

Antworten:

5

Es ist etwas spät, aber ich glaube, ich habe das gerade gelöst ...

In Ihrer Datei migrate.whatever.yml müssen Sie der übergeordneten Quelle ein Prozess-Plugin hinzufügen:

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
Froboy
quelle
1
Spät? Es ist nur früher Nachmittag hier ...
Pierre.Vriens
5

Wenn Sie Taxonomy with Hierarchyzusammen mit dem vorhandenen importieren möchten, gehen Sie wie tidfolgt vor. Konfigurieren Sie Ihre Importkonfiguration wie folgt

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

Jetzt wird Ihre csvDatei so sein

Geben Sie hier die Bildbeschreibung ein

Jetzt können Sie Ihre Taxonomie überprüfen. Das Ergebnis ist wie im Bild unten mit vorhanden tid.

Geben Sie hier die Bildbeschreibung ein

Mukunda Bhatta
quelle
0

Eine alternative Lösung für das Migrationsmodul ist die Verwendung des Moduls " Term CSV Export Import", das den Import einer Liste von Begriffen mit übergeordneter Struktur unterstützt.

Beispielformat einer CSV-Datei:

name,description,format,weight,parent_name,[any_additional_fields]
Kenorb
quelle
0

Es gibt ein Modul, mit dem hierarchische Taxonomiebegriffe problemlos importiert werden können. Schauen Sie sich die Drupal 8-Version des Moduls an und es heißt Hierarchical Taxonomy Importer .

Dies kann Begriffe auf verschachtelten Ebenen aus einer CSV-Datei importieren. Hier ist der Link des Moduls.

https://www.drupal.org/project/hti

Es gibt keine Einschränkung für die Beziehungstiefe zwischen Eltern und Kindern.

Divesh Kumar
quelle
0

Siehe diesen 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;
trong
quelle
0

Ich war etwas enttäuscht von der Verwendung von Migrationsmodulen und begann schnell, meine eigenen Skripte zu verwenden. Unter einem Skript zum Importieren einer Taxonomie mit Hierarchie:

// 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
Stef Van Looveren
quelle