如何在Twig页面模板中访问视图字段并实现自定义字段输出与循环渲染
解决Drupal页面模板中自定义视图字段渲染的问题
嘿,我来帮你搞定这个需求!首先得明确一点:虽然你想用page--my--view.html.twig这个页面模板来实现,但其实Drupal里视图有自己专用的模板,不过既然你指定要用页面模板,那咱们就按你的需求来。
核心思路
要在页面模板里循环打印所有标题和body,你需要先加载并执行目标视图,然后遍历它的结果行,手动渲染每个字段的自定义结构。
具体实现代码
把你的page--my--view.html.twig替换成下面的内容(记得替换里面的视图机器名和显示名):
{# 加载并执行你的视图:把'my_view'换成你实际的视图机器名,'page_1'换成视图的显示机器名(比如默认的page_1) #} {% set view = views.view.my_view %} {% do view.setDisplay('page_1') %} {% do view.execute() %} {# 检查视图是否有数据 #} {% if view.result is not empty %} <div class="custom-view-container"> {# 循环遍历视图的每一条结果 #} {% for row in view.result %} {# 获取当前行对应的节点实体(如果你的视图基于节点的话) #} {% set node = row.entity %} {# 确保当前用户有权限查看这个节点 #} {% if node.access('view') %} <article class="custom-view-item"> {# 自定义标题:带自定义类和节点链接 #} <h3 class="title"> <a href="{{ node.url() }}">{{ node.title.value }}</a> </h3> {# 自定义body字段:带自定义类 #} <div class="body-content"> {{ node.body.value|raw }} </div> </article> {% endif %} {% endfor %} </div> {% endif %} {# 可选:如果你还想保留原来的视图默认输出,就保留这段;不需要的话可以删掉 #} {% if page.content %} {{ page.content }} {% endif %}
关键细节说明
- 视图机器名和显示名:你得去视图编辑页面确认你的视图机器名(比如创建视图时的机器名),还有显示的机器名(默认是
page_1,如果是块显示就是block_1),别填错了。 - 实体访问权限:加上
node.access('view')是为了避免用户看到他们没有权限访问的内容,这是Drupal的安全最佳实践。 - 字段渲染:用
node.title.value直接获取标题的原始值,比处理fields.title.content更可靠;node.body.value|raw是因为body字段存的是HTML,用raw才能正确渲染格式,不然会被转义成纯文本。 - 缓存提示:直接在页面模板里执行视图可能会影响缓存性能,如果你追求最佳实践,其实更推荐用视图的专用模板(比如
views-view-unformatted--my-view--page-1.html.twig),不过既然你指定了页面模板,上面的代码完全能满足需求。
如果你的视图不是基于节点的(比如分类术语、自定义实体),只需要把row.entity对应的字段替换成对应实体的字段就行,比如分类术语的话用row.entity.name.value获取名称。
内容的提问来源于stack exchange,提问作者Jiah
相关产品推荐
相关产品推荐

