Как, вы наверное знаете, в Drupal 8 блоки тоже стали сущностями – я уже говорил, что это то, что действительно не хватало в 7й версии движка, т.е. мы можем создавать определённый тип блока со своими набором полей, что избавило нас от написания своих кастомных модулей, когда необходимо было реализовать дополнительное поле блока.
Помимо выше перечисленных преимуществ, вы столкнетесь с тем, что из всего разнообразия шаблонов переопределения блока, вы не найдете шаблон, который бы определял форматирование для типа блока.
Как всегда, разберемся с этим на конкретном примере. Я создал свой тип блока, в моем случае – testing-bock
Теперь создадим блок и выведем его в любой регион нашего сайта
Я вывел его в основное содержимое страницы. Теперь посмотрим на список шаблонов, которые нам доступны по умолчанию
Кстати, кто не в курсе как включить отладку в Drupal 8, то идем сюда. Как мы видим, нам доступны следующие шаблоны:
- block--testingblock.html.twig – шаблон переопределяет блок по ID блока
- block--block-content--39e5fa3a-79f6-42dd-8857-fcdbec376e44.html.twig – шаблон переопределяет блок по его Uniqid
Хочу заметить, что Uniqid – это уникальный ID блока, который генерируется в момент создания блока, является уникальным и никогда не повторяется, соответственно у вас он будет отличаться.
- block--block-content.html.twig – шаблон переопределяет блок, исходя из региона в котором находится, в данном случает регион - content
- block.html.twig – базовый шаблон блоков по умолчанию, определяет вывод всех блоков сайта
Итак, видим что нет шаблона, который переопределял бы наш блок исходя из его типа. Давайте это исправим. Для этого создадим модуль, я назову его – template_block_type
Файл template_block_type.info.yml
name: Template block type
description: Данный модуль добавляет TWIG шаблон для переопределения блока по его типу
core: 8.x
package: Drupalfly
type: module
Файл template_block_type.module
<?php
use \Drupal\block_content\BlockContentInterface;
/**
* Implements hook_theme_suggestions_HOOK_alter().
*/
function template_block_type_theme_suggestions_block_alter(array &$suggestions, array $variables) {
if (isset($variables['elements']['content']['#block_content']) && $variables['elements']['content']['#block_content'] instanceof BlockContentInterface) {
$suggestions[] = 'block__block_content_' . $variables['elements']['content']['#block_content']->bundle();
}
}
Активируем модуль и проверяем список доступных шаблонов.
Как видим, нам стал доступен шаблон
block--block-content-testing-bock.html.twig
Где,
- testing-bock – это «машинное имя» нашего типа блока
Теперь вы можете создать файл с данным названием в вашей теме и работать с ним, как с обычным twig шаблоном.
На этом можно закончить.
Скачать модуль, используемый в статье
Комментарии (3)
1. Зачем нам нужно убеждаться, что объект является экземпляром класса(речь о этом куске кода instanceof BlockContentInterface) ?
2. После всех этих действий мы еще можем создать препроцесс и в нем определить переменные, которые будем использовать в
block--block-content-testing-bock.html.twig?
Спасибо за то, что отвечаете)
1.Можно и опустить данную проверку, но мы должны убедиться, что ['#block_content'] сформирован именно BlockContentInterface для изменения шаблона. Посмотреть на данный интерфейс можно по пути core/modules/block_content/BlockContentInterface.php
2.Для создания своих переменных - вам лучше использовать свою функцию темизации определённую в hook_theme(), где укажите список необходимых переменных в шаблоне.
Отличный модуль.
Только возникла проблема.
Если я создал шаблон типа блока, а потом захотел создать шаблон конкретного блока. то конкретного блока не работает. Т.е. главный шаблон по типу блока, а не по айди блока.
Как это исправить? необходимо, что бы важнее был айди, а не тип блока