階層を使用して分類法をインポートする方法は?


7

サイトをD7からD8にアップグレードします。D8には、マルチレベルの親子階層を含む語彙があります。リストが長すぎる(約5K〜10Kの用語)ため、手動でインポートできません。

D8 Coreでmigrateを使用し、migrate_plusおよびmigrate_toolsモジュールを使用してそれを拡張してみました。これらは、用語階層がない場合に非常にうまく機能します。

階層付きの用語をインポートするためにそれをどのように機能させることができますか?親として受け入れる値は、用語IDです。(初めてインポートするときに)親の名前を渡すと、ルートレベルで用語が作成されます。何か不足していますか?これらのモジュールだけでこれを実行できない場合、これらのモジュールを拡張するにはどうすればよいでしょうか。参考文献もいただければ幸いです。


1
分類用語の移行ソースプラグインには、分類用語の親を明示的に検索するコードが含まれているため、バグである可能性があります。編集:それは働いて実際にあることを述べているコアでのテストがあります- api.drupal.org/api/drupal/...
mradcliffe

親の用語IDを渡すときに機能しますが、親のインポートと子のインポートの両方で同時に機能させたいです。リンクを共有していただきありがとうございます。リンクをチェックして、不足しているものがないか確認します。
Yogesh

回答:


5

少し遅れましたが、解決したと思います...

migrate.whatever.ymlファイルで、親ソースにプロセスプラグインを追加する必要があります。

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

1
遅い?ここは午後の早い時間です...
Pierre.Vriens '10

5

Taxonomy with Hierarchy既存のものと一緒にインポートしたい場合tidは、以下に従ってください。インポート構成を次のように構成します

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

今あなたのcsvファイルはこのようになります

ここに画像の説明を入力してください

これで分類を確認できます。結果は既存のを使用しtidた下の画像のようになります。

ここに画像の説明を入力してください


0

移行モジュールの代替ソリューションは、親構造を持つ用語のリストのインポートをサポートする用語CSVエクスポートインポートモジュールを使用することです。

CSVファイルの形式の例:

name,description,format,weight,parent_name,[any_additional_fields]

0

階層的な分類用語を簡単にインポートできるモジュールがあります。Drupal 8バージョンのモジュールを見てください。その名前はHierarchical Taxonomy Importerです。

これにより、CSVファイルからネストされたレベルの用語をインポートできます。モジュールのリンクはこちらです。

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

親子関係の深さに制限はありません。


0

このパッチを参照してください: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

移行モジュールの使用には少しがっかりしましたが、すぐに自分のスクリプトを使い始めました。階層を持つ分類法をインポートするスクリプトの下:

// 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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.