Vse o WEB
Информация и размышления о Web технологиях

Symfony. Коротко о работе с Twig

В предыдущих статьях о 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>

Операторы

Тесты

Twig включает в себя несколько тестов для использования с тегом if: constant, defined, empty, event, iterable, null, odd и др. По названию очень просто определить, что они делают и в каком случае их применять.

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

Пробуйте, задавайте вопросы в комментариях и ждите продолжения темы.

Наверх