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

如何在Drupal 8的views-view.html.twig中获取内容类型机器名

在Drupal 8的views-view模板中获取内容类型机器名

我来帮你搞定这个问题,在views-view--myview.html.twig模板里获取视图显示的内容类型机器名,完全不用跑到views-view-fields模板里处理,这里有两种实用的方法:

方法一:从视图结果行的实体中提取

如果你的视图是直接显示内容实体(比如节点),每个结果行里都包含对应的实体对象,你可以从第一个行里提取内容类型机器名:

{# 先确认视图有结果行 #}
{% if rows is not empty %}
  {# 获取第一个行对应的实体对象 #}
  {% set node_entity = rows[0]['#row']._entity %}
  {# 拿到内容类型机器名 #}
  {% set content_type_machine_name = node_entity.bundle.value %}
  
  {# 现在就可以用这个变量来过滤自定义菜单项了 #}
  {% if content_type_machine_name == 'article' %}
    {# 显示文章对应的菜单项 #}
  {% elseif content_type_machine_name == 'page' %}
    {# 显示页面对应的菜单项 #}
  {% endif %}
{% endif %}

为什么xdebug没拿到? 大概率是你没找对属性路径——实体是存在rows[0]['#row']._entity里的,直接访问这个对象才能拿到bundle属性(也就是内容类型机器名)。

方法二:从视图的过滤器配置中提取(更稳妥)

如果你的视图是通过「内容类型」过滤器来限定显示内容,那直接从视图配置里提取过滤的内容类型机器名会更靠谱,哪怕视图没有返回结果(比如空视图)也能拿到正确的值:

{% set target_content_types = [] %}
{# 遍历视图的所有过滤器 #}
{% for filter_id, filter in view.display_handler.getHandlers('filter') %}
  {# 找到内容类型对应的过滤器(字段名是'type') #}
  {% if filter.field == 'type' %}
    {# 获取过滤器设置的内容类型值,可能是单个字符串或数组 #}
    {% set target_content_types = filter.value %}
    {% break %}
  {% endif %}
{% endfor %}

{# 处理结果:如果是数组取第一个,否则直接用 #}
{% set content_type_machine_name = target_content_types is iterable ? target_content_types[0] : target_content_types %}

{# 用这个变量过滤菜单项 #}
{% if content_type_machine_name %}
  {# 根据内容类型显示对应菜单项 #}
{% endif %}

这个方法的优势在于,它直接读取视图的配置规则,不管视图有没有内容,都能准确拿到你要显示的内容类型机器名。

注意事项

  • 如果你的视图允许显示多种内容类型,方法一只能拿到第一个结果行的类型,这时候方法二更适合,因为它能获取所有被过滤的内容类型。
  • 要确保视图确实添加了「内容类型」过滤器,不然方法二找不到对应的过滤规则。
  • 如果视图是通过关系或其他复杂方式显示内容,可能_entity的路径会有变化,这时候可以用xdebug查看rows[0]['#row']的结构,找到实体对象的正确位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:58:38