サイトをD7からD8にアップグレードします。D8には、マルチレベルの親子階層を含む語彙があります。リストが長すぎるため(約5K〜10Kの用語)、手動でインポートできません。
D8 Coreで移行を使用し、 migrate_plus および migrate_tools モジュールを使用してそれを拡張してみました。これらは、用語の階層がない場合に非常にうまく機能します。
階層付きの用語をインポートするためにどのように機能させることができますか?親として受け入れる値は、用語IDです。 (初めてインポートするときに)親の名前を渡すと、ルートレベルで用語が作成されます。何か不足していますか?これらのモジュールだけでこれを実行できない場合、これらのモジュールをどのように拡張できますか?参考文献もいただければ幸いです。
インポートしたい場合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
を使用した下の画像のようになります。
少し遅れましたが、解決したと思います...
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
私にとってこれは問題を解決します:
# 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'
移行モジュールを使用することに少しがっかりし、自分のスクリプトをすぐに使い始めました。階層付きの分類法をインポートするスクリプトの下:
// 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
階層的な分類用語を簡単にインポートできるモジュールがあります。 Drupalモジュールの8バージョンであり、その名前はHierarchical Taxonomy Importerです。
これにより、CSVファイルからネストされたレベルの用語をインポートできます。モジュールのリンクはこちらです。
https://www.drupal.org/project/hti
親子関係の深さに制限はありません。
Migrateモジュールの代替ソリューションは、親構造を持つ用語のリストのインポートをサポートする Term CSV Export Import モジュールを使用することです。
CSVファイルの形式の例:
name,description,format,weight,parent_name,[any_additional_fields]
このパッチを参照してください: 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;