web-dev-qa-db-ja.com

複数のソースをフィールドに結合する

大体次のような複数のソースがあります:

  • ワイン-内容:"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

これを自分のニーズに合うように変換するにはどうすればよいですか?

3
Ambidex

多くの試行錯誤の末、それを見つけました。基本的には、すべてを個別の「疑似フィールド」に分割し、実際のフィールドに処理する前にデータを準備することになります。

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プラグインを付加して、行が無視されないようにする必要があります。

6
Ambidex

アンビデックスありがとうございます!あなたは私に必要な鍵をくれました。

同様の問題がありました:外​​部の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'
3
Spartanicus