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

Drupal7转Drupal8:Twig实体字段类型转换与条件判断失效问题

解决Drupal 8模板中实体字段值比较的问题

嘿,我明白你在Drupal 7迁移到Drupal 8时遇到的这个字段值比较的坑了!问题出在content['field_tipo'][0]并不是你看到的纯数值5,它本质上是Drupal的渲染数组元素,是一个包含字段渲染信息的对象/数组,所以直接用==和整数5比较肯定会失败,哪怕它输出显示是5。

下面给你几个靠谱的解决方法,按推荐程度排序:

方法1:直接访问节点字段的原始值(最推荐)

在Drupal的节点模板里,默认可以直接拿到node对象,通过它能直接获取字段的原始值,这个值是纯数据类型(整数/字符串),可以直接用来比较。

把你Twig里的判断条件改成这样:

{% elseif node.field_tipo.value == 5 %}

如果你的field_tipo是整数类型字段,node.field_tipo.value就是标准的int类型,和5比较完全没问题。

方法2:用Twig过滤器转换类型(应急方案)

如果因为某些原因你没法直接用node对象,也可以把渲染出来的内容先转成字符串再转成整数,用Twig的过滤器实现:

{% elseif content['field_tipo'][0]|trim|int == 5 %}
  • trim用来去掉可能存在的空格或换行
  • int把字符串转成整数类型

不过这个方法不如第一种靠谱,因为如果字段渲染输出里包含额外的HTML标记,转换就会出错,所以优先用方法1。

方法3:在预处理函数里提前处理字段值

如果你的模板逻辑比较复杂,或者需要在多个地方用到这个字段值,推荐在主题的预处理函数里把字段值提取成单独的模板变量:

  1. 打开你的主题.theme文件(比如mytheme.theme),添加以下代码:
function mytheme_preprocess_node(&$variables) {
  // 确保字段存在且有值
  if (isset($variables['node']->field_tipo) && !$variables['node']->field_tipo->isEmpty()) {
    // 把字段值转成整数并存入新变量
    $variables['tipo_id'] = (int) $variables['node']->field_tipo->value;
  }
}
  1. 然后在Twig模板里直接用这个新变量比较:
{% elseif tipo_id == 5 %}

这样不仅让模板代码更干净,也避免了重复处理字段值的问题。

最后再提醒你一下:Drupal 8+里的content数组是专门用来渲染内容的,里面的元素都是渲染数组,不要用来做数据比较,数据比较应该用node对象里的原始字段值,这是Drupal 8模板开发的最佳实践哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:18:36