如何从Views视图模板向Node节点模板传递行索引变量?
解决Drupal Views行索引与引用实体访问的两难问题
我之前在Drupal里做Views定制的时候刚好碰到过一模一样的问题,给你几个实用的解决办法:
方案一:用「显示节点」格式,通过模板传递行索引
既然你已经在使用views-view-unformatted.html.twig,可以直接在这个模板里把行索引传递给node模板:
- 打开你的
views-view-unformatted.html.twig,修改行遍历的代码:
{% for row in rows %} {# 把当前循环的索引(从0开始)合并到row的内容变量里 #} {% set row_content = row.content|merge({'#row_index': loop.index0}) %} {{ row_content }} {% endfor %}
如果需要从1开始计数,就用loop.index代替loop.index0。
- 然后在你的
node--view.html.twig(或者对应内容类型的node模板,比如node--article--my-view.html.twig)里,就能直接拿到行索引了:
{# 输出行索引 #} <div class="row-index">第{{ row_index + 1 }}行</div> {# 同时依然可以正常访问引用实体的字段 #} {% if content.field_reference %} <div class="ref-field">{{ content.field_reference.entity.field_title.value }}</div> {% endif %}
方案二:用「显示字段」格式,通过Views关系加载引用实体字段
如果你更习惯用「显示字段」格式的行计数功能,可以通过Views的关系来解决引用实体字段的访问问题:
- 编辑你的视图,在「高级」选项里添加关系:选择你的实体引用字段(比如「内容: 我的引用字段」),按需勾选「要求此关系」(如果所有节点都有这个引用的话)。
- 添加完关系后,回到「字段」选项,就能找到引用实体的所有字段了(会带有关系的前缀),把需要的字段添加到视图中。
- 这时候你既可以用「全局: 视图结果计数」来获取行索引,又能直接在字段模板或者
views-view-unformatted.html.twig里访问引用实体的字段值,完全不需要绕路。
方案三:用预处理函数传递行索引(代码进阶版)
如果不想修改太多模板,可以通过主题或模块的预处理函数来传递变量:
在你的主题.theme文件或者自定义模块的.module文件里添加以下代码:
function my_custom_theme_preprocess_node(&$variables) { // 检查当前节点是否正在Views中被渲染 if (isset($variables['view']) && $variables['view'] instanceof \Drupal\views\ViewExecutable) { // 获取当前行的索引 $variables['row_index'] = $variables['view']->row_index; } }
这样在你的node模板里就能直接使用row_index变量,同时完全不影响引用实体字段的正常访问。
这三个方案都能解决你的两难问题,推荐优先试试方案一或方案二,根据你的使用习惯来选就行。
内容的提问来源于stack exchange,提问作者Chris Howell
相关产品推荐
相关产品推荐

