Twigテンプレートの複数値コンテンツフィールドを反復処理する


23

テンプレートfield_admin_tags内のフィールドのレンダリングを制御する必要がありnode.html.twigます。

この作品:

  • {{ content.field_admin_tags }} —すべてをレンダリングします(ラベル+すべてのフィールド値)
  • {{ content.field_admin_tags.0 }} —フィー​​ルドの最初の値のみを表示し、ラベルは表示しません

問題:タグを囲むマークアップを制御できません<ul><li>...</li></ul>

したがって、私の考えはレンダー配列反復処理することでした。

しかし、それは機能しません:

{% for tag in content.field_admin_tags %}
  {{ tag }}
{% endfor %}

取得しますException: Object of type Drupal\node\Entity\Node cannot be printed

はレンダー配列のキー/値とフィールド内のアイテムを繰り返していると思います(各ループで「X」を印刷すると、20個のXが得られますが、このフィールドには2つまたは3つの値しかありません) 。

私は、反復処理したいcontent.field_admin_tags.0content.field_admin_tags.1など、

これを修正する方法はありますか?ありがとう。


回答:


15

これは、フィールドの小枝で修正できます。そこで既存のループを使用して、フィールドアイテムを反復処理できます。

node.html.twig

{{ content.field_admin_tags }}

フィールド--field-admin-tags.html.twig

<ul{{ attributes }}>
  {% for item in items %}
    <li>{{ item.content }}</li>
  {% endfor %}
</ul>

この例はに置き換え<div>られ<ul>ます。{{ attributes }}フィールドテンプレートを削除したりバイパスしたりしないでください。「クイック編集を中断できるもの」および「修正方法」を参照してください


これは親テンプレートから呼び出されます{{ content.field_admin_tags }}
-aydow

23

4k4に同意すると、フィールドテンプレートが最適な場所になります。エンティティテンプレート(ノードなど)で本当に必要な場合は、次のようなことができます。

{% for key, item in content.field_tags if key|first != '#' %}
  <div class="item-{{ key + 1 }}">{{ item }}</div>
{% endfor %}

しかし、正直なところ、少し見苦しいと思います。フィールドテンプレートが適切な場所です。


1
同意した、それは少しいです。;)しかし、コードスニペットをありがとう。
AngularChef

さまざまな種類の
エンティティ

11

私のように、ノードの小枝テンプレート上の段落を反復する方法を探している場合、その方法を次に示します。

複数値の段落フィールドを持つノードがあり、コンテンツエディターが複数の段落を作成でき、ノード小枝テンプレートの各段落を反復処理するとします(たとえば、各段落の周りにラッパーを追加する)。

{% for key,value in node.my_paragraph_field.value %}
    {{ content.my_paragraph_field[key] }}
{% endfor %}

更新:コンテンツを使用せずにすべての段落を印刷する別の方法を見つける必要がありました。コンテンツ変数には、ノードの「表示の管理」セクションで設定したすべてが含まれますが、実際のノードTwigファイル内のすべてのデータにアクセスできるため、「表示の管理」もレイアウトも使用しません。画像スタイルを適用したり、日付形式を設定したりするなど、「ディスプレイの管理」で行う設定は、...小枝で直接行うことができます。

私にとって、これは利点です。表示されるものはすべてtwigファイルに由来するものであり、クラスをどこかに追加する可能性のある不明瞭なフィールド設定を探す必要がないからです。したがって、私が見るすべてのものは、1つの場所(ノードの小枝ファイル)からのものであり、小枝ファイルと管理画面の組み合わせではありません。

とにかく、素晴らしいTwig Tweakモジュールを使用して、コンテンツ変数を使用せずにノードの小枝ファイルに複数値の段落フィールドを印刷する方法を次に示します。

{% for item in node.field_paragraphs %}
    {{ drupal_entity('paragraph', item.target_id) }}
{% endfor %}

1

#itemsTwigで長さが不明なループを構築するときに、このプロパティが役立つことがわかりました。

print number of values within field:
{{ content.field_admin_tags['#items']|length }}

---

{# remember length in variable (minus 1 because it starts from 0): #}
{% set numTagsIndex = content.field_admin_tags['#items']|length - 1 %}

{# loop until the max value is reached: #}
{% for i in 0..numTagsIndex %}
  {{ content.field_admin_tags[i] }}
{% endfor %}

0

段落フィールド内のフィールドの周りに追加のラッパーを配置したい場合、または何らかの理由で特定の段落参照フィールド値が必要な場合は、次のことができます。

{% for key,value in node.paragraph_field_name.value %}

<div class="example-wrapper">
{{ content.paragraph_field_name[key]['#paragraph'].field_content.value }}
</div>

{% endfor %}

を実行する{{kint(content.paragraph_field_name[key])}}と、配列の['#paragraph']部分内でフィールドにアクセスできることがわかります。

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