You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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 %}

关键细节说明

  1. 视图机器名和显示名:你得去视图编辑页面确认你的视图机器名(比如创建视图时的机器名),还有显示的机器名(默认是page_1,如果是块显示就是block_1),别填错了。
  2. 实体访问权限:加上node.access('view')是为了避免用户看到他们没有权限访问的内容,这是Drupal的安全最佳实践。
  3. 字段渲染:用node.title.value直接获取标题的原始值,比处理fields.title.content更可靠;node.body.value|raw是因为body字段存的是HTML,用raw才能正确渲染格式,不然会被转义成纯文本。
  4. 缓存提示:直接在页面模板里执行视图可能会影响缓存性能,如果你追求最佳实践,其实更推荐用视图的专用模板(比如views-view-unformatted--my-view--page-1.html.twig),不过既然你指定了页面模板,上面的代码完全能满足需求。

如果你的视图不是基于节点的(比如分类术语、自定义实体),只需要把row.entity对应的字段替换成对应实体的字段就行,比如分类术语的话用row.entity.name.value获取名称。

内容的提问来源于stack exchange,提问作者Jiah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 04:07:38