a Sensio Labs Product

Гибкий, быстрый и безопасный
шаблонизатор для PHP

Twig для верстальщиков

Этот документ описывает синтаксис и семантику шаблонизатора и будет полезен в качестве справочного материала для создания шаблонов с помощью Twig.

Краткий обзор

Шаблон это просто текстовый файл. Вы можете генерировать любой текстовый формат данных (HTML, XML, CSV, LaTeX и пр.). Шаблон может иметь любое расширение, обычно это .html или .xml.

Шаблоны содержат переменные или выражения, которые заменяются на их значения, когда шаблон обрабатывается, и тэги, которые управляют логикой шаблона.

Ниже приведен небольшой шаблон, иллюстрирующий основные принципы. Мы рассмотрим его подробнее дальше:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
  <head>
    <title>Мой сайт</title>
  </head>
  <body>
    <ul id="navigation">
    {% for item in navigation %}
      <li><a href="{{ item.href }}">{{ item.caption }}</a></li>
    {% endfor %}
    </ul>
 
    <h1>Мой сайт</h1>
    {{ a_variable }}
  </body>
</html>

Есть два вида разделителей {% ... %} и {{ ... }}. Первый используется для выполнения выражений, например, циклов, второй - для вывода результата выражения в шаблон.

Переменные

Приложение передает переменные в шаблон, где вы можете их использовать. У переменных могут быть атрибуты, значения которых вы можете получить. Как выглядит переменная во многом зависит от того, как приложение предоставит ее.

Вы можете использовать точку (.) для получения атрибута переменной, или "индекс" - в квадратных скобках ([]). Следующие строчки идентичны:

{{ foo.bar }}
{{ foo['bar'] }}

Важно знать, что фигурные скобки не являются часть переменной, они используются для ее отображения. Если необходим доступ к переменной в тэге - фигурные скобки не нужны.

Если переменная или атрибут не существуют, вы получите значение null (которое можно проверить null выражениями).

Фильтры

Переменные могут быть модифицированы фильтрами. Фильтры отделяются от переменных вертикальной чертой (|) и могут содержать параметры в круглых скобках. Фильтры могут применяться по цепочке. Тогда вывод одного фильтра передается в другой.

Например, {{ name|striptags|title }} удалит HTML тэги из name и сделает первые буквы всех слов заглавными. Фильтры принимают параметры в круглых скобках, на подобии вызова функций. Например, объединение строк запятой: {{ list|join(', ') }}.

Встроенные фильтры описаны ниже в этом документе.

Комментарии

