Twigでフィールドデータにアクセスするにはどうすればよいですか?


15

次のようなカスタムブロックタイプのリストフィールドがあります。

left|Align left
right|Align right

Twigのキーにアクセスするには、次のようにします。

{% block content %}
  {{ content.field_align }}  {# outputs 'right' #}
{% endblock %}

ただし、単純な比較を行うと、が出力されますFALSE

{{ kint(content.field_align == 'right') }}

次のコードはを返しますTRUE

{{ kint(content.field_align['#items'].getValue()|first.value == 'right') }}

「実際の」文字列を取得するための短いバージョンがあるので、Twigs文字列フィルターを使用して整理できますか?


回答:


16

content 設定されたフォーマッタに基づいたレンダー配列が含まれます。

実際の値にアクセスする場合は、エンティティオブジェクトを介してアクセスします。通常、これは、たとえばテンプレートですでに使用可能ですnode。あなたの場合、block_contentは独自のテンプレートなしでブロックコンテンツにレンダリングされるため、少し特別です。次のように自分で利用可能にする必要がありますyourtheme_preprocess_block($variables)

if (isset($variables['elements']['content']['#block_content'])) {
  $variables['block_content'] = $variables['elements']['content']['#block_content'];
}

次に、を使用してフィールド値にアクセスできますblock_content.field_name.property。だからあなたの場合、block_content.field_align.value。このプロパティはvalue、ほとんどのフィールドタイプ、参照、target_idIDまたはentity参照されたエンティティオブジェクトに使用できます。はい、そのフィールドに直接アクセスできますが、参照が存在することを常に確認してください。そうしないと、致命的なエラーまたは例外が発生する可能性があります。たとえば、用語参照のラベルにアクセスするには、としてアクセスできますblock_content.field_tags.entity.name.value

フィールドデルタを指定しない場合、デフォルトで最初になります。別のデルタにアクセスする場合は、などを使用できますentity.field_name.1.value。ループすることもできます。

これはすべてPHPに直接マップされます$block_content->field_tags->entity->name->value。block_contentがあるプリプロセスやその他の場所でも実行できます。


ご回答有難うございます!ノードオブジェクトが使用できないブロック小枝テンプレート(サブテーマ「Classy」)からこれを実行しているときに、値を前処理して何らかの方法で注入する必要がありますか?
estrar

申し訳ありませんが、block_contentの部分が見つかりませんでした。答えを更新しました。
ベルディール

パーフェクト!これを行うことで価値を得ることができblock_content.field_name.value ました:理解を助けてくれてありがとう!
estrar

6

これは、レンダー配列をレンダリングしてその値をチェックできる代替のテンプレートのみの方法です(Drupal 8 Twigでの印刷はレンダー配列である変数を自動的にレンダリングするため、変数を印刷するかのように変数をチェックできます)。

{{ kint(content.field_align|render == 'right') }}

または、後で変数を印刷する場合に追加のレンダリングを保存する別のオプション:

{% set field_align = content.field_align|render %}
{{ kint(field_align == 'right') }}

{{ field_align }}

非常に便利で知っておくと良い!入力いただきありがとうございます。
-estrar

2

この場合、Twig Field Valueモジュールを使用できます。フィールドレンダー配列から部分的なデータを取得できます。例えば content.field_name | field_value-フィールドの値を取得します。IFステートメントで使用できます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.