Темизация на Drupal 8 с использованием шаблонизатора Twig

Время чтения
меньше чем
1 минута
Прочитано

Темизация на Drupal 8 с использованием шаблонизатора Twig

декабря 17, 2013 - 00:03
0 комментариев

В Drupal 7 при разработке темы стандартным шаблонизатором применялся созданный Адрианом Россоувом движок PHPTemplate. С выходом Drupal 8 и интеграцией с проектом Symfony 2, темизация выходит на новый уровень абстрактности, и все благодаря встроенному компилируемому обработчику шаблонов на языке PHP - Twig.

Темизация Drupal 8

Основы темизации с 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 , у нас есть базовый код, который отображает регион блока:

 <?php if (!empty($page['preface_first'])): ?>
      <?php print render($page['preface_first']); ?>
  <?php endif; ?>

С 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="<?php print $classes; ?>"<?php print $attributes; ?>

Используя 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.

Теги: 

Добавить комментарий

CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.