В предыдущих статьях о Symfony (часть 1, часть 2) мы уже говорили о том, что движок шаблонов по умолчанию для этого фреймворка носит название Twig. Конечно, вы не ограничены в выборе шаблонизатора и можете использовать что угодно, при желании. Однако в этой статье я опишу кратко основные моменты, которые позволят понять, почему это круто использовать Twig и все, что вы использовали ранее, покажется страшным сном уже не вызовет желания быть примененным в качестве шаблонизатора.
Первое, что нужно сказать - до тех пора пока вы не пишете чистый API, Twig будет вашим лучшим другом, потому что это легко использовать и к тому же очень удобно.
Twig имеет два типа синтаксиса: {{ }} - это означает "скажи что-нибудь" - и {% %} - "сделай что-нибудь".
{{ скажи, что-нибудь }}, {% сделай что-нибудь %}
Другими словами, если нужно что-либо вывести на страницу, подобно оператору echo, используем синтаксис {{ }}, если же нужно добавить if-условия, вывести данные в цикле или просто объявить переменную - {% %}
Синтаксические конструкции
{% if ... %}{% endif %}
{% for ... in ... %}{% endfor %}
Рассмотрим на примере вывода статей для блога в цикле:
{% if articles is defined %}
<ul>
{% for article in articles %}
<li>{{ article.title|escape ~ ' | ' ~ article.created_at|date('d.m.Y') }}</li>
{% endfor %}
</ul>
{% endif %}
В этом примере мы также использовали еще один функциональный элемент - фильтры (filters) - на примере фильтра escape. Фильтры добавляются к переменной чере символ "|" и могут следовать один за одним в необходимом порядке их применения. Полный список фильтров смотрим в документации.
Основные теги
block - определяет блок контента в шаблоне, парный
{% block title %}{% endblock %}
extends - может быть использован для наследования одного шаблона от другого c последующим переопеределнием блоков, непарный
{% extends "base.html" %}
include - используется для подключения шаблонов
{% include 'header.html' %}
Body
{% include 'footer.html' %}
{% import 'forms.html' as forms %}
<dl>
<dt>Username</dt>
<dd>{{ forms.input('username') }}</dd>
<dt>Password</dt>
<dd>{{ forms.input('password', null, 'password') }}</dd>
</dl>
<p>{{ forms.textarea('comment') }}</p>
for - тег, обозначающий цикл
{% for post in posts %}
...
{% endfor %}
if - используется для реализации условия
{% if post.active %}
...
{% else %}
...
{% endif %}
set - объявление переменной
{% set vars = {'foo': 'bar'} %}
{{ vars.foo }} {# печатает 'bar' #}
do - выполняет какое-то действие или выражение, но не печатает его
{% do 1+3 %}
macro - конструкция чем-то схожая с функциями, очень удобна для сохранения 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, cols) %}
<textarea name="{{ name }}" rows="{{ rows|default(10) }}" cols="{{ cols|default(40) }}">{{ value|e }}</textarea>
{% endmacro %}
import - подключает модуль с макросами в качестве переменнойTwig
{% import 'forms.html' as forms %}
<dl>
<dt>Username</dt>
<dd>{{ forms.input('username') }}</dd>
<dt>Password</dt>
<dd>{{ forms.input('password', null, 'password') }}</dd>
</dl>
<p>{{ forms.textarea('comment') }}</p>
Операторы
- in - работает наподобие функции in_array
- is - проверяет на эквивалентность (не соответствие is not)
- Математические (+, -, /, %, //, *, **)
- Логические (and, or, not, (), b-and, b-xor, b-or)
- Операторы сравнения (==, !=, <, >, >=, <=, ===, starts with, ends with, matches)
- Другие (.., |, ~, ., [], ?:)
Тесты
Twig включает в себя несколько тестов для использования с тегом if: constant, defined, empty, event, iterable, null, odd и др. По названию очень просто определить, что они делают и в каком случае их применять.
Естественно, все вышеперечисленное - далеко не полный список возможностей Twig и раскрывает его возможности лишь в малой мере, но даже этого всего хватит, чтобы понять силу данного шаблонизатора и то, насколько он упростит жизнь разработчику. Стоит также отметить, что шаблоны парсятся в чистый PHP код и кешируются, благодаря чему работают настолько же быстро.
Пробуйте, задавайте вопросы в комментариях и ждите продолжения темы.