web-dev-qa-db-ja.com

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

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

私は思うレンダー配列のキー/値を反復処理している vsフィールド内の項目(各ループで「X」を出力すると、Xが20になるが、2つしかないまたはこのフィールドの3つの値)。

content.field_admin_tags.0content.field_admin_tags.1などを繰り返し処理したい.

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

24
AngularChef

これはフィールドの小枝で修正できます。そこで、既存のループを使用してフィールド項目を反復できます。

node.html.twig

{{ content.field_admin_tags }}

field--field-admin-tags.html.twig

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

この例は<div><ul>。削除しないでください{{ attributes }}またはフィールドテンプレートをバイパスします。 を参照してください。クイックエディットを中断できる原因とその修正方法を教えてください。

16
4k4

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

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

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

24
Jeff Burnz

私のように、ノードのtwigテンプレートの段落を繰り返し処理する方法を探している場合、その方法は次のとおりです。

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

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

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

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

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

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

@ chris-ruppelの回答に似た方法を見つけましたが、少しエレガントなIMHOです。 keysフィルターを使用して、使用可能なインデックスの配列を取得します。 HTMLリストを作成するために使用します。

<ul>
  {% for i in content.field_foo['#items']|keys %}
    <li>{{ content.field_foo[i] }}</li>
  {% endfor %}
</ul>
2
marcvangend

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

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 %}
1
Chris Ruppel

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

_{% 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']部分内でフィールドにアクセスできることがわかります。

0