logo

额外区块类型 (EBT) - 全新的布局构建器体验❗

额外区块类型 (EBT) - 样式化、可定制的区块类型:幻灯片、标签页、卡片、手风琴等更多类型。内置背景、DOM Box、JavaScript 插件的设置。立即体验布局构建的未来。

演示 EBT 模块 下载 EBT 模块

❗额外段落类型 (EPT) - 全新的 Paragraphs 体验

额外段落类型 (EPT) - 类似的基于 Paragraph 的模块集合。

演示 EPT 模块 滚动

滚动

过滤器 —— 在 Twig 模板中修改变量

02/10/2025, by Ivan

Twig 中的过滤器可用于修改变量。过滤器通过管道符号分隔。它们可以带有括号中的可选参数。多个过滤器可以链式使用,一个过滤器的输出会传递给下一个。

示例:

{{ content|safe_join(", ")|lower }}

有时你需要在过滤之前先渲染元素:

{{ item|render|filter }}

Twig 自带了许多内置过滤器,你可以在其 官方文档 中查看。Drupal 也有许多自己的过滤器。

Drupal 专用过滤器

它们在 TwigExtension::getFilters() 中定义。

翻译过滤器

trans
这个过滤器(也可以写作 t)会将变量传递给 Drupal 的 t() 函数,从而返回翻译后的字符串。对于手动放在模板中、会显示给用户的界面字符串,必须使用该过滤器。

示例:

<a href="{{ url('<front>') }}" title="{{ 'Home'|t }}" rel="home" class="site-logo"></a>

placeholder
该过滤器会对内容进行 HTML 转义,并使用 drupal_placeholder() 格式化,从而允许显示高亮文本。

示例:

{% trans %}Submitted on {{ date|placeholder }}{% endtrans %}

不安全的翻译
某些写法不安全,不应使用,因为它们直接将变量传递给翻译。这不仅会增加翻译字符串列表,还可能带来安全漏洞,尤其是变量来自用户输入时。以下是错误示例:

{# 不要这样写 #}
{{ var1|t }}
{{ var1|placeholder }}
{% trans %}{{ var1 }}{% endtrans %}

其他过滤器

clean_class
将字符串处理为合法的 HTML 类名。参考 Html::getClass()

clean_id
将字符串处理为合法的 HTML ID。参考 Html::getID()

format_date
将时间戳转换为格式化日期字符串。参考 DateFormatter::format()

raw
应尽量避免使用该过滤器,特别是当输出可能包含用户输入时。更多关于 Drupal 8 自动转义机制的信息见 此页面

render
这是 render() 函数的封装。它接受渲染数组并输出渲染后的 HTML。这在需要额外处理(如过滤标签)、或基于渲染结果做条件判断时很有用(例如有非空渲染数组却返回空字符串的情况)。它也可用于字符串和实现了 toString() 方法的对象。

safe_join
将多个字符串用分隔符安全拼接在一起。参考 TwigExtension::safeJoin()

示例:

{{ items|safe_join(', ') }}

这会输出 items 变量中的每个字符串,并用逗号隔开。

without
该过滤器会创建渲染数组的副本,并移除参数中指定的子元素。副本可直接输出,而原始数组仍可用来完整打印。参考 twig_without

示例:

{{ content|without('links') }}

这会输出 content 变量中的所有内容,但排除 content.links。

{{ content|without('links', 'field_some_data') }}

这是排除两个元素的示例,将移除「links」和「field_some_data」。