遍历Twig模板中的多值内容字段


23

我需要控制模板中field_admin_tags字段的呈现node.html.twig

这项工作:

  • {{ content.field_admin_tags }} —渲染所有内容(标签+所有字段值)
  • {{ content.field_admin_tags.0 }} —仅呈现字段中的第一个值,不呈现标签

问题:我无法控制标签周围的标记,例如<ul><li>...</li></ul>

所以我的想法是遍历render数组

但这不起作用:

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

我得到:Exception: Object of type Drupal\node\Entity\Node cannot be printed

我想我正在遍历render数组的键/值与字段中的项(如果我在每个循环中打印出“ X”,我将得到20个X,而在该字段中我只有两个或三个值) 。

我想遍历content.field_admin_tags.0content.field_admin_tags.1等等。

任何想法如何解决这个问题?谢谢。


Answers:


15

您可以在野外树枝中解决此问题。在那里,您可以使用现有循环遍历字段项:

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 }}或绕过字段模板,请参阅 什么会破坏quickedit,以及如何解决它?


这是从父模板中调用的{{ 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 '16

与不同类型的实体完美搭配
Christophe CARON

11

如果您像我一样,正在寻找一种方法来遍历节点的树枝模板上的段落,请按以下步骤操作:

假设您有一个带有多值段落字段的节点,那么内容编辑器可以创建多个段落,并且您希望遍历节点树枝模板上的每个段落(例如,在每个段落周围添加包装器):

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

更新:我需要找到另一种不使用内容即可打印所有段落的方法。content变量包含您在节点的“管理显示”部分中设置的所有内容,但是我当前的工作方法是从不使用“管理显示”或布局,因为您实际上可以访问节点树枝文件中的所有数据,以及几乎所有您可以在“管理显示”上执行的设置(例如应用图片样式或设置日期格式)...可以直接在树枝中执行。

对我来说,这是一个优势,因为我知道我看到的所有内容都来自树枝文件,并且我不需要寻找一些晦涩的字段设置,这些设置可能会在某些地方添加类。因此,我看到的所有内容仅来自一个位置(节点树枝文件),而不是树枝文件和管理显示屏的组合。

无论如何,使用令人敬畏的Twig Tweak模块,以下是如何在节点的twig文件中打印多值段落字段而无需使用content变量的方法:

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

1

我发现#items在Twig中构建长度未知的循环时,该属性很有用:

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']部分内部可以访问这些字段。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.