Как вам известно, в Drupal 8 блоки, тоже стали сущностями – это означает, что мы может создать «Тип блока» и добавлять для каждого типа блока свой набор полей, - это то, что действительно не хватало в Drupal 7, когда поля для блоков можно было реализовать только написанием кастомного модуля.
Сегодня мы займемся созданием кастомного блока из своего модуля.
Система блоков теперь имеет по сути, 2 отдельных API
- Plugin API – позволяет создавать блоки
- Entity API – позволяет управлять настройками блока и определять настройки видимости блока
Итак, приступим, наш модуль будет называться custom_block. Из чего состоит пользовательский модуль в Drupal 8 – останавливаться не будем, уже проходили, напомню только, что все кастомные модули должны находиться по пути
module/custom
Файл custom_block.info.yml
name: Example custom block drupal 8
description: Простой пример создания блока в Drupal 8
core: 8.x
type: module
dependencies:
- block
После описания модуля, вы сразу же увидите свой модуль в списке модулей.
Можем сразу его активировать. Далее для создания блока, нам необходимо реализовать плагин (по стандарту PSR-4), который должен быть размещён по пути
module_name/src/Plugin/Block
Хочу заметить, что название файла должно соответствовать исполняемому классу.
Создаем файл CustomBlock.php по данному пути и напишем реализацию класса с одноименным именем в данном файле
Файл CustomBlock.php
<?php
/**
* @file
* Contains \Drupal\custom_block\Plugin\Block\CustomBlock.
*/
namespace Drupal\custom_block\Plugin\Block;
use Drupal\Core\Block\BlockBase;
/**
* Provides a custom_block.
*
* @Block(
* id = "custom_block",
* admin_label = @Translation("Custom block"),
* category = @Translation("Custom block example")
* )
*/
class CustomBlock extends BlockBase {
/**
* {@inheritdoc}
*/
public function build() {
return array(
'#type' => 'markup',
'#markup' => 'This custom block content.',
);
}
}
Хочу заметить, что метод build, всегда должен возвращать массив, с указанием типа контента.
Хочу заметить, что для реализации плагинов, добавление аннотации является обязательным, иначе вы не увидите свой блок в списке блоков.
Аннотация @Block
- Id – Возвращает ID блока
- admin_label – Возвращает заголовок блока на странице управления блоками
- category – Определяет категорию блока
Аннотация @Translation – добавляет возможность перевода строки на другие языки системы.
Если у вас модуль был активирован, то чистим кеш сайта и далее идем по пути «Структура – Схема блоков» и выводим наш кастомный блок в необходимый регион
И смотрим результат
Как вы могли заметить при создание кастомного блока, использовалось минимум кода, больше никаких hook_block_info и hook_block_view. Думаю на этом можно пока закончить.
Скачать модуль используемый в примере
Комментарии (5)
Приветствую, столкнулся с проблемой генерации этого блока в коде, если блок размещен в схеме блоков то конструкция $block = \Drupal\block\Entity\Block::load('id блока'); корректно его подгружает, но как его корректно вызвать/зарегистрировать при отсутствии его фактического размещения в схеме блоков?
Это происходит потому, что необходим экземпляр блока, который создается при создании блока в Схеме блоков. Здесь описан способ, как получить блок без экземпляра, - сам не пробовал
Не подскажите как динамически выводить контент в блоке ? Допустим я хочу выводить id сесси , это работает корректно лишь при добавление блока , код класса такой :
насколько помню, сессия в объект пользователя хранится. Бери оттуда. Не корректно отображаться, может только из кэширования блока
да дело было в кеше спасибо