• статья
  • pantey

Drupal 8 - Добавляем TWIG шаблон для типа блока

21.07.2017

Как, вы наверное знаете, в Drupal 8 блоки тоже стали сущностями – я уже говорил, что это то, что действительно не хватало в 7й версии движка, т.е. мы можем создавать определённый тип блока со своими набором полей, что избавило нас от написания своих кастомных модулей, когда необходимо было реализовать дополнительное поле блока.

Помимо выше перечисленных преимуществ, вы столкнетесь с тем, что из всего разнообразия шаблонов переопределения блока, вы не найдете шаблон, который бы определял форматирование для типа блока.

Как всегда, разберемся с этим на конкретном примере. Я создал свой тип блока, в моем случае – testing-bock

add-twig-templates-for-type-block-drupal-8.png

Теперь создадим блок и выведем его в любой регион нашего сайта

add-twig-templates-for-type-block-drupal-8-1.png

Я вывел его в основное содержимое страницы. Теперь посмотрим на список шаблонов, которые нам доступны по умолчанию

add-twig-templates-for-type-block-drupal-8-2.png

Кстати, кто не в курсе как включить отладку в 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();
  }
}

Активируем модуль и проверяем список доступных шаблонов.

add-twig-templates-for-type-block-drupal-8-3.png

Как видим, нам стал доступен шаблон

block--block-content-testing-bock.html.twig

Где,

  • testing-bock – это «машинное имя» нашего типа блока

Теперь вы можете создать файл с данным названием в вашей теме и работать с ним, как с обычным twig шаблоном.

На этом можно закончить.

Скачать модуль, используемый в статье

Скачать

-->
Узнавай о новых статьях сайта - первым. Просто подпишись на рассылку.

Комментарии (3)

Profile picture for user 1541
Александр
16.08.2017

1. Зачем нам нужно убеждаться, что объект является экземпляром класса(речь о этом куске кода instanceof BlockContentInterface) ?

2. После всех этих действий мы еще можем создать препроцесс и в нем определить переменные, которые будем использовать в

block--block-content-testing-bock.html.twig?

 

Спасибо за то, что  отвечаете)

Profile picture for user pantey
pantey
17.08.2017

1.Можно и опустить данную проверку, но мы должны убедиться, что  ['#block_content'] сформирован именно  BlockContentInterface для изменения шаблона. Посмотреть на данный интерфейс можно по пути core/modules/block_content/BlockContentInterface.php

2.Для создания своих переменных - вам лучше использовать свою функцию темизации определённую в hook_theme(), где укажите список необходимых переменных в шаблоне.

Profile picture for user 1541
Александр
05.03.2018

Отличный модуль. 
Только возникла проблема.
Если я создал шаблон типа блока, а потом захотел создать шаблон конкретного блока. то конкретного блока не работает. Т.е. главный шаблон по типу блока, а не по айди блока. 

Как это исправить? необходимо, что бы важнее был айди, а не тип блока