大体次のような複数のソースがあります:
"1,2,3,4"
"1,2,3,4,5"
これらを1つの分類語彙に組み合わせて、それらが自動作成され、宛先フィールドで参照されるようにしたいと思います。だから私は次のようなことをしたいと思います。しかし、私は static_map
documentation 正しく、このように複数のソースをマッピングすることは、機能しません。また、この例ではまだ文字列を分解していません。これは、値をマップできるようにするために必須だと思います。
field_drinks:
-
plugin: static_map
source:
- wines
- sodas
map:
wines:
'1': 'Sauvignon Blanc'
'2': 'Chiraz'
'3': 'Pinot Noir'
'4': 'Malbec'
sodas:
'1': 'Coca-Cola'
'2': 'Spa'
'3': 'Sprite'
'4': 'Tonic'
'5': 'Bitter lemon'
-
plugin: skip_on_empty
method: process
-
plugin: entity_generate
entity_type: taxonomy_term
bundle_key: vid
bundle: drinks
value_key: name
これを自分のニーズに合うように変換するにはどうすればよいですか?
多くの試行錯誤の末、それを見つけました。基本的には、すべてを個別の「疑似フィールド」に分割し、実際のフィールドに処理する前にデータを準備することになります。
process:
# First convert legacy wine id's to regular string names in a pseudo field
_prepare_wines:
-
plugin: explode
limit: 100
delimiter: ","
source: wines
-
plugin: static_map
map:
'1': 'Sauvignon Blanc'
'2': 'Chiraz'
'3': 'Pinot Noir'
'4': 'Malbec'
# Secondly convert legacy soda id's to regular string names in a pseudo field
_prepare_sodas:
-
plugin: explode
limit: 100
delimiter: ","
source: sodas
-
plugin: static_map
map:
'1': 'Coca-Cola'
'2': 'Spa'
'3': 'Sprite'
'4': 'Tonic'
'5': 'Bitter lemon'
# Third, get all the pseudo field output together in a new pseudo field and flatten them into a single array
_prepare_field_drinks:
-
plugin: get
source:
- '@_prepare_wines'
- '@_prepare_sodas'
-
plugin: flatten
# Lastly, the data is now all in a Nice single level array with only names for the new taxonomy terms so we can use those as source.
field_drinks:
-
plugin: entity_generate
entity_type: taxonomy_term
bundle_key: vid
bundle: drinks
value_key: name
source: '@_prepare_field_drinks'
免責事項:これが処理方法であるかどうかはわかりませんが、カスタムプラグインなしでトリックを実行するように見えました。また、ソースフィールドのいずれかが空である可能性がある場合は、skip_on_empty
プラグインを付加して、行が無視されないようにする必要があります。
アンビデックスありがとうございます!あなたは私に必要な鍵をくれました。
同様の問題がありました:外部のJSONフィードから独立したブール変数のコレクションを取得し、それぞれをDrupal 8の単一の既存の複数値分類に変換する必要がありました。既存のプロセスプラグインだけを使用してみることにした、単純明快なタスク。
ブール値をstatic_mapに直接簡単に渡すことができないことを発見したため、これはさらに困難になりました(参照: https://www.drupal.org/docs/8/api/migrate-api/migrate -process-plugins/process-plugin-static-map )。最後に、ブール値を明示的に文字列に変換し、これらをstatic_map(分類用語ごとに1つ)に渡してから、これらをまとめてフラット化し、内部分類に引き渡さなければなりませんでした。私は「true」とマークされたもののみをマッピングすることに興味がありました。したがって、falseの場合、何も設定することをスキップする必要がありました。最終結果は、単一の語彙内の一連のチェックボックスであり、入ってくるブール値が真であるかどうかがチェックされます。
同様のことをする必要がある人のための例を以下に示します。
_prepare_firstBooleanField:
-
plugin: callback
callable: strtolower # a convenient method to do the conversion to string
source: firstBooleanField
-
plugin: static_map
bypass: true # skip mapping if the boolean value is false
map:
'1': 23 # to the left is the result of
# converting the boolean to string;
# to the right is the taxonomy term id (tid)
# to which we're mapping. Note that we do no mapping
# at all for false - we just want to skip in that case.
_prepare_secondBooleanField: # map as many of these as needed
-
plugin: callback
callable: strtolower
source: secondBooleanField
-
plugin: static_map
bypass: true
map:
'1': 18 # etc - keep mapping tids (note: could also
# map names, but this would require doing an
# entity_lookup later; if you know the term ids
# (and we do, because we're mapping to an existing
# taxonomy) just use them directly. (It also allows
# the names to change without breaking the import
# for ongoing data feeds.)
# Now: flatten all the values that we've found together into
# one simple array (thanks to the clue from Ambidex above)
_prepare_someTaxonomyField:
-
plugin: get
source:
- '@_prepare_firstBooleanField'
- '@_prepare_secondBooleanField' # etc - can keep adding fields
-
plugin: flatten
# Finally, hand the array to the taxonomy field!
# By using the tids above, we can do a direct assignment:
field_some_taxonomy: '@_prepare_someTaxonomyField'