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,把值转换为大写。

缺省 Twig 过滤器的完整列表

Drupal 过滤器

Drupal 提供了额外的过滤器。

翻译过滤器
  • t:这个过滤器会使用 Drupal t() 函数处理变量,该函数会返回一个翻译结果,例如:
{% raw %}
<a href="{{ url('<front>') }}" title="{{ 'Home'|t }}" rel="home" class="site-logo"></a>
{% endraw %}
  • passthrough
  • placeholder

为了安全的对 {% trans %} 标记中检测到的变量进行转义,缺省情况下会使用 @ 前缀。要传递变量(!)或者使用占位符(%),可以使用 passthroughplaceholder 过滤器。

  • 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 的自有过滤器
实现安全的字符串连接
数组过滤器
  • without 创建一个可渲染数组的拷贝,并根据过滤器的参数移除指定的子元素。这样这个拷贝就可以在没有这些元素的情况下被输出;而原有的可渲染数组还可以在模板中继续被输出(带有全部子元素)。
CSS 和 ID 过滤器

翻译

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',
  ]
%}