Управляющие конструкции
Условия (if)
Условия (if)
{% if user.isActive %}
<p>Добро пожаловать, {{ user.name }}!</p>
{% endif %}
elseif / else
elseif / else
{% if user.role == 'admin' %}
<span class="badge bg-danger">Администратор</span>
{% elseif user.role == 'moderator' %}
<span class="badge bg-warning">Модератор</span>
{% elseif user.role == 'vip' %}
<span class="badge bg-success">VIP</span>
{% else %}
<span class="badge bg-secondary">Пользователь</span>
{% endif %}
Комбинирование условий
Комбинирование условий
{% if user.isActive and user.age >= 18 %}
{# ... #}
{% endif %}
{% if not user.isBanned or user.role == 'admin' %}
{# ... #}
{% endif %}
{% if status in ['active', 'pending'] and count > 0 %}
{# ... #}
{% endif %}
Проверки
Проверки
{# Определена ли переменная #}
{% if user is defined %}
{# Пустая ли переменная #}
{% if items is not empty %}
{# Чётность/нечётность #}
{% if loop.index is even %}
{# Null-проверка #}
{% if value is null %}
{# Проверка типа #}
{% if data is iterable %}
Цикл (for)
Базовый цикл
Базовый цикл
<ul>
{% for user in users %}
<li>{{ user.name }}</li>
{% endfor %}
</ul>
Итерация по ключам и значениям
Итерация по ключам и значениям
{% for key, value in data %}
<dt>{{ key }}</dt>
<dd>{{ value }}</dd>
{% endfor %}
{# Итерация только по ключам #}
{% for key in data|keys %}
{{ key }}
{% endfor %}
Переменная loop
Внутри цикла for доступна специальная переменная loop:
| Переменная | Описание |
|---|---|
loop.index | Текущая итерация (начиная с 1) |
loop.index0 | Текущая итерация (начиная с 0) |
loop.revindex | Итераций до конца (начиная с 1) |
loop.revindex0 | Итераций до конца (начиная с 0) |
loop.first | true для первой итерации |
loop.last | true для последней итерации |
loop.length | Общее количество итераций |
loop.parent | Родительский контекст (для вложенных циклов) |
Переменная loop
{% for user in users %}
{{ loop.index }}. {{ user.name }}
{% if loop.first %} (первый){% endif %}
{% if loop.last %} (последний){% endif %}
{% if not loop.last %}, {% endif %}
{% endfor %}
Пустые коллекции (else)
Пустые коллекции (else)
{% for article in articles %}
<article>
<h2>{{ article.title }}</h2>
</article>
{% else %}
<p>Статьи не найдены.</p>
{% endfor %}
Фильтрация в цикле
Фильтрация в цикле
{# Итерация только по активным пользователям #}
{% for user in users if user.isActive %}
{{ user.name }}
{% endfor %}
{# Комбинация с else #}
{% for product in products if product.inStock %}
{{ product.name }}: {{ product.price }} руб.
{% else %}
<p>Нет товаров в наличии.</p>
{% endfor %}
Диапазон
Диапазон
{% for i in 0..9 %}
{{ i }}
{% endfor %}
{% for letter in 'a'..'f' %}
{{ letter }}
{% endfor %}
Присвоение (set)
Простое присвоение
Простое присвоение
{% set name = 'World' %}
{% set price = 100 %}
{% set active = true %}
{% set items = ['a', 'b', 'c'] %}
{% set config = {debug: true, version: '1.0'} %}
Множественное присвоение
Множественное присвоение
{% set foo, bar = 'hello', 'world' %}
Блочное присвоение
Блочное присвоение
{% set content %}
<div class="card">
<h3>{{ title }}</h3>
<p>{{ description }}</p>
</div>
{% endset %}
{# Использование #}
{{ content }}
Выполнение без вывода (do)
Вычисляет выражение, но не выводит результат:
Выполнение без вывода (do)
{% do mw.someMethod() %}
{% do items.append('new item') %}
Область видимости (with)
Ограничивает видимость переменных:
Область видимости (with)
{% with %}
{% set temp = 'Эта переменная не видна за пределами with' %}
{{ temp }}
{% endwith %}
{# temp здесь недоступна #}
Область видимости (with)
{# С передачей конкретных переменных #}
{% with {name: 'John', age: 30} only %}
{{ name }}, {{ age }}
{# Другие переменные контекста здесь недоступны #}
{% endwith %}
Сырой вывод (verbatim)
Выводит содержимое без обработки Twig:
Сырой вывод (verbatim)
{% verbatim %}
Этот текст не будет обрабатываться: {{ var }} и {% if %}
Полезно для документации или шаблонов на стороне клиента (Vue.js, Angular)
{% endverbatim %}
Применение фильтров к блоку (apply)
Применение фильтров к блоку (apply)
{% apply upper %}
Этот текст будет в верхнем регистре
{% endapply %}
{% apply spaceless %}
<div>
<strong>текст</strong>
</div>
{% endapply %}
{# Результат: <div><strong>текст</strong></div> #}
{# Цепочка фильтров #}
{% apply lower|escape %}
<SOME> HTML & TEXT
{% endapply %}
Управление экранированием (autoescape)
Управление экранированием (autoescape)
{# Включить автоэкранирование #}
{% autoescape %}
{{ user_input }} {# Будет экранировано #}
{% endautoescape %}
{# Указать стратегию #}
{% autoescape 'html' %}
{{ content }}
{% endautoescape %}
{% autoescape 'js' %}
var data = {{ json_data }};
{% endautoescape %}
{# Отключить автоэкранирование #}
{% autoescape false %}
{{ trusted_html }}
{% endautoescape %}
предупреждение
Отключение autoescape допустимо только для доверенного контента. Никогда не отключайте экранирование для пользовательского ввода.