过滤器 —— 在 Twig 模板中修改变量
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」。