Drupal 8 темизация блока: добавить html, классы, изменить вывод блока

Drupal: 
Уровень сложности: 

Блоки в Drupal 8 создаются пользователем или модулями и отображаются в регионах.
Если необходимо управлять выводом блока Меню, Представления, тогда необходимо пользоваться хуком.
Следующий код позволяет темизировать блоки, влиять на содержимое блоков, созданных модулями или пользователем, учитывая переменные окружения (id блока, роль пользователя, тип страницы, разрешение экрана и т.д.)

Темизация блоков с hook_theme_suggestions_block_alter()

Хуком hook_theme_suggestions_block_alter() можно пользоваться в своём модуле или теме, подставив название темы или модуля вместо слова hook.
Идея suggestion (перевод: предложение) - предложить системе Drupal использовать определённые пользователем файлы шаблонов Твиг для вывода блоков. Проверяя содержимое переменой $variables, можно определить нужный блок или группу блоков и назначить им свой дополнительный файл шаблона block--mycooltemplate.html.twig

Для работы с блоком нужно следующее:

  1. Вставить хук в тему или модуль
  2. Определить собственный файл шаблона

Например, для изменения отображения блока, созданного модулем Hierarchical Taxonomy Menu, в теме themy хук определяется так:

  1. function themy_theme_suggestions_block_alter(array &$suggestions, array $variables) {
  2. if ($variables['elements']['#id'] == 'block-hierarchicaltaxonomymenu') {
  3. $suggestions[] = 'block__menu'; //show block using file block--menu.html.twig
  4. }
  5. }

Обратите внимание, в хуке используется нижнее подчёркивание block__menu, но это предложение будет указывать на имя файла, содержащее дефисы: block--menu.html.twig.

Далее нужно скопировать файл core/modules/block/templates/block.html.twig в папку templates темы, в данном случае так: /themes/themy/templates/block--menu.html.twig и добавить нужный html-код, классы или управлять отображением программно.

 

Предложенный хук также может влиять на отображение страниц hook_theme_suggestions_page_alter() или материалов hook_theme_suggestions_node_alter()

 

Другой полезный хук: template_preprocess_block()

 

Редактирование дизайна в Drupal 8

При редактировании дизайна необходимо сбрасывать кэш, чистить историю браузера и отключать кэширование Твиг.