Twig视图模板中如何访问行内容类型实现IF条件判断
代码失效的核心原因
你的判断逻辑无法生效,本质是两个关键使用错误:
- 错误调用了PHP内置函数
gettype()作为实体方法:这个函数的作用是返回变量本身的PHP数据类型(比如"string"、"array"),和Drupal的内容类型获取逻辑完全无关,导致条件判断永远无法匹配到预期值,自然走不到渲染内容的分支。 - 在Drupal系统中,所有内容实体(节点、分类术语、媒体等)获取所属内容类型的机器名,需要调用实体自带的
bundle()方法,不能混用PHP内置函数。
可直接运行的正确代码
{% for row in rows %} {# 安全获取行对应的实体对象,避免实体缺失时抛出语法错误 #} {% set row_entity = row._entity ?? null %} {% if row_entity and row_entity.bundle() == 'warnings' %} {{ row.content }} {% else %} Nothing {% endif %} {# 调试用代码,上线前请删除 #} {{ kint(row) }} {% endfor %}
场景适配与排查指南
如果调整完代码仍然不生效,按以下顺序逐点核对:
- 确认视图配置的变量暴露:如果你的视图采用「字段模式」而非「实体渲染模式」,默认不会把行对应的完整实体对象暴露到模板变量中。需要进入视图配置页,找到「高级」板块下的「其他-可用变量」选项,勾选「行实体(Row entity)」,否则模板中获取到的
row._entity会是空值,判断逻辑自然失效。 - 核对内容类型机器名的准确性:可以临时在模板中打印实际取值
{{ kint(row._entity.bundle()) }},确认输出的字符串和你判断语句里的warnings在拼写、大小写上完全一致,避免因为拼写偏差(比如漏写s、大小写不匹配)导致匹配失败。 - 冗余语法说明:你之前写循环时定义了
key变量但全程没有使用,这个写法不影响代码运行,但属于冗余语法,不需要在不需要索引的场景下特意声明。 - 写法兼容性说明:Drupal的Twig运行环境对实体的get类方法做了魔术映射,
bundle()方法也可以直接用属性形式row._entity.bundle取值,但为了适配不同类型的实体对象、减少环境依赖问题,更推荐显式调用方法的写法。
内容的提问来源于stack exchange,提问作者IDI
相关产品推荐
相关产品推荐

