Синтаксис twig. Установка и начало работы с Twig
- "компилирующий обработчик шаблонов с открытым исходным кодом, написанный на языке программирования PHP. Armin Ronacher написал Twig в 2008 году для платформы блогов Chyrp. Он больше не возвращался к разработке и в большей степени занимался разработкой на Python. Синтаксис языка шаблонов Twig берёт начало от движков шаблонов Jinja и Django, первый из которых также создан Ронакером. Идею данного шаблонизатора развивает и поддерживает Fabien Potencier, ведущий разработчик и идеолог фреймворка Symfony, в котором Twig используется по умолчанию." (https://ru.wikipedia.org/wiki/Twig).
Все Twig шаблоны в Drupal 8 компилируются в php файлы и хранятся в каталоге sites/default/files/php/twig/. Файлы шаблонов при этом кешируются для повторного использования и хранятся в файловой системе для улучшения производительности, перекомпилируются только при очистке Twig кеша.
Все шаблоны в модулях и темах должны находиться в каталоге /templates .
Почему Twig? Во-первых, он более безопасный. В шаблонах Drupal 7 часто выводились неочищенные данные и это в принципе понятно, так как верстальщик не должен следить за работой программиста, который банально мог забыть пропустить данные из форм через check_plain(). В шаблонах же Drupal 8 переменные будут по-умолчанию экранироваться. Кроме этого многие наверняка в шаблонах наблюдали Sql запросы и прочие изыски логики приложения, но в Twig шаблонах это будет исключено.
Во-вторых, в Twig есть очень интересная особенность - наследование шаблонов. Теперь достаточно создать базовый родительский шаблон и затем при создании дочернего шаблона в теге extends указать родительский шаблон. К примеру чтобы создать дочерний шаблон ноды нужно в нем прописать:
{% extends "node.html.twig" %}
Рассмотрим наследование на примере шаблонов для блока. Базовый родительский шаблон для блока block.html.twig содержит примерно такой код
{{ label }}
{% endif %} {{ title_suffix }} {% block content %}При этом содержимое тега block можно в дочернем шаблоне переписать. Рассмотрим код шаблона для блока с формой поиска block--search-form-block.html.twig
{% extends "block.html.twig" %} {% block content %}
Дочерний шаблон будет содержать всю разметку block.html.twig за исключением переписанного содержимого внутри тега block:
{% block content %}{% endblock %}
Рассмотрим основные отличия PHPTemplate и Twig на примерах
Именование файлов шаблонов и функций
PHPTemplate файл шаблона: node--article.tpl.php
Twig файл шаблона: node--article.html.twig
Большинство theme_ функций сейчас вынесено в шаблоны (огромный плюс)
PHPTemplate функция: theme_node_links()
Twig файл шаблона: node-links.html.twig
Docblock и комментарии
Docblock в PHPTemplate:
{# /** * @file * File description */ #}
Комментарии вместо стандартных php комментариев теперь выглядят так:
{# Twig комментарий #}
Работа с переменными
Вывод переменных:
Вывод свойств объектов и элементов массивов:
body; ?>
{{ content.body }}
Вывод элементов массива с хешем в имени ключа
{{ item["#item"].alt }}
Запись в переменную:
field_image; ?>
{% set image = content.field_image %}
Запись в переменную массива:
{% set classes = ["class1", "class2", "class3"] %}
Условия
comments): endif; ?>
{% if content.comments %} {% endif %}
comments)): endif; ?>
{% if content.comments is not empty %} {% endif %}
comments)): endif; ?>
{% if content.comments is defined %} {% endif %}
0): endif; ?>
{% if count > 0 %} {% endif %}
Циклы
{% for user in users %} {% endfor %}
Управление пробелами
Twig позволяет убирать пробелы из вывода с помощью символа - в начале и/или конце структуры {{ }} для вывода переменных.
И в начале, и в конце:
Только в начале:
Только в конце:
Официальная документация по Twig в Drupal 8
Twig 2 - Twig for Template Designers
Twig для дизайнеров шаблонов
Этот документ описывает синтаксис и семантику механизма шаблона и будет наиболее полезен в качестве ссылки на те, которые создают шаблоны Twig.
конспект
Шаблон - это просто текстовый файл. Он может генерировать любой текстовый формат (HTML, XML, CSV, LaTeX и т. Д.). У него нет определенного расширения, .html или.xml просто отлично.
Шаблон содержит переменные или выражения , которые заменяются значениями при оценке шаблона и тегами , которые управляют логикой шаблона.
Ниже приведен минимальный шаблон, который иллюстрирует несколько основ. Ниже мы расскажем о следующих деталях:
My Webpage
{{ a_variable }}Существует два типа разделителей: {% ... %} и {{ ... }} . Первый используется для выполнения таких операторов, как for-loops, последний печатает результат выражения в шаблоне.
Интеграция с IDE
Многие IDE поддерживают подсветку синтаксиса и автозаполнение для Twig:
- Textmate через пакет Twig
- Vim через плагин синтаксиса Jinja или плагин vim-twig
- Netbeans через плагин синтаксиса Twig (до 7.1, родной по 7.2)
- PhpStorm (родной от 2.1)
- Eclipse через плагин Twig
- Возвышенный текст через пакет Twig
- GtkSourceView через определение языка Twig (используется gedit и другими проектами)
- Coda и SubEthaEdit через синтаксический режим Twig
- Coda 2 через другой синтаксический режим Twig
- Комодо и Комодо Редактировать через режим Twid подсветки / синтаксиса
- Блокнот ++ через Notepad ++ Twig Highlighter
- Emacs через web-mode.el
- Atom через PHP-ветку для атома
- Код Visual Studio через пакет Twig
Реализация
Для удобства foo.bar выполняет следующие действия на уровне PHP:
- если нет, и если foo является объектом, проверьте, что bar является допустимым свойством;
- если нет, и если foo является объектом, проверьте, что bar является допустимым методом (даже если bar является конструктором - вместо этого используйте __construct());
- если нет, и если foo является объектом, проверьте, что getBar является допустимым методом;
- если нет, и если foo является объектом, проверьте, что isBar является допустимым методом;
- если нет, и если foo является объектом, проверьте, что hasBar является допустимым методом;
foo["bar"] с другой стороны, работает только с массивами PHP:
- проверьте, является ли foo массивом и bar действительный элемент;
- если нет, верните null значение.
Глобальные переменные
В шаблонах всегда доступны следующие переменные:
- _self: ссылается на текущее имя шаблона;
- _context: ссылается на текущий контекст;
- _charset: ссылается на текущую кодировку.
Установка переменных
Вы можете назначать значения для переменных внутри кодовых блоков. В назначениях используется тег set :
{% set foo = "foo" %} {% set foo = %} {% set foo = {"foo": "bar"} %}
фильтры
Переменные могут быть изменены фильтрами . Фильтры отделяются от переменной символом (|) и могут иметь необязательные аргументы в круглых скобках. Несколько фильтров могут быть скованы цепью. Выход одного фильтра применяется к следующему.
В следующем примере удаляются все теги HTML из name и заголовков:
{{ name|striptags|title }}
Фильтры, которые принимают аргументы, имеют круглые скобки вокруг аргументов. Этот пример присоединяется к списку через запятую:
{{ list|join(", ") }}
Чтобы применить фильтр к разделу кода, оберните его в тег filter :
{% filter upper %} This text becomes uppercase {% endfilter %}
Members
-
{% for user in users %}
- {{ user.username|e }} {% endfor %}
По умолчанию фильтр-победитель использует html стратегию, но в зависимости от контекста экранирования вы можете явно использовать любые другие доступные стратегии:
{{ user.username|e("js") }} {{ user.username|e("css") }} {{ user.username|e("url") }} {{ user.username|e("html_attr") }}
Работа с автоматическим экранированием
Независимо от того, включено ли автоматическое экранирование или нет, вы можете пометить раздел шаблона, который должен быть экранирован или нет, используя тег autoescape :
{% autoescape %} Everything will be automatically escaped in this block (using the HTML strategy) {% endautoescape %}
По умолчанию автоматическое экранирование использует стратегию экранирования html . Если вы выводите переменные в других контекстах, вам необходимо явно избежать их с помощью соответствующей стратегии экранирования:
{% autoescape "js" %} Everything will be automatically escaped in this block (using the JS strategy) {% endautoescape %}
Спасаясь
Иногда желательно или даже необходимо, чтобы Twig игнорировали части, которые иначе обрабатывались бы как переменные или блоки. Например, если используется синтаксис по умолчанию, и вы хотите использовать {{ качестве исходной строки в шаблоне и не запускать переменную, вам нужно использовать трюк.
Самый простой способ - вывести разделитель переменных ({{), используя переменное выражение:
{{ "{{" }}Для больших разделов имеет смысл отметить блок verbatim .
макрос
Макросы сопоставимы с функциями на обычных языках программирования. Они полезны для повторного использования часто используемых фрагментов HTML, чтобы не повторять себя.
{% if phone matches "/^[\\d\\.]+$/" %} {% endif %}
Оператор сдерживания
Оператор in выполняет тест на герметичность.
Он возвращает true если левый операнд содержится справа:
{# returns true #} {{ 1 in }} {{ "cd" in "abcde" }}
Наконечник
Вы можете использовать этот фильтр для выполнения теста сдерживания на строках, массивах или объектах, реализующих интерфейс Traversable .
Чтобы выполнить отрицательный тест, используйте оператор not in операторе:
{% if 1 not in %} {# is equivalent to #} {% if not (1 in ) %}
Оператор тестирования
Оператор выполняет тесты. Тесты могут быть использованы для проверки переменной на общее выражение. Правильный операнд - это имя теста:
{# find out if a variable is odd #} {{ name is odd }}
Тесты также могут принимать аргументы:
{% if post.status is constant("Post::PUBLISHED") %}
Тесты могут быть сведены на нет с помощью оператора is not:
{% if post.status is not constant("Post::PUBLISHED") %} {# is equivalent to #} {% if not (post.status is constant("Post::PUBLISHED")) %}
На сегодняшний день существует большое количество способов осуществить вывод на html страницу. Всё чаще и чаще для этих целей веб разработчики пользуются так называемыми шаблонизаторами. Сегодня мы рассмотрим небольшой пример использования шаблонизатора Twig.
Особенности Twig
- феноменально быстрая скорость работы (в сравнении с другими шаблонизаторами)
- компиляция шаблонов в хорошо оптимизированный PHP код
- применение “наследования” (можно определить базовый и дочерние шаблоны)
- позволяет создавать и использовать макросы
Установка
Существует множество способов установки Twig-a. Самый простой и быстрый - это скачивание компонента с GitHub , после чего архив необходимо распаковать, и перекинуть каталог lib в папку с нашим проектом.
Структура проекта
Ну а теперь давайте приступим к делу и рассмотрим структуру нашего небольшого проекта:
- compilation_cache
- lib
- Twig
- templates
- base.html
- books.html
- index.php
Весь функционал, связанный с подключением и настройкой Twig-а, содержится в файле index.php .
В папке templates мы будем хранить файлы шаблонов. В нашем случае, этих файлов 2: base.html с базовым html кодом и books.html с выводом списка книг.
В каталоге compilation_cache будут помещаться PHP файлы, созданные Twig-ом для работы.
Подключение и базовая конфигурация Twig-a
Итак, первое что нам необходимо сделать, так это подключить Twig:
Require_once "lib/Twig/Autoloader.php"; Twig_Autoloader::register();
После этого сообщаем шаблонизатору, где у нас хранятся файлы шаблонов. В качестве аргумента передаём путь к каталогу templates :
$loader = new Twig_Loader_Filesystem("templates");
Затем создаём объект шаблонизатора и указываем ещё несколько опций:
$twig = new Twig_Environment($loader, array("cache" => "compilation_cache", "auto_reload" => true));
Параметру cache передаём путь к каталогу compilation_cache . Активируем опцию auto_reload, для того чтобы при обновлении страницы Twig заново обрабатывал шаблоны, и мы видели изменения. Если этого не сделать, то шаблонизатор просто закэширует страницы. Когда же работа над проектом будет завершена, эту опцию можно убрать, чтобы ваши страницы закэшировались и грузились ещё быстрее.
Данные
Для реализации нашего небольшого примера, возьмём список книг и сформируем массив вида ключ - значение:
$books = array(array("number" => "Книга 1", "title" => "Гарри Поттер и философский камень", "date" => "30.06.1997"), array("number" => "Книга 2", "title" => "Гарри Поттер и Тайная комната", "date" => "2.07.1998"), array("number" => "Книга 3", "title" => "Гарри Поттер и узник Азкабана", "date" => "8.07.1999"), array("number" => "Книга 4", "title" => "Гарри Поттер и Кубок огня", "date" => "8.07.2000"), array("number" => "Книга 5", "title" => "Гарри Поттер и Орден Феникса", "date" => "21.07.2003"), array("number" => "Книга 6", "title" => "Гарри Поттер и Принц-полукровка", "date" => "16.07.2005"), array("number" => "Книга 7", "title" => "Гарри Поттер и Дары Смерти", "date" => "21.07.2007"));
Загрузка файла и передача данных
Для того чтобы передать данные в какой-то шаблон и вывести html результат, нам необходимо воспользоваться методом render(); В качестве первого аргумента передаём название файла шаблона, который будем выводить. В качестве второго -массив вида ключ - значение. В дальнейшем по заданным ключам мы будем получать доступ к нашим данным в самих шаблонах.
Echo $twig->render("books.html", array("books" => $books));
index.php
Общий вид файла index.php
Require_once "lib/Twig/Autoloader.php"; Twig_Autoloader::register(); $loader = new Twig_Loader_Filesystem("templates"); $twig = new Twig_Environment($loader, array("cache" => "compilation_cache", "auto_reload" => true)); $books = array(array("number" => "Книга 1", "title" => "Гарри Поттер и философский камень", "date" => "30.06.1997"), array("number" => "Книга 2", "title" => "Гарри Поттер и Тайная комната", "date" => "2.07.1998"), array("number" => "Книга 3", "title" => "Гарри Поттер и узник Азкабана", "date" => "8.07.1999"), array("number" => "Книга 4", "title" => "Гарри Поттер и Кубок огня", "date" => "8.07.2000"), array("number" => "Книга 5", "title" => "Гарри Поттер и Орден Феникса", "date" => "21.07.2003"), array("number" => "Книга 6", "title" => "Гарри Поттер и Принц-полукровка", "date" => "16.07.2005"), array("number" => "Книга 7", "title" => "Гарри Поттер и Дары Смерти", "date" => "21.07.2007")); echo $twig->render("books.html", array("books" => $books));
Настройка базового шаблона
Базовый шаблон представляет собой обычный html документ со специальными вставками:
В нашем главном шаблоне мы прописываем 2 блока: title и content. Названия блоков выбираем сами.
В последствии, в эти общие блоки мы будем внедрять характерную для дочерних страниц информацию.
Настройка шаблона вывода книг
Для начала в дочернем шаблоне нам необходимо указать шаблон родителя:
{% block title %}Серия романов о Гарри Поттере{% endblock %}
Затем, пишем содержание, которое внедрится в блок под названием content в базовом шаблоне:
{% block content %}
Серия романов о Гарри Поттере
Тут же в цикле for (Twig for) мы проходимся по всем книгам, которые передали в данный шаблон с помощью записи $twig->render("books.html", array("books" => $books)); и для извлечения значений обращаемся к элементам массива по ключам: {{book.number}}, {{book.title}} и так далее.
Таким образом, после срабатывания метода $twig->render("books.html", array("books" => $books)) , Twig подгрузит шаблон books.html и сформирует html содержание. Далее он распознает, что books.html - это дочерний шаблон base.html, и поместит сформированное содержание в базовый шаблон. После всего этого Twig вернёт нам полноценную html страницу.
Итог
Пример работы данного скрипта вы можете посмотреть в demo или скачать архив с готовым примером.
Ждём впечатлений в комментариях. Если вас заинтересовала данная тема, то в дальнейшем мы продолжим разговор о шаблонизаторе Twig.
В этой статье рассмотрим Twig теги - конструкции шаблонизатора, которые выполняют разнообразные задачи, такие как: условные операторы, циклы, экранирование данных, создание макросов, использование наследования шаблонов, запись в переменные и многое другое. В общем виде они записываются с помощью открывающего тега и закрывающего (именуется префиксом end). Закрывающий тег нужен не для всех конструкций. Пример абстрактного тега выглядит так:
{% tag %} {% endtag %}
Управляющие конструкции: условные операторы и циклы
Тег if
Тег if в Twig сравним с условным оператором if в PHP. В простейшей форме вы можете использовать его, чтобы проверить выражение на истинность:
{% if label_display == "after" %} {{ label }} {% endif %}
Вы также можете проверить массив или строку на существование:
{% if page.footer_fifth %}
{% endif %}Twig шаблонизатор предполагает дополнительные проверки в условиях:
empty - проверяет, является ли переменная пустой:
{# возвращает true, если переменная foo равна null, false, пустой массив, или пустая строка #} {% if foo is empty %} ... {% endif %} {# возможен вариант с оператором отрицания not #} {% if foo is not empty %} ... {% endif %}
even и odd - возвращает true если данное число является четным или нечетным, соответственно:
{{ if var is even }} ... {% endif %} {{ if var is odd }} ... {% endif %}
iterable - проверяет, является ли переменная массивом или объектом (экземпляром класса, имплементирующего интерфейс Traversable):
{% if users is iterable %} {% for user in users %} Hello {{ user.name }}! {% endfor %} {% else %} {# users вероятно являетcя строкой #} Hello {{ users }}! {% endif %}
null - возвращает true, если переменная равна NULL :
{{ if var is null }} ... {% endif %}
constant - проверяет, имеет ли переменная точно такое же значение, как константа. Вы можете использовать либо глобальные константы, либо константы класса:
{% if status is constant("MARK_NEW") %} {{ "New"|t }} {% elseif status is constant("MARK_UPDATED") %} {{ "Updated"|t }} {% endif %}
divisible - проверяет, делится ли переменная на число:
{% if loop.index is divisible by(3) %} ... {% endif %}
same as - проверяет, указывают ли две переменные на одну ячейку памяти. Аналогичен оператору эквивалентности === в php:
{% if foo.attribute is same as(false) %} foo.attribute эквивалентен значению "false" {% endif %}
defined - проверяет, определена ли переменная:
{# defined работает как с именами переменных #} {% if foo is defined %} ... {% endif %} {# так и с атрибутами переменных #} {% if foo.bar is defined %} ... {% endif %} {% if foo["bar"] is defined %} ... {% endif %}
В условиях можно использовать логические операторы and, or, not:
{% if not page %} {% if foo and bar %} {% if foo or bar %} {# Возможны и сложные составные условия #} {% if (a and b) or (c and d) %}
В условиях имеется возможность использовать регулярные выражения
{% if phone matches "/^[\\d\\.]+$/" %} {% endif %}
Можно также проверить, начинается ли или заканчивается строка с определенного символа:
{% if "Drupal" starts with "D" %} {% endif %} {% if "Drupal" ends with "l" %} {% endif %}
Также вы можете использовать более сложные выражения if-elseif (кстати switch-case в Twig отсутствует ):
{% if rows %}
Тег for
Тег for аналогичен конструкции for в php и осуществляет "перебор" элементов массива или свойств объекта, если объект является экземпляром класса, имплементирующего Traversable интерфейс.
В качестве примера рассмотрим шаблон поля и в нем перебор множественных значений поля:
{% for item in items %}
Переменные, доступные внутри цикла:
- loop.index - Текущая итерация цикла (начинается с 1)
- loop.index0 - Текущая итерация цикла (начинается с 0)
- loop.revindex - Количество итераций с конца цикла (начинается с 1)
- loop.revindex0 - Количество итераций с конца цикла (начинается с 0)
- loop.first - Флаг равный True, если текущая итерация является первой
- loop.last - Флаг равный True, если текущая итерация является последней
- loop.length - Количество элементов в последовательности
- loop.parent - Родительский контекст (используется для вложенных циклов)
В отличие от PHP нельзя прервать или продолжить цикл (continue и break). Однако можно создавать правила, позволяющие пропускать элементы по условиям for-if . В примере ниже неактивные пользователи пропускаются в итерациях:
-
{% for user in users if user.status %}
- {{ user.name }} {% endfor %}
Также в Twig возможна конструкция for-else для выполнения действий, если массив или объект оказался пустым:
-
{% for user in users %}
- {{ user.name }} {% else %}
- {{ no_found|t }} {% endfor %}
В Twig также возможны итерации с перебором и ключей, и значений
{% for key, value in values %}
Наследование шаблонов в Twig
Наследование шаблонов - одна из самых интересных особенностей в Twig. Наследование позволяет создавать базовые родительские шаблоны, которые потом можно будет использовать в дочерних шаблонах, при этом весь код родительских шаблонов доступен и в дочерних, а кроме того есть возможность переопределять некоторые блоки родительских шаблонов. Рассмотрим теги, которые позволяют реализовать наследование:
Тег extends
Рассмотрим использование наследования и тега extends на примере шаблона для блока block.html.twig и его дочерних шаблонов. Базовый родительский шаблон блока содержит код в упрощенном виде:
{{ label }}
{% endif %} {{ title_suffix }} {% block content %} {{ content }} {% endblock %}В шаблоне прописан код, который будет выводиться и в дочерних шаблонах. Содержимое шаблона, которое доступно для переопределения в дочерних шаблонах находится внутри тегов block. У каждой секции block имеется свое имя, которое будет использовано при переопределении. В данном примере есть только один блок с именем content. Весь код вне тегов block будет выведен как есть и его переопределить уже нельзя. Если в дочернем шаблоне вывод блока не будет переопределен, то код блока будет взят из базового шаблона. В качестве дочернего шаблона рассмотрим шаблон для блока с вкладками (в Drupal 8 они вынесены в отдельный блок) block--local-tasks-block.html.twig:
{# Будет унаследован block.html.twig из текущей темы #} {% extends "block.html.twig" %} {% block content %} {% if content %} {% endif %} {% endblock %}
Наследовать шаблоны можно также из модулей и других тем:
{# Будет унаследован block.html.twig из модуля block (core/modules/block/templates/block.html.twig) #} {% extends "@block/block.html.twig" %} {# Будет унаследован block.html.twig из темы classy из каталога block/ (core/themes/classy/templates/block/block.html.twig) #} {% extends "@classy/block/block.html.twig" %}
При переопределении блока родительского шаблона, содержимое из родительского блока перезаписывается, но если в блоке нужно выводить содержимое родительского блока, то используется Twig функция parent()
{% block content %}
Header
... {{ parent() }} {# Выведет содержимое родительского блока #} {% endblock %}Тег block
Блоки используются для реализации механизма наследования в качестве заполнителей как в родительском шаблоне, так и в дочерних (подробнее в разделе тега ). Имена блоков должны состоять из цифр, букв и символов подчеркивания. Использование тире не допускается.
Макросы в Twig
Макросы можно сравнить с функциями в языках программирования. Они нужны для многократного использования часто используемых частей html кода и при этом макросы могут принимать параметры, что позволяет динамически изменять вставляемый код. Статический же блок с html кодом можно сохранить с помощью тега set. Макросы отличаются от php функций следующими особенностями:
- аргументы по умолчанию в макросах задаются внутри тела макроса;
- аргументы в макросах всегда являются опциональными (необязательными);
- если в макрос передается больше аргументов, чем описано параметров, то все они будут содержаться в переменной varargs.
Как и php функции макросы не имеют доступа к глобальным переменным шаблона. Для передачи переменных из шаблона при необходимости нужно использовать специальная переменную _context.
Тег macro
Тег macro определяет новый макрос. В качестве простейшего примера рассмотрим макрос, который рендерит элемент формы input, при этом input type, name, value, size макрос содержит в качестве параметров (type и size задаются по умолчанию):
{% endmacro %}
{# Импортируем макросы из forms.html.twig в текущий шаблон #} {% import "forms.html" as forms %} {# Вызываем макрос #}
{{ forms.input("username") }}
Если макрос определен и используется в одном и том же шаблоне, то для его импорта используется специальная переменная _self.
{% import _self as forms %}
{{ forms.input("username") }}
Если нужно использовать макрос в другом макросе, но в том же самом шаблоне, то макрос импортируется локально внутри другого макроса:
{% macro input(name, value, type, size) %} {% endmacro %} {% macro wrapped_input(name, value, type, size) %} {% import _self as forms %}
В Drupal 8 в шаблоне menu.html.twig макрос menu_links() определяется и используется в одном и том же шаблоне и дополнительно сам макрос используется рекурсивно внутри самого себя для вывода вложенных пунктов меню:
{% import _self as menus %} {{ menus.menu_links(items, attributes, 0) }} {% macro menu_links(items, attributes, menu_level) %} {% import _self as menus %} {% if items %} {% if menu_level == 0 %}
-
{% else %}
- {{ link(item.title, item.url) }} {% if item.below %} {{ menus.menu_links(item.below, attributes, menu_level + 1) }} {% endif %} {% endfor %}
- Username
- {{ forms.input("username") }}
- Password
- {{ forms.input("password", null, "password") }}
- Username
- {{ input_field("username") }}
- Password
- {{ input_field("password", "", "password") }}
- {{ item }} {% endfor %}
- {{ item }} {% endfor %}
-
{% endif %}
{% for item in items %}
Тег import
Тег import импортирует все макросы из указанного шаблона:
{# forms.html.twig #} {# Описываем макрос input() #} {% macro input(name, value, type, size) %} {% endmacro %} {# Описываем макрос textarea() #} {% macro textarea(name, value, rows, cols) %} {% endmacro %} {# Импортируем в другой шаблон макросы из forms.html.twig #} {% import "forms.html" as forms %}
{{ forms.textarea("comment") }}
Тег from
Тег from импортирует только указанные макросы из шаблона:
{# Импортируем из forms.html.twig макросы: input() с алиасом input_field и textarea() #} {% from "forms.html" import input as input_field, textarea %}
{{ textarea("comment") }}
Тег include
Тег include включает в себя имя шаблона и возвращает отображаемое содержимое этого файла в текущий шаблон. Все переменные текущего шаблона будут доступны в подключаемых шаблонах. С помощью include можно некоторые блоки кода вынести в отдельные шаблоны:
{# header.html.twig #}
Можно добавить дополнительные переменные, передавая их после with:
{# template.html.twig будет иметь доступ к переменным из контекста текущего шаблона и добавленным переменным #} {% include "template.html" with {"foo": "bar"} %} {% set vars = {"foo": "bar"} %} {% include "template.html" with vars %} {# Можно также добавлять несколько переменных #} {% include "template.html" with {"foo": var1, "bar" : var2} %} {# Будут доступны в template.html.twig переменные foo и bar #}
Или можно отключить доступ к контексту путем добавления only.
{# Только foo переменная будет доступна в template.html.twig #} {% include "template.html" with {"foo": "bar"} only %} {# В template.html.twig доступа к переменным не будет #} {% include "template.html" only %}
Вы можете отменить include при помощи инструкции ignore missing, и тогда Twig будет игнорировать подключение несуществующего шаблона. Размещается инструкция ignore missing сразу за именем шаблона:
{% include "sidebar.html" ignore missing %} {% include "sidebar.html" ignore missing with {"foo": "bar"} %} {% include "sidebar.html" ignore missing only %}
Можно предоставить и список шаблонов, которые проверяются на предмет существования до включения.
{% include ["page_detailed.html", "page.html"] %} {% include ["special_sidebar.html", "sidebar.html"] ignore missing %}
Пример использования include в Drupal 8 можно посмотреть в шаблоне темы Classy links--node.html.twig:
{% if links %}
Тег set
Внутри шаблонов можно создавать переменные с помощью тега set:
{# Записываем в переменную строку #} {% set foo = "foo" %} {# Записываем в переменную массив #} {% set foo = %} {# Записываем в переменную ассоциативный массив #} {% set foo = {"foo": "bar"} %} {# символ ~ осуществляет конкатенацию строк #} {% set foo = "foo" ~ "bar" %} {# Результат: foo содержит "foobar" #} {% set foo, bar = "foo", "bar" %} {# Создано две переменных foo и bar #}
С помощью тега set в переменную можно записать блок кода:
{% set foo %}
Тег spaceless
Тег spaceless можно использовать для удаления пробелов между HTML-тегами, а также содержимого внутри HTML-тегов или пробелов в простом тексте:
{% spaceless %}
Тег autoescape
В зависимости от того, включено или нет автоматическое экранирование, вы можете отметить фрагмент шаблона для экранирования или же отключить эту функцию, используя тег autoescape (в Drupal 8 автоэкранирование включено в контексте html):
{% autoescape %} Автоэкранирование в этом блоке осуществляется методами HTML. {% endautoescape %} {% autoescape "html" %} Автоэкранирование в этом блоке осуществляется методами HTML. {% endautoescape %} {% autoescape "js" %} Автоэкранирование в этом блоке осуществляется методами js. {% endautoescape %} {% autoescape false %} Автоэкранирование отключено. Содержимое блока выводится без изменений. {% endautoescape %}
Тег verbatim
Тег verbatim маркирует секцию и сообщает шаблонизатору не обрабатывать содержимое блока:
{% verbatim %}
-
{% for item in items %}
-
{% for item in items %}
Тег filter
Тег filter позволяет применять стандартные фильтры шаблонизатора Twig для блоков данных шаблонов. Просто разместите код внутри секции "filter":
{% filter upper %} Drupal 8 {% endfilter %} {# Результат: "DRUPAL 8" #}
Можно также создавать комбинации фильтров:
{% filter lower|escape %} SOME TEXT {% endfilter %} {# Результат: "some text" #}
Если в теге используется фильтры escape или e, то drupal их заменит на свой фильтр drupal_escape .
Тег do
Тег do работает так же, как стандартное выражение с переменной {{ var }} , с той разницей, что ничего не выводится. На практике применим, если нужно вызвать функцию или метод объекта, которые что либо могут возвращать или выводить, но в выводе шаблона эти данные не нужны отображать.
{% do 1 + 2 %} {% do product.delete() %}
Тег trans
Тег trans специфичен для Drupal 8. Этот тег позволяет переводить текст (используя токены) внутри тега используя функцию t() или TranslationManager::formatPlural() , если внутри тега использована конструкция {% plural ... %} :
{% trans %}Submitted by {{ author.name }} on {{ node.date }}{% endtrans %}
, | |
Что такое Twig?
Скачайте инсталлятор Composer в root-папку приложения (twig):
cd /var/www/twig
curl -s http://getcomposer.org/installer | php
Это загрузит файл по имени composer.phar, который является исполняемым файлом Composer. Затем создайте файл с названием composer.json:
nano composer.json
И внесите в него следующий код:
{
"require": {
"twig/twig": "1.*"
}
}
Благодаря этому коду приложение будет зависить от движка шаблонов Twig. Теперь давайте использовать команду composer, чтобы установить зависимости:
php composer.phar install
Теперь файлы Twig загружены в папку vendor/Twig. Если добавить других зависимостей, они также будут установлены в папке vendor.
Теперь нужно «подключить» этот файл к приложению. Опять же, можно использовать функцию автозагрузчика Composer, чтобы загрузить все установленные зависимости. Откройте файл app.php:
nano app/app.php
Удалите все его содержимое и внесите эту строку:
Данная строка загрузит автозагрузчик Composer, который, в свою очередь, загрузит Twig. Если Twig был установлен другим способом, понадобится автозагрузчик Twig:
require_once "/path/to/lib/Twig/Autoloader.php";
Twig_Autoloader::register();
При использовании Composer в этом нет необходимости.
Под командой require нужно поместить файл шаблона Twig и задать переменную, которую нужно вывести на страницу. Вставьте следующий код:
render("page.html", array("text" => "Hello world!")); ?>
Во-первых, это создаст объект загрузчика, которому передается путь к папке, содержащей файлы шаблонов (пустая на данный момент папка views была создана ранее). Кроме того, этот код также создаст объект среды, в котором хранится конфигурация. В завершение, строка render объекта среды загружает файл шаблона, заданный в качестве первого аргумента и визуализирует его с учетом переменных, заданных в качестве второго аргумента. Теперь нужно создать файл page.html, в который можно внести переменные, содержащие текст, который нужно отобразить.
nano views/page.html
В него внесите следующее:
{{ text }}
Если сохранить этот файл и перезапустить файл app.php в браузере, на страницу будет выведен текст, взятый в теги Н1. Теперь, создав этот файл, можете поэкспериментировать с ним. Переменные, заданные через функцию render, теперь можно вносить в фигурные скобки.
Ради эксперимента можете передать несколько переменных шаблону, использовать их в управляющих структурах, обработать их с помощью функций шаблонов или применить фильтры Twig.
Итоги
Это руководство продемонстрировало установку Twig через Composer, а также вывод на экран простых переменных с помощью отдельных файлов шаблонов. этой серии более подробно рассматривает использование синтаксиса Twig для разработки файлов шаблонов.
Tags: ,