Чтобы закоментировать часть шаблона, используйте следующий синтаксис {# ... #}. Это бывает полезно для комментирования части шаблона при отладке или добавления полезной информации в шаблон:

{# примечание: это заккоментированно, пока не используется 
  {% for user in users %}
      ...
  {% endfor %}
#}

Управление пробелами

По умолчанию пробелы ни как не изменяются шаблонизатором, так же как и другие подобные символы (табуляция, символ новой строи и др.). Если в настройках Twig использовать параметр trim_blocks, то первая строка после тэга будет автоматически удаляться (как в PHP).

Экранирование

Иногда нужно чтобы Twig проигнорировал обработку части шаблона. Например, при использовании синтаксиса по умолчанию, вы хотите вывести {{ в шаблоне и не использовать при этом никакие хаки.

Самый простой способ сделать это - использовать следующее выражение:

{{ '{{' }}

Для больших блоков можно использовать блок raw. Например, для вывода синтаксиса Twig, как пример шаблона, можно использовать следующий кусочек кода:

{% raw %}
  <ul>
  {% for item in seq %}
    <li>{{ item }}</li>
  {% endfor %}
  </ul>
{% endraw %}

Наследование шаблонов

Самая мощная часть Twig это наследование шаблонов. Наследование шаблонов позволяет вам создать базовый "скелет", который содержит все элементы вашего сайта и определить тэги blocks, которые будут перезаписаны в дочерних шаблонах.

Это только выглядит сложно, на самом деле все просто. Проще всего разобраться с наследованием на примере.

Основной шаблон

Этот шаблон, который мы назвали base.html, содержит простой HTML с двухколоночной структурой сайта. Дочернией шаблон будет заполнять пустые блоки содержимым:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="ru">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  {% block head %}
    <link rel="stylesheet" href="style.css" />
    <title>{% block title %}{% endblock %} - Мой сайт</title>
  {% endblock %}
</head>
<body>
  <div id="content">{% block content %}{% endblock %}</div>
  <div id="footer">
    {% block footer %}
      &copy; 2010 <a href="http://domain.invalid/">создатель сайта</a>.
    {% endblock %}
  </div>
</body>

В этом примере, тэг {% block %} определяет четыре блока, которые будут заполнены в дочернем шаблоне. Эти тэги говорят шаблонизатору, что они могут быть переопределены в дочернем шаблоне.

Дочерний шаблон

Дочерний шаблон может выглядеть следующим образом:

{% extends "base.html" %}
 
{% block title %}Страница{% endblock %}
{% block head %}
  {% parent %}
  <style type="text/css">
    .important { color: #336699; }
  </style>
{% endblock %}
{% block content %}
  <h1>Страница</h1>
  <p class="important">
    Добро пожаловать на мой сайт.
  </p>
{% endblock %}

Тэг {% extends %} ключевой здесь. Он сообщает шаблонизатору, что шаблон "расширяет" другой шаблон. Когда шаблонизатор обрабатывает шаблон, он первым делом смотрит на родительский. Тэг extends должен быть первым тэгом в шаблоне.

Имя файла с шаблоном определяется в загрузчике шаблона. Например, Twig_Loader_Filesystem позволяет получить доступ к другим файлам по имени шаблона. Вы можете использовать поддиректории с помощью слеша (/):

{% extends "layout/default.html" %}

Но его функционал зависит от того как Twig подключается в приложении. Заметьте, что так как в дочернем шаблоне не определен блок footer, он берется из родительского.

Вы не можете использовать тэг {% block %} с одним именем в одном шаблоне несколько раз. Это ограничение существует из-за того, что тэг block работает в "обоих" направлениях. Т.е. блок не только отмечает место (в родительском шаблоне) для заполнения, но и содержит контент для этого (в дочернем). Если будут два тэга с одним именем в дочернем шаблоне, родительский не будет знать какой из них использовать.

Если вы хотите отобразить блок несколько раз, вы можете использовать тэг display для этого:

<title>{% block title %}{% endblock %}</title>
<h1>{% display title %}</h1>
{% block body %}{% endblock %}

Как и PHP, Twig не поддерживает множественное наследование. Вы можете использовать только один тэг extends в шаблоне.

Блок parent

Используя тэг parent, можно отобразить содержание родительского блока. Он возвращает первоначальное содержание родительского блока.

{% block sidebar %}
  <h3>Новый контент</h3>
  ...
  {% parent %}
{% endblock %}

Названия блоков в тэге end

Twig позволяет вставить имя блока после тэга end, для повышения читаемости кода:

{% block sidebar %}
  {% block inner_sidebar %}
      ...
  {% endblock inner_sidebar %}
{% endblock sidebar %}

Однако, названия в тэге endblock должны соответствовать названию блоков.

Вложенные блоки

Блоки могут вложенными. По умолчанию доступны переменные из внешних блоков:

{% for item in seq %}
  <li>{% block loop_item %}{{ item }}{% endblock %}</li>
{% endfor %}

Сокращения для блоков

Для блоков с небольшим контентом есть короткий способ записи. Например:

{% block title %}
  {{ page_title|title }}
{% endblock %}
{% block title page_title|title %}

Заметьте, что если указать второй аргумент в тэге блок, он будет восприниматься как короткий тэг и Twig не будет искать закрывающий тэг.

Области видимости переменных в тэге include

По умолчанию, подключаемые шаблоны имеют доступ ко всем переменным видимым из места подключения.

{% for box in boxes %}
  {% include "render_box.html" %}
{% endfor %}

Подключенный шаблон render_box.html имеет доступ к переменной box.

Экранирование HTML

При генерации HTML в шаблоне всегда есть риск того, что переменные содержат спецсимволы. Есть два варианта: вручную отмечать переменные, которые нужно экранировать или автоматически экранировать все по умолчанию.

Twig поддерживает оба варианта, а какой именно способ будет использоваться можно задать в настройках приложения. По умолчанию экранирование переменных отключено, по следующим причинам:

  • Экранирование по умолчанию всех переменных обозначает то, что Twig экранировать также и те переменные, которые не содержат HTML, например, числа, что приведет к ухудшению производительности.

  • Информацию в "безопасных" переменных "сломать" гораздо проще. Может случиться так, что значение переменной будет экранированно дважды.

Экранирование работает только, если включено соответствующее расширение.

Ручное экранирование

Если включено ручное экранирование, ответственность за безопасность переменных лежит на вас. Что экранируется? Если у вас есть переменная, содержащая любой из следующих символов (>, <, & или "), вы должны экранировать ее, чтобы получить правильный и хороший HTML. Экранирование осуществляется с помощью фильтра |e, например: {{ user.username|e }}.

Автоматическое экранирование

Экранирование работает только если включено соответствующее расширение.

Вне зависимости от того, включено автоматическое экранирование или нет, вы можете использовать тэг autoescape:

{% autoescape on %}
  Внутри этого блока все переменные будут экранированы
{% endautoescape %}
 
{% autoescape off %}
  Все будет выведено "как есть" в этом блоке
{% endautoescape %}

Если включено автоматическое экранирование, оно будет применено ко всем переменным кроме тех, которые отмечены фильтром |safe filter.

Данные возвращаемые функциями (такими как макросы или parent), всегда отмечены как безопасные.

Twig достаточно умен и не экранирует переменные дважды, например, если они отмечены фильтром escape.

Глава документации для разработчиков описывает автоматическое экранирование более подробно.

Список операторов

К операторам относиться все, что управляет последовательностью обработки шаблона - условия (if/elseif/else), циклы, а так же тэги for. Операторы заключаются внутрь {% ... %}.

Оператор For

Перебирает все символы последовательности. Например, можно отобразить список пользователей, содержащийся в переменной users:

<h1>Пользователи</h1>
<ul>
  {% for user in users %}
    <li>{{ user.username|e }}</li>
  {% endfor %}
</ul>

For может работать с любыми массивами или объектами имеющими интерфейс Iterator.

Если вам надо перебрать последовательность чисел, вы можете использовать оператор .. (появилось в Twig 0.9.5):

{% for i in 0..10 %}
  * {{ i }}
{% endfor %}

Кусок кода выше печатает цифры от 0 до 9 (последнее число не входит в генерируемый массив).

Так же можно перечислять символы:

{% for letter in 'a'..'z' %}
  * {{ letter }}
{% endfor %}

Оператор .. может содержать любые выражения с каждой стороны:

{% for letter in 'a'|upper..'z'|upper %}
  * {{ letter }}
{% endfor %}

Если вам нужен шаг не равный 1, вы можете использовать фильтр range:

{% for i in 0|range(10, 2) %}
  * {{ i }}
{% endfor %}

Внутри цикла у вас есть несколько специфичных переменных:

Переменная Описание
loop.index Текущая итерация цикла (начиная с 1)
loop.index0 Текущая итерация цикла (начиная с 0)
loop.revindex Число итерация оставшихся до конца цикла (начиная с 1)
loop.revindex0 Число итерация оставшихся до конца цикла (начиная с 0)
loop.first True, если это первая итерация
loop.last True, если последняя итерация
loop.length Число элементов в последовательности
loop.parent Элемент внешнего цикла

В отличие от PHP, вы не можете прервать выполнение цикла или перейти к следующей итерации.

Если массив для цикла пуст, вы можете использовать тэг else для сообщения об этом:

<ul>
  {% for user in users %}
    <li>{{ user.username|e }}</li>
  {% else %}
    <li><em>нет пользователей</em></li>
  {% endfor %}
</ul>

По умолчанию итерация идет по значениям последовательности. Вы можете перебрать ключи используя фильтр keys:

<h1>Пользователи</h1>
<ul>
  {% for key in users|keys %}
    <li>{{ key }}</li>
  {% endfor %}
</ul>

Так же вы можете получить и ключи и значения одновременно:

<h1>Пользователи</h1>
<ul>
  {% for key, value in users %}
    <li>{{ key }}: {{ user.username|e }}</li>
  {% endfor %}
</ul>

В Twig до 0.9.3 вы должны использовать фильтр items для этого: ({% for key, value in users|items %}).

Оператор If

Оператор if в Twig действует так же как в PHP. В простейшем случае вы можете проверить, что переменная определена, не пустая и не равна false:

{% if users %}
  <ul>
    {% for user in users %}
      <li>{{ user.username|e }}</li>
    {% endfor %}
  </ul>
{% endif %}

Так же как в PHP есть операторы elseif и else. Вы можете использовать их для сложных выражений:

{% if kenny.sick %}
  Кенни плохо.
{% elseif kenny.dead %}
  Они убили Кенни! Сволочи!!!
{% else %}
  Кенни выглядит хорошо - надолго ли...
{% endif %}

Макросы

Макросы похожи на функции в обычных языках программирования. Они полезны, когда надо повторить многократно HTML код, но не копировать его.

Небольшой пример макроса для отображение элементов формы:

{% macro input(name, value, type, size) %}
  <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
{% endmacro %}

Макросы отличаются от обычных функций PHP следующим:

  • Значения аргументов по умолчанию определяются фильтром default внутри макроса;

  • Аргументы макроса всегда не обязательны.

Но, как и функции PHP, макрос не имеет доступа к переменным в шаблоне.

Макросы могут быть определенны в любом шаблоне и должны быть импортированы с помощью тэга import перед использованием (смотрите документация про import для более подробной информации):

{% import "forms.html" as forms %}

Тэг import подключает файл "forms.html" (в котором могут быть как макросы, таки шаблоны и макросы вместе), и создает переменную forms, которая содержит все импортированные макросы.

Вызываются макросы следующим образом:

<p>{{ forms.input('username') }}</p>
<p>{{ forms.input('password', none, 'password') }}</p>

Фильтры

Тэг filter позволяет применить обычный фильтр Twig к целому блоку шаблона. Просто оберните код тэгом filter:

{% filter upper %}
  Текст будет написан заглавными буквами
{% endfilter %}

Вы так же можете использовать цепочки фильтров:

{% filter lower|escape %}
  <strong>нЕКИЙ ТЕКСТ</strong>
{% endfilter %}

Вернет <strong>некий текст</strong>.

Присвоение значений переменным

С помощью тэга set вы можете назначить переменным значения. Например, так:

{% set foo as 'foo' %}
 
{% set foo as [1, 2] %}
 
{% set foo as ['foo': 'bar] %}
 
{% set foo as 'foo' ~ 'bar' %}
 
{% set foo, bar as 'foo', 'bar' %}

Тэг set теперь можно использовать для "хранения" HTML (добавленно в Twig 0.9.6):

{% set foo %}
  <div id="pagination">
    ...
  </div>

{% endset %}

Тэг extends

Тэг extends может быть использован для расширения одного шаблона другим. Их может быть несколько в шаблоне, но только один из них будет выполнен. Множественное наследование расширений не доступно. Подробнее можно почитать в раздели о наследовании шаблонов.

Тэг block

Тэг используется в наследовании шаблонов для отметки места для замены и содержания для замены. Он описан подробно в разделе о наследовании шаблонов.

Тэг include

Тэг include используется для подключения одного шаблона в другой, с учетом его пространства имен:

{% include 'header.html' %}
  Основная часть страницы
{% include 'footer.html' %}

Подключаемые шаблоны имеют доступ ко всем переменным шаблона к которому они подключаются.

Подключаемый файл может быть обработан в песочнице (надо добавить в конце sandboxed), если включено расширение escapercode>.

{% include 'user.html' sandboxed %}

Вы можете ограничить количество переменных передаваемых в шаблон, перечислив их в массиве:

{% include 'foo' with ['foo': 'bar'] %}
 
{% set vars as ['foo': 'bar'] %}
{% include 'foo' with vars %}

Более безопасный способ подключения шаблонов - использование режима песочницы и передача минимального количества переменных необходимых для правильного отображения:

{% include 'foo' sandboxed with vars %}

Ключевое слово with доступно в Twig начиная с 0.9.5.

Тэг import

Twig позволяет описать часто используемый код в макросах. Макросы могут быть описаны в разных шаблонах и импортированы из них с помощью тэга import.

Представим, что у нас есть вспомогательный модуль, который позволяет отображать формы (назовем его forms.html):

{% macro input(name, value, type, size) %}
  <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
{% endmacro %}
 
{% macro textarea(name, value, rows) %}
  <textarea name="{{ name }}" rows="{{ rows|default(10) }}" cols="{{ cols|default(40) }}">{{ value|e }}</textarea>
{% endmacro %}

Далее можно импортировать их в шаблон с помощью тэга import:

{% import 'forms.html' as forms %}
<dl>
  <dt>Имя пользователя</dt>
  <dd>{{ forms.input('username') }}</dd>
  <dt>Пароль</dt>
  <dd>{{ forms.input('password', none, 'password') }}</dd>
</dl>
<p>{{ forms.textarea('comment') }}</p>

Даже если макрос используется в том же шаблоне в котором определен, его необходимо импортировать:

{# index.html шаблон #}
 
{% macro textarea(name, value, rows) %}
  <textarea name="{{ name }}" rows="{{ rows|default(10) }}" cols="{{ cols|default(40) }}">{{ value|e }}</textarea>
{% endmacro %}
 
{% import "index.html" as forms %}
 
<p>{{ forms.textarea('comment') }}</p>

Отладка

Если шаблон работает не так как предполагается, тэг debug может быть использован для вывода контента:

{% debug %}

Вы можете вывести определенные переменные следующим образом:

{% debug items %}
 
{% debug post.body %}

Обратите внимание, что этот тэг работает только когда включен параметр debug.

Интернационализация (добавленно в Twig 0.9.6)

Если подключить расширение i18n, вы можете использовать тэг trans чтобы отметить часть шаблона, которую необходимо перевести:

{% trans %}
Hello World!
{% endtrans %}

Расширение I18n работает только если включенно расширение PHP gettext.

Вы можете использовать переменные в переводимой строке:

{% trans %}
Hello {{ name }}!
{% endtrans %}

Если вы хотите использовать фильтры для переменных, то сначала надо сохранить результат в переменной:

{% set name as name|capitalize %}
 
{% trans %}
Hello {{ name }}!
{% endtrans %}

Для перевода множественных числительных используйте тэг plural:

{% trans apple_count %}
Hey {{ name }}, I have one apple.
{% plural %}
Hey {{ name }}, I have {{ count }} apples.
{% endtrans %}

The trans block first argument is the count used to select the right string. Within the translatable string, the special count variable always contain the count value (here the value of apple_count).

Выражения

Twig позволяет везде использовать вычисляемые выражения. Они работают подобно обычному PHP, но даже если вы никогда не работали с PHP, у вас не будет с ними сложностей.

Приоритет операторов в порядке убывания: or, and, ==, !=, <, >, >=, <=, in, +, -, ~, *, /, %, //, not и [.

Литеры

Простейшим видом выражений являются литеры. Литеры соответствуют типам данных PHP: строки, числа и массивы. Существуют следующие литеры:

  • "Hello World": Все заключенное в одинарные или двойные кавычки является строками. Они нужны, если вы используете строки в шаблоне (например, как параметры функций, фильтров или в тэге include.

  • 42 / 42.23: Целые числа и числа с плавающей точкой записываются одинаково. Если есть точка - это float, иначе - integer.

  • [foo, bar]: Массивы определяются как набор выражений разделенных запятыми (,) и заключенных в квадратные скобки ([]). Элементы массива могут быть любым литерам, в том числе и другим массивом. Массивы доступны в Twig с версии 0.9.5.

  • true / false / none: true - истина, false - ложь.

  • none: none - специальное значение (эквивалентно null в PHP). Это значение возвращается, когда переменная не определена.

Математические операторы

Tiwg предоставляет возможность вычислять значения. Это редко используется в шаблонах, но все же есть для полноты языка. Поддерживаются следующие операторы:

  • Складывает два объекта. Обычно объекты это числа, но если это строки или массивы, их элементы будут объединены. однако это не лучший способ конкатенации строк! Для них рекомендуется использовать оператор ~. {{ 1 + 1 }} выведет 2.

  • -: Вычитает из первого аргумента второй. {{ 3 - 2 }} выведет 1.

  • /: Деление чисел. Возвращает число с плавающей точкой. {{ 1 / 2 }} отобразит {{ 0.5 }}.

  • %: Вычисляет целый остаток от деления. {{ 11 % 7 }} это 4.

  • //: Целочисленное деление. {{ 20 // 7 }} это 2.

  • *: Перемножает аргументы. {{ 2 * 2 }} вернет 4. Может использоваться для повтора строк. {{ '=' * 80 }} выведет символ равенства 80 раз.

  • **: Возводит первый аргумент в степень. {{ 2**3 }} вернет 8.

Логические операторы

Для использования в тэгах if, for, для фильтрации или для построения сложных выражений:

  • and: Логическое "и".

  • or: Логическое "или".

  • not: Логическое отрицание.

  • (expr): Объединение выражений.

Операторы сравнения

Эти операторы сравнения могут быть использованы в любом выражении: ==, !=, <, >, >= и <=.

Кроме стандартных операторов сравнения PHP, Twig поддерживает сокращенную запись для проверки в диапазоне значений:

{% if 1 < foo < 4 %}foo между 1 и 4{% endif %}

Другие операторы

Следующие операторы часто используются, но их сложно отнести к какому-либо из предыдущих типов:

  • in (добавлен в Twig 0.9.5): Проверяет на содержание одной переменной в другой. Возвращает true, если левый оператор содержиться в правом. К примеру, {{ 1 in [1, 2, 3] }} вернет true. Для обратной проверки можно использовать оператор not. ({{ not 1 in [1, 2, 3] }} вернет false).

  • .. (добавлен в Twig 0.9.5): Создает последовательность от первого аргумента до второго (смотрите примеры в описании тэг for).

  • |: Применяет фильтр.

  • ~: Преобразует все аргументы в строки и соединяет их. {{ "Привет, " ~ name ~ "!" }} вернет "Привет, Алексей!", для значения.

  • ., []: Операторы для получения атрибутов объекта.

  • ?:: Twig поддерживает тернарный оператор из PHP:

    {{ foo ? 'да' : 'нет' }}

Встроенные фильтры

date

Фильтр date позволяет отформатировать дату:

{{ post.published_at|date("m.d.Y") }}

Фильтр date принимает переменные типа timestamp и DateTime.

format

Фильтр format вставляет аргументы в отмеченные места::

{# string - переменная, содержащая, к примеру, следующее: "мне нравяться %s и %s" #}
{{ string|format(foo, "bar") }}
{# вернет "мне нравяться foo и bar". (если значение переменной foo равно строке "foo") #}

even

Фильтр even вернет , если число четное, иначе - false:

{{ var|even ? 'even' : 'odd' }}

odd

Фильтр odd вернет true, если число нечетное, иначе - false:

{{ var|odd ? 'odd' : 'even' }}

cycle

Фильтр cycle используется для цикла по массиву значений:

{% for i in 0..10 %}
  {{ ['odd', 'even']|cycle(i) }}
{% endfor %}

Массив может содержать любое количество значений:

{% set fruits as ['apple', 'orange', 'citrus'] %}
 
{% for i in 0..10 %}
  {{ fruits|cycle(i) }}
{% endfor %}

encoding

Фильтр encoding вернет URL-кодированную строку.

title

Фильтр title вернет строку, отформатированную следующим образом: первый символ каждого слова будет в верхнем регистре, остальные в нижнем.

capitalize

Фильтр capitalize вернет строку, отформатированную следующим образом: первый символ первого слова будет в верхнем регистре, остальные в нижнем.

upper

Фильтр upper преобразует все символы в заглавные.

lower

Фильтр lower преобразует все символы в строчные.

striptags

Фильтр striptags вырезает SGML/XML тэги и заменяет идущие подряд пробелы на один.

join

Фильтр join возвращает строку, содержащую объединенные строки последовательности. Разделитель по-умолчанию - пустая строка, но его можно определить как параметр:

{{ [1, 2, 3]|join('|') }}
{# вернет 1|2|3 #}
 
{{ [1, 2, 3]|join }}
{# вернет 123 #}

reverse

Фильтр reverse сортирует массив или объект с интерфейсом Iterator в обратном порядке.

length

Фильтр length возвращает число элементов последовательности или длину строки.

sort

Фильтр sort сортирует массив.

in (добавлен в Twig 0.9.5)

Возвращает true, если значение содержится в передаваемом фильтру параметре.

{# вернет true #}
 
{{ 1|in([1, 2, 3]) }}
 
{{ 'cd'|in('abcde') }}

Вы можете использовать этот фильтр для строк, массивов или объектов, имеющих интерфейс Traversable.

Оператор in является синтаксическим сахаром для следующего типа тэгов:

{% if 1 in [1, 2, 3] %}
  TRUE
{% endif %}
 
{# это эквивалентно #}
 
{% if 1|in([1, 2, 3]) %}
  TRUE
{% endif %}

range (добавлен в Twig 0.9.5)

Возвращает последовательность чисел. Слева от фильтра находится минимально значение. Первый параметр (он обязателен) - содержит верхнюю границу последовательности. Второй параметр не обязателен и содержит шаг последовательности (по умолчанию 1).

Если необходимо перебрать последовательность чисел:

{% for i in 0|range(10) %}
  * {{ i }}
{% endfor %}

Фильтр range работает как обычная PHP функция range.

Оператор .. является синтаксическим сахаром для следующего типа фильтра range (с шагом 1):

{% for i in 0|range(10) %}
  * {{ i }}
{% endfor %}
 
{# это эквивалентно #}
 
{% for i in 0..10 %}
  * {{ i }}
{% endfor %}

default

Фильтр default возвращает переданный ему параметр, если значение слева от фильтра не определено, иначе - саму переменную:

{{ my_variable|default('my_variable не определена') }}

keys

Фильтр keys возвращает ключи массива. Обычно используется, когда необходимо перебрать их в цикле:

{% for key in array|keys %}
    ...
{% endfor %}

escape, e

Фильтр escape конвертирует &, <, >, ' и " в безопасные HTML-последовательности. Используется, если надо вывести как HTML строку, содержащую такие символы.

Фильтр escape реализован через функцию PHP htmlspecialchars.

safe

Фильтр safe отмечает переменную как безопасную, и она не будет экранирована, даже если включено автоматическое экранирование.

{% autoescape on }
  {{ var|safe }} {# var не экранируется #}
{% autoescape off %}

Раширения

Twig можно легко расширить. Если вы ищите новые тэги или фильтры, взгляните на официальный репозитарий http://github.com/fabpot/Twig-extensions.