web-dev-qa-db-ja.com

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

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

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

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

7
Yogesh

インポートしたい場合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ファイルは次のようになります

enter image description here

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

enter image description here

5
Mukunda Bhatta

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

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

私にとってこれは問題を解決します:

  # 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'

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

0
Valiyard

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

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

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

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

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

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

0
Divesh Kumar

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

CSVファイルの形式の例:

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

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