web-dev-qa-db-ja.com

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

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

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文字列フィルターを使用して整頓できますか?

15
estrar

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です。参照の場合、IDにtarget_idを使用するか、参照されるエンティティオブジェクトにentityを使用できます。はい、そのフィールドに直接アクセスできますが、参照が存在することを必ず確認してください。そうしないと、致命的なエラーや例外が発生する可能性があります。たとえば用語参照のラベルにアクセスするには、block_content.field_tags.entity.name.valueとしてアクセスできます。

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

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

16
Berdir

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

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

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

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

{{ field_align }}
6
Cottser

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

2
Andrew Kozoriz