如何在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
相关产品推荐
相关产品推荐

