Twig 基础
启用 Twig 的自动转义
字符串转义的意思是减少字符串中的歧义字符。
(Drupal 在)缺省情况下启用 Twig 的自动转义。这意味着 Twig 模板输出的字符串( {{ }}
之间的内容 )都是被转义处理过的。
输出一个变量
用 {{ 变量 }}
的方式输出模板中的一个变量,例如 {{ foo }}
句点 (.
)用于访问对象的属性:
{{ foo.bar }}
(上面的语句,)Twig 会自动进行如下尝试:
// 数组键。
$foo['bar'];
// 对象属性。
$foo->bar;
// 对象方法。
$foo->bar();
// 对象属性的 Getter。
$foo->getBar();
// 尝试 is + 方法名。
$foo->isBar();
// isset 和 get 方法
`$foo->__isset('bar');`
`$foo->__get('bar');`
PHP
$awesome_array = array(
'a_key' => 'a_value',
'another_key' => array(
'foo' => 'bar',
),
);
Twig
{{ awesome_array.a_key }} # 返回 'a_value'
{{ awesome_array.another_key.foo }} # 返回 'bar'
Twig 过滤器( filter )
可以在输出变量之前用过滤器对变量进行处理,使用方式是: {{ variable|filter }}
。
Twig 自有过滤器
下面是一些 Twig 引擎自带的过滤器的例子。
|length
,返回字典或序列类型数据的数量,或者字符串的长度。|lower
,把值转换为小写。|upper
,把值转换为大写。- …
Drupal 过滤器
Drupal 提供了额外的过滤器。
翻译过滤器
t
:这个过滤器会使用 Drupalt()
函数处理变量,该函数会返回一个翻译结果,例如:
{% raw %}
<a href="{{ url('<front>') }}" title="{{ 'Home'|t }}" rel="home" class="site-logo"></a>
{% endraw %}
passthrough
placeholder
为了安全的对 {% trans %}
标记中检测到的变量进行转义,缺省情况下会使用 @
前缀。要传递变量(!)或者使用占位符(%),可以使用 passthrough
或 placeholder
过滤器。
- passthrough gets no sanitization or formatting and should only be used for text that has already been prepared for HTML display.
placeholder 会转义为 HTML 并使用
drupal_placeholder()
格式化,并显示为<em>emp</em>
的形式。raw
会显示原始数据(也就是不做转义处理)。
替换 Twig 的自有过滤器
drupal_escape
是 Twig 的转义过滤器的替代品。参见TwigExtension::escapeFilter
实现安全的字符串连接
safe_join
用于安全的连接多个字符串。参见twig_drupal_join_filter
。
数组过滤器
without
创建一个可渲染数组的拷贝,并根据过滤器的参数移除指定的子元素。这样这个拷贝就可以在没有这些元素的情况下被输出;而原有的可渲染数组还可以在模板中继续被输出(带有全部子元素)。
CSS 和 ID 过滤器
clean_class
会把字符串转换为一个有效的 HTML 类名。使用 Html::getClassclean_id
把字符串转换为有效的 HTML ID。使用 Html::getId
翻译
Twig 的 i18n 扩展允许把模板的一部分标记为可翻译内容。我们以下面的代码为例:
{% trans %} Hello world {% endtrans %}
可以在可翻译字符串中间利用 {{ variable }}
语法嵌入变量,
{% trans %} Hello {{ name }} {% endtrans %}
要在可翻译块中使用过滤器对变量进行处理,可以首先把过滤器结果赋值给一个变量。
{% set name = name|capitalize %}
{% trans %}
Hello {{ name }}!
{% endtrans %}
可翻译字符串可以有复数操作,只要实现一个 {% plural ... %}
开关就完成了:
{% trans %}
Hello star.
{% plural count %}
Hello {{ count }} stars.
{% endtrans %}
注释
{# 用这一对标记来包含注释 #}
条件判断 (此处原文为 Function,疑似错误)
if
:
{% if site_slogan %}
<div class="site-slogan">{{ site_slogan }}</div>
{% endif %}
循环
一个 for
循环。输出结果为 0, 1, 2, 3
。
range
函数返回一个包含顺序递增的整数列表。
{% for i in range(0, 3) %}
{{ i }},
{% endfor %}
来自 field--node--title.html.twig
模板的另一个例子:
{% for item in items %}
{{ item.content }}
{% endfor %}
在 For 循环中,可以使用一些特殊变量。
变量 | 描述 |
---|---|
items.index | 当前的循环次数( 从 1 开始 ) |
items.index0 | 当前的循环次数( 从 0 开始 ) |
items.revindex | 剩余的循环次数( 从 1 开始 ) |
items.revindex0 | 剩余的循环次数( 从 0 开始 ) |
items.first | 是否初次执行 |
items.last | 是否最后一次执行 |
items.length | 序列中的元素数量 |
items.parent | 上级的上下文 |
如果循环列表为空,可以利用一个 else
语句块来代替输出:
<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% else %}
<li><em>查询结果为空</em></li>
{% endfor %}
</ul>
创建一个 Twig 变量
Sometimes it might be useful to define variables in a template file. {% set foo="bar" %}
declares a variable foo
and assigns the value bar
to it. Later in the template, the variable can be printed out using {{ foo }}
.
有时候需要在模板中定义变量。{% set foo="bar" %}
声明了一个变量 foo
,并赋值为 bar
。后面的模板中可以使用{{ foo }}
来输出。
example.twig.php
{% set foo="bar" %}
# 其他代码
Hi, here's my variable: {{ foo }}
除了上面的简单变量之外,变量还可以是数组:
another_example.twig.php
{%
set foo_array = [
'foo',
'bar',
]
%}