...

пятница, 27 декабря 2013 г.

[Перевод] Портирование contrib темы в Drupal 8: Получение Twig-темы

В свободное время последних нескольких месяцев я был очень занят портированием моей Drupal темы, Gratis (ссылка дана мной), в Drupal 8. Процесс идёт хорошо, и большинство вещей уже работают так, как они реализованы в Drupal 7, но этот процесс повлёк за собой радикальную переработку архитектуры темы по двум основным причинам:


  1. Twig теперь основа темизации для Drupal 8, обработчик шаблонов PHP Template бывший одним из основных для Druapl темизации в течение многих лет, ушёл.

  2. Как и в большинстве последних major версиях Drupal, API для Drupal 8 снова изменился и это прямо влияет на то как вы делаете что-то в контексте темизации.






Темизация и Twig



Что всё это значит? Во-первых, вы больше не можете использовать PHP-код в темизации, это всё Twig. Twig упрощает темизацию и облегчает понимание. В Drupal 8 старый файл template.php теперь становится файлом .theme вашей темы, содержащий специальный PHP-код, который рендерится из Twig переменных в twig шаблон. Синтаксис Twig легко понять.

Например, в page.tpl.php Drupal 7 у нас есть базовый код, который отображает блок в регионе:

<?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 %}




Итак, как вы видите, с Twig больше нет «tipple fips» (.tpl.php файлов). Наименование .html.twig теперь постоянно для всех шаблонов тем. В общем Twig значительно упрощает путь обработки переменных. Итак, теперь там где вы использовали

print render($page['some_var'])

или

print render($content['some_var'])

теперь просто используйте

{{ page.some_var }}

или просто

{{ some_var }}

в зависимости от использования и расположения.

Вот ключевые соглашения об именах файлов, которые были изменены в Drupal 8:

Drupal 7 > Drupal 8


  • MYTHEME.info > MYTHEME.info.yml

  • template.php > MYTHEME.theme

  • template_name.tpl.php > template_name.html.twig




Я был удивлён тому, что theme-settings.php не был переименован и как это работает рука об руку с тем, что раньше было template.php. Также не многое изменилось в theme-settings.php, обычно это работает из Drupal 7 без изменений, хотя я не мог найти страницу с описанием API function system_theme_settings для Drupal 8.

Другое большое изменение в шаблонах это то, что массивы атрибутов и классов были объединены вместе в объект атрибутов. Перед тем, как рендерить глобальные классы и атрибуты для body, нод и комментариев как:



class="<?php print $classes; ?>"<?php print $attributes; ?>


… если преобразовать которые слово в слово для Twig, то получится:

class="{{ classes }}"{{ attributes }}


Однако, это не совсем рабочий вариант, на самом деле по новому это объявляется так:

class="{{ attributes.class }}" {{ attributes }}


Для краткости, вы можете просто сделать так:

{{ attributes }}




… без вывода конкретных классов, эта одна переменная делает всё. Я предпочитаю первый метод, так как это позволяет задать тегу свои собственные классы темы, если хотите, такие как clearfix или любой другой.
info файл темы



Другим важным изменением относящемся к темизации в Drupal 8, является оформление info файла. Теперь он оформляется в YAML стиле и анализируется компонентом Symfony YAML. Преобразование info файла для Drupal 7 было довольно тривиально. Я взглянул на реализацию в Bartik и использовал его в качестве руководства, что бы узнать достаточно для преобразования Gratis. Например, что было раньше:

; Stylesheets
stylesheets[all][] = css/style.css




теперь будет выглядеть так:

stylesheets:
all:
- css/style.css




Ещё одна проблема с которой я столкнулся при портировании Gratis, это то, что казалось было много конфликтных совпадений классов между новой админ панелью Drupal 8 и Gratis. Кажется, что админ панель использует для темизации некоторые весьма общие классы, такие как ul.menu. В конце концов, я просто указал более конкретные классы в своей теме, чтобы избежать конфликтов.

В общем, я не нашёл полноценной документации по темизации в Drupal 8, мне пришлось покопаться в файлах основных тем Drupal 8, что бы понять как это всё работает.

Изменения в API



Конвертирование шаблонов тем в Twig довольно тривиально, обновление пользовательского кода template.php в MYTHEME.theme не очень. Основа преобразования этих функций в том, что некоторые их них не рекомендуются, они по прежнему работают, но в конце концов от этого уйдут. Другие функции просто не будут работать и будут выбрасывать ошибки, как изменилось для них API — полностью или есть новые функции, на которые их нужно заменить. PhpStorm имеет приятный визуальный индикатор устаревших в Drupal 8 функций, это действительно очень удобно.

Например drupal_add_js и drupal_add_css являются устаревшими, так что вы должны будете использовать #attached метод для добавления любого пользовательского JS для вашей темы. Drupal 8 теперь очень «худой», что означает то, что он по умолчанию не загружает много Javascript для анонимных пользователей, так что теперь вы должны будете использовать hook_library_info для создания зависимостей для загрузки вещей типа jQuery.once или даже drupal.js.


P.S.

Это мой вольный перевод статьи Danny EnglanderPorting a Contrib Theme to Drupal 8: Get Twig-gy With It


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.


Комментариев нет:

Отправить комментарий