web-dev-qa-db-ja.com

段落の親エンティティのトークンを取得するにはどうすればよいですか?

ノードによって参照される段落があります。現在、トークンを使用してノードのフィールド値を段落に渡そうとしています。私は[paragraph:parent_id][paragraph:parent_type]のみを認識していますが、特定のフィールド値を取得する方法がわかりません。

私がこれまでに試みたが成功せず:
[node:field_foo:value]
[paragraph:field_foo:value]
[paragraph:node:field_foo:value]
[paragraph:parent:field_foo:value]
[paragraph:parent:entity:field_foo:value]

利用可能なトークンのリストには、親トークンが含まれていません。親エンティティのトークンを取得することもできますか?もしそうなら、どのように?

1
Philipp Michael

箱から出して何もありません(詳細は この問題 を参照してください)。独自のトークンを実装することはそれほど難しいことではありません。

私はこれをテストする機会がありませんでしたが、うまくいくと確信しています:

function MODULE_token_info_alter(&$info) {
  $info['tokens']['paragraph']['parent_entity'] = [
    'name' => 'Parent entity',
    'description' => 'Parent entity of the paragraph',
  ];
}

function MODULE_tokens($type, $tokens, array $data, array $options, \Drupal\Core\Render\BubbleableMetadata $bubbleable_metadata) {
  $replacements = [];

  if ($type == 'paragraph' && $paragraph = $data['paragraph']) {
    $parent = $paragraph->getParentEntity();
    $bubbleable_metadata->addCacheableDependency($parent);

    foreach ($tokens as $name => $original) {
      if ($name == 'parent_entity') {
        $replacements[$original] = $parent->label();
      }
    }

    $token_service = \Drupal::token();
    if ($parent_entity_tokens = $token_service->findWithPrefix($tokens, 'parent_entity')) {
      $replacements += $token_service->generate($parent->getEntityTypeId(), $parent_entity_tokens, [$parent->getEntityTypeId() => $parent], $options, $bubbleable_metadata);
    }
  }

  return $replacements;
}
4
Clive

したがって、Drupal 8と段落の最新バージョンでは、これが可能です。

/admin/help/tokenのトークンを見ると、段落セクションの下に[paragraph:parent_entity]があり、これがまさに必要なものです。

使用例:親ノードのタイトルを取得するために、[paragraph:parent_entity:title]を使用しました。

2
Avery Green