通过Twig模板中的多个值内容字段迭代 -- theming 领域 和 8 领域 drupal 相关 的问题

Iterate through multiple value content field in Twig template


25
vote

问题

中文

我需要控制 node.html.twig中 99887661 字段的渲染模板。

此工作:

  • {{ 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 odeEntityNode cannot be printed

我认为我迭代渲染阵列 vs字段内的项目的键/值(如果我在每个循环中打印出一个"x" ,我会得到20 x该字段中只有两个或三个值)。

我想迭代 content.field_admin_tags.0 99877669 等。

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

英文原文

I need to take control over the rendering of a field_admin_tags field in a node.html.twig template.

This WORKS:

  • {{ content.field_admin_tags }} xe2x80x94 Renders everything (label + all field values)
  • {{ content.field_admin_tags.0 }} xe2x80x94 Renders only the first value in the field, and no label

PROBLEM: I have no control over the markup surrounding the tags, e.g. <ul><li>...</li></ul>.

So my idea was to iterate over the render array.

But that DOES NOT work:

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

I get: Exception: Object of type Drupal\node\Entity\Node cannot be printed.

I think I'm iterating over the keys/values of the render array vs the items inside the field (if I print out an "X" in each loop, I get 20 X's while I only have two or three values in this field).

I'd like to iterate over content.field_admin_tags.0, content.field_admin_tags.1, etc.

Any idea how to fix this? Thanks.

     
 
 

回答列表

19
 
vote
vote
最佳答案
 

您可以将其固定在字段中。在那里,您可以使用现有循环来迭代现场项目:

node.html.twig

  {{ content.field_admin_tags }}   

字段 - field-admin-tags.html.twig

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

此示例将 99887664 替换为 <ul> 。不要删除 {{ attributes }} 或绕过字段模板,请参阅可以打破quickedit的东西,以及如何解决它?

 

You can fix this in a field twig. There you can use the existing loop to iterate over the field items:

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> 

This example replaces <div> with <ul>. Don't remove {{ attributes }} or bypass the field template, see What can break quickedit, and how do I fix it?

 
 
 
 
28
 
vote

同意4k4字段模板是最好的地方,如果你真的想要它在实体模板中(例如节点)你可以做到这样的事情:

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

但诚实地,我认为它有点难看,现场模板是正确的地方。

 

Agree with 4k4 the field template is the best place, if you really want it in the entity template (e.g. node) you can do something like this:

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

But honestly I think it's a bit ugly, the field template is the right place.

 
 
   
   
15
 
vote

如果像我一样,正在寻找一种方法来迭代节点的Twig模板上的段落,这里是如何做到的:

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

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

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

对我来说,这是一个优势,因为我知道我看到的一切来自枝杈文件,我不需要查找一些可以在某处添加类的模糊字段设置。所以我看到的一切都来自一个地方(节点枝条文件),而不是枝条文件和管理显示屏幕的组合。

无论如何,使用令人敬畏的Twig调整模块,这里是如何在节点的枝条文件中打印多值段落字段,而无需使用内容变量:
  {% for item in node.field_paragraphs %}     {{ drupal_entity('paragraph', item.target_id) }} {% endfor %}   
 

If you, like me, are looking for a way to iterate through paragraphs on a node's twig template, here is how to do it:

Suppose you have a node with a multivalued paragraph field, so a content editor can create multiple paragraphs and you wish to iterate through each paragraph on the nodes twig template (for example to add a wrapper around each paragraph):

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

UPDATE: I needed to find another way to print all paragraphs without using content. The content variable contains everything you set up in the 'Manage display' section of the node, but my current work method is to never use 'Manage display' nor layouts since you can actually access all data in the node twig file, and almost all settings you would do on 'Manage display', like applying an image style, or setting a date format, ... you can do directly in twig.

For me this is an advantage because I know that everything I see comes from the twig file, and I do not need to look for some obscure field settings that may add classes somewhere. So everything I see comes from just one place (the nodes twig file) and not a combination of the twig file and the manage display screen.

Anyway, using the awesome Twig Tweak module, here is how to print a multi value paragraph field in a node's twig file without having to use the content variable:

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

我找到了一种类似于@ chris-ruppel的答案的方法,但有点优雅的恕我直言。它使用 ... $t_alias = $query->join('taxonomy_term_data', 't', 'r.tid = t.tid'); $v_alias = $query->join('taxonomy_vocabulary', 'v', 't.vid = v.vid'); $query->fields( $t_alias ); $query->condition("r.nid", $node->nid); $query->condition("v.vid", 2); $query->orderBy('v.weight'); $query->orderBy('t.weight'); $query->orderBy('t.name'); $result = $query->execute(); $terms[$node->vid][$key] = array(); ... 0 过滤器获取可用索引数组。我用它来构建一个HTML列表。

  ... $t_alias = $query->join('taxonomy_term_data', 't', 'r.tid = t.tid'); $v_alias = $query->join('taxonomy_vocabulary', 'v', 't.vid = v.vid'); $query->fields( $t_alias ); $query->condition("r.nid", $node->nid); $query->condition("v.vid", 2); $query->orderBy('v.weight'); $query->orderBy('t.weight'); $query->orderBy('t.name'); $result = $query->execute(); $terms[$node->vid][$key] = array(); ... 1  
 

I found a method that is similar to the answer by @chris-ruppel, but a bit more elegant IMHO. It uses the keys filter to get an array of available indexes. I use it to build an HTML list.

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

我发现 ... $t_alias = $query->join('taxonomy_term_data', 't', 'r.tid = t.tid'); $v_alias = $query->join('taxonomy_vocabulary', 'v', 't.vid = v.vid'); $query->fields( $t_alias ); $query->condition("r.nid", $node->nid); $query->condition("v.vid", 2); $query->orderBy('v.weight'); $query->orderBy('t.weight'); $query->orderBy('t.name'); $result = $query->execute(); $terms[$node->vid][$key] = array(); ... 2 属性在树枝中构建未知长度的循环时很有用:

  ... $t_alias = $query->join('taxonomy_term_data', 't', 'r.tid = t.tid'); $v_alias = $query->join('taxonomy_vocabulary', 'v', 't.vid = v.vid'); $query->fields( $t_alias ); $query->condition("r.nid", $node->nid); $query->condition("v.vid", 2); $query->orderBy('v.weight'); $query->orderBy('t.weight'); $query->orderBy('t.name'); $result = $query->execute(); $terms[$node->vid][$key] = array(); ... 3  
 

I have found the #items property to be useful when building loops of unknown length in 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 %} 
 
 
1
 
vote

如果要在段落字段中的字段周围放置其他包装,或者需要某种原因是特定段落参考字段值,可以执行以下操作:

  ... $t_alias = $query->join('taxonomy_term_data', 't', 'r.tid = t.tid'); $v_alias = $query->join('taxonomy_vocabulary', 'v', 't.vid = v.vid'); $query->fields( $t_alias ); $query->condition("r.nid", $node->nid); $query->condition("v.vid", 2); $query->orderBy('v.weight'); $query->orderBy('t.weight'); $query->orderBy('t.name'); $result = $query->execute(); $terms[$node->vid][$key] = array(); ... 4  

通过执行 ... $t_alias = $query->join('taxonomy_term_data', 't', 'r.tid = t.tid'); $v_alias = $query->join('taxonomy_vocabulary', 'v', 't.vid = v.vid'); $query->fields( $t_alias ); $query->condition("r.nid", $node->nid); $query->condition("v.vid", 2); $query->orderBy('v.weight'); $query->orderBy('t.weight'); $query->orderBy('t.name'); $result = $query->execute(); $terms[$node->vid][$key] = array(); ... 5 ,您将看到该字段可以在数组的['#paragraph']部分内部访问。

 

If you want to place additional wrappers around the fields inside the paragraph field or need for some reason a particular paragraph reference field value, you can do the following:

{% for key,value in node.paragraph_field_name.value %}  <div class="example-wrapper"> {{ content.paragraph_field_name[key]['#paragraph'].field_content.value }} </div>  {% endfor %} 

By doing {{kint(content.paragraph_field_name[key])}}, you'll see that the fields are accessible inside the ['#paragraph'] part of the array.

 
 
1
 
vote

我需要在树枝中迭代多个字段,我所做的是将值添加到它。

 content.field_admin_tags%} {%for tag.field_admin_tags%}   {{tag **。值**}} {%endfor%} 

这对我有用。

 

I needed to iterate a multiple field in twig, what I did was add the value to it.

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

This worked for me.

 
 
1
 
vote

以下也有效

  ... $t_alias = $query->join('taxonomy_term_data', 't', 'r.tid = t.tid'); $v_alias = $query->join('taxonomy_vocabulary', 'v', 't.vid = v.vid'); $query->fields( $t_alias ); $query->condition("r.nid", $node->nid); $query->condition("v.vid", 2); $query->orderBy('v.weight'); $query->orderBy('t.weight'); $query->orderBy('t.name'); $result = $query->execute(); $terms[$node->vid][$key] = array(); ... 6  
 

The below also works

{% for tag in node.field_tag %}    {{ tag.entity.name.value }} {% endfor %} 
 
 
     
     

相关问题

6  如何为视图创建自定义模板? [关闭]  ( How do i create a custom template for view ) 
关闭。这个问题需要详细信息或清晰度。它目前不接受答案。 想要改进这个问题?添加详细信息并阐明编辑此帖的问题。 关闭 4年前。 ...

0  自定义区域不呈现相同的位置  ( Custom region doesnt render at the same position ) 
我在我的主题中创建了一个只包含菜单的区域。每个菜单都有自己的可见设置。例如,我的主菜单到处都是可见的,除了/博客/ *和我的博客菜单仅在/博客/ *。我用它作为我的主导航条区域。 我的问题是我在我的 admin/config/people/MY_MODULE0 中致电这个区域 admin/config/peopl...

5  如何在不使用CDN的情况下保持我的引导子主题?  ( How to keep my bootstrap sub theme without using the cdn ) 
我创建了CDN的子主题引导版本。 i基于"期刊" 版本"3.3.6" ,我用900行个性化我的style.css文件。 https://bootswatch.com/ 我不再希望使用CDN,但我喜欢保留我当前的主题"期刊" 和我的自定义样式表。 如何在不使用"少" 的情况下呢? 我想要的是使用css ...

0  如何创建显示Profile2类型的某些字段的模块?  ( How to create a module that shows some fields of profile2 type ) 
我想创建一个模块,显示 profile2 <?php function profile_header_block_info() { return array( 'profile_header' => array( 'info' => 'profile stores header',...

0  是否可以使用实体元包装添加ClassName以呈现节点标题数组?  ( Is it possible to add classname to render array of node title using entity meta ) 
我想知道如何通过更改渲染阵列将类名添加到节点标题。我检查了包装物对象 $wrapper = entity_metadata_wrapper('node', $nid) 通过使用 dpm($wrapper->getPropertyInfo()) 和 debug($wrapper) 但没有...

2  更改模板是否登录用户或未关闭]  ( Alter a template whether a user is logged in or not ) 
此问题似乎在帮助中心中定义的范围内涉及Drupal。。 想要改进这个问题?更新问题,所以它是关于drupal答案的主题。 ...

2  主题开发人员模块启用时崩溃整个站点,如何修复?  ( Theme developer module crashes the whole site when enabled how to fix ) 
我正在使用干净的drupal 7.x安装,下载主题开发人员它的依赖模块 simplehtmldom api 使用疏水机使用rush。 我发现Simplehtmldom 7.x-2.x不兼容;所以我删除了它,并使用疏水安装7.x-1.12版本,使能它,启用主题开发人员模块可启用。现在该网站不再工作了。 我所看到的只是...

7  如何在RTL语言中加载RTL样式  ( How to load rtl style in rtl language ) 
我有一个多语言网站,一种语言是一个RTL语言,在Drupal 7中,我将我的CSS放入 style.css 和RTL CSS中到 style-rtl.css 以及默认的drupal也加载Style-rtl.css文件,现在在drupal 8中,我有一个多语言主题,如何在rtl语言中讲述drupal加载我的rtl样式?...

0  使用打印模块可打印模板  ( Printable templates for views using print module ) 
任何视图相关报告都可以使用在启用时打印模块。这可以通过简单地使用/打印/视图 - URL来实现。它使用标准print.tpl.php。 我不希望打印版本的视图输出以显示公开的过滤器。同时,我不想修改默认print.tpl.php。 是否有一种方法可以在与内容类型的同一行中使用替代打印模板:打印[ - html |...

4  记录在用户的用户名中作为Twig变量  ( Get logged in users username as twig variable ) 
有没有办法将当前登录的用户的用户名作为用于任何曲线模板的变量? ...

0  将字符串翻译为Twig的宏  ( Translate string passed to twigs macro ) 
twig会提供可用的方式转换到宏的字符串吗?我以为它将以类似的方式与WordPress翻译功能类似的方式,而不是字符串我只是提供变量。但它不起作用。 这是我的宏: {% macro input(type, name, placeholder, value, class) %} <input type="{{ t...

1  显示套件:编辑标签缺失用户配置文件  ( Display suite edit tab missing on user profile ) 
使用显示套件(ds),我已经覆盖了 user profile page 以创建自定义布局。但是,通常会在用户登录时显示的编辑选项卡不再可见。如何将它们添加回来? 我不确定它是否是一个因素,但我也在DS中使用定制的面板模板。由于我仅在用户配置文件上使用此布局,因此我可以打开,直接将编辑选项卡添加到模板,如果可能的话。 ...

0  是否有可能在树枝模板中包含外部库?  ( Is it possible to include external libraries in a twig template ) 
我想我知道答案,因为我试图附上这样的外部库: <select>2 这没有附加所需的库,我缺少某些东西,或者这是一个非启动器吗? ...

2  用树枝“挖掘”  ( Digging deeper with twig ) 
我创建了一个自定义枝条文件,输出一些基本字段,例如图像和文本。这就是我的枝条文件的样子: <div class="image"> {{content.field_image}} </div> <div class="year"> {{content.field_year}} </div> <d...

0  我在哪里可以为我的主题施加助手函数?  ( Where can i put helper functions for my theme ) 
我写了很少的帮助函数,现在我想在某处添加这些函数,这样我就可以从任何模板文件调用它们。 我应该把它们放在哪里? ...

2  如何从登陆页面删除前标并登录主页?  ( How to remove front tag from landing page and logged in home page ) 
我在生产环境中有D7网站。在登录页面上并登录页面,我看到页眉标题"前端| xxxxxxxxxx" 。基本上xxxxxx是门户名称。我想从标题中删除前关节,并仅显示xxxxxxxxx。 我尝试过几个选项 - 使用在goodnex_preprocess_page()中处理template.php - 使用hook_i...

1  在贡献模块中使用覆盖主题表函数?  ( Override theme table function used in contributed module ) 
在 ubercart 模块中使用函数: function theme_uc_recurring_user_table($variables) { ........ } 我想覆盖这个函数的结果,并在 template.php 文件的下面的方法中做了以下方法: function MYTHEME_pr...

3  替换模式在视图现场模板中  ( Replacement pattern in view field template ) 
我有一个主体字段视图模板: <front>3 我想要的是: <front>4 我们如何这样做? note :我已经使用了视图模块,但无法弄清楚如何应用此命令的nid。 ...

2  禁用一个JS文件/库的缓存  ( Disable cache for one js file library ) 
我正在使用drupal 8.1.7并使用组模块。当用户显示组或链接到组的文章(/组/ ...或节点/ ...)时,我想为每个组指定一些特定的CSS。 我开发了执行技巧的模块(验证我们是否显示组或文章,获取组并加载修改页面CSS样式的JS文件)。在我的dev drupal上工作没有缓存,但是当我用缓存活动测试生产模块时...

1  自定义主题:如何在同一页面中列出多种内容类型并使用区域  ( Custom theming how to list multiple content types in the same page and use regi ) 
我创建了两个内容类型:文章和新闻稿,我想在同一页面上显示这些。我也在开发自定义主题。 所以我创建了一个与机器名称 99887660 的视图,为它创建了一个模板: views-view--press-release-list.html.twig ,它完美地工作。 问题是,我无法利用地区。我的意思是,我有 conten...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.