1 минута
Темизация на Drupal 8 с использованием шаблонизатора Twig
В Drupal 7 при разработке темы стандартным шаблонизатором применялся созданный Адрианом Россоувом движок PHPTemplate. С выходом Drupal 8 и интеграцией с проектом Symfony 2, темизация выходит на новый уровень абстрактности, и все благодаря встроенному компилируемому обработчику шаблонов на языке PHP - Twig.
Основы темизации с Twig
Для Drupal разработчика это нововведение означает полный отказ от использования PHP-кода в шаблонах темы. Однако синтаксис Twig настолько простой и удобный, что время на разработку шаблонов сокращается в несколько раз.
В CMS Drupal 8 основной файл, в котором размещался PHP-код логики темы - template.php (Drupal 7), теперь имеет другое название и расширение – название_темы.theme.
Файлы шаблона теперь имеют вид общий вид: тип_шаблона.html.twig (например, page.html.twig, node.html.twig или comment.html.twig) и используют весь синтаксис компилятора Twig.
Так, например, в Drupal 7 в шаблоне page.tpl.php , у нас есть базовый код, который отображает регион блока:
С Twig в Drupal 8, общий вид шаблона page.html.twig шаблона теперь имеет такой вид:
{% if page.preface_first %}
{{ page.preface_first }}
{% endif %}
Как вы видите, теперь мы не должны использовать файлы с расширением .tpl.php, все файлы шаблонов должны быть переименованы в соответствующий формат с расширением .html.twig. Кроме того Twig значительно упрощает способ отображения переменных. Так, переменные print render($page['some_var']) или print render($content['some_var']), имеют упрощенный вид {{ page.some_var }} {{ content.some_var }} или просто simply {{ some_var }} в зависимости от использования функции.
Таким образом, мы имеем следующие ключевые изменения темизации для перехода из Drupal 7 в Drupal 8:
1) MYTHEME.info > MYTHEME.info.yml
2) Шаблон template.php > MYTHEME.theme
3) template_name.tpl.php > template_name.html.twig
Еще одним значительным изменением в шаблонах заключается в том, что атрибуты и классы массивов были объединены в атрибуты объекта. Если в Drupal 7 это выглядело так:
class=""
Используя Twig это будет показать другим образом:
class="{{ classes }}"{{ attributes }}
Однако, правильным вариантом будет использованием кода такого вида:
class="{{ attributes.class }}" {{ attributes }}
Работа с файлом .info в Drupal 8
Другим важным изменением в создании темы для Drupal 8 стал новый информационный файл с расширением .info. Теперь он написан в формате YAML и анализируется специальным компонентом Symfony YAML.
Для примера сравним вид файла .info в Drupal 7:
; Stylesheets
stylesheets[all][] = css/style.css
На мой взгляд, в Drupal 8 подключение новых стилей имеет более читабельный вид:
stylesheets:
all:
- css/layout.css
- css/style.css
- css/colors.css
Изменения в API
На данный момент готового API для Drupal 8 нет. Но уже сейчас многие устаревшие функции Drupal 7 либо не работают, либо будут вызывать ошибки. Для тестирования и отладки перехода на новую темизацию можно использовать инструмент PhpStorm, благо он поддерживает практически все версии API Drupal.
Например, функции drupal_add_js и drupal_add_css являются устаревшими, поэтому вы должны использовать метод #attached, который добавляет пользовательские JS-скрипты для вашей темы. Drupal 8, по умолчанию, будет использовать новый метод подгрузки определенных JS-скриптов для анонимных пользователей. Это сильно повлияет на производительность различных веб-решений. Используя функцию hook_library_info можно создавать несколько зависимостей для подгрузки таких вещей как jQuery.once и Drupal JS.