• урок
  • pantey

Drupal 8 – Программное создание блока

21.06.2017

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

Сегодня мы займемся созданием  кастомного блока из своего модуля.

Система блоков теперь имеет по сути, 2 отдельных API

  1. Plugin API – позволяет создавать блоки
  2. 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

После описания модуля, вы сразу же увидите свой модуль в списке модулей.

custom_block_drupal8_1.png

Можем сразу его активировать. Далее для создания блока, нам необходимо реализовать плагин (по стандарту 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 – добавляет возможность перевода строки на другие языки системы.

Если у вас модуль был активирован, то чистим кеш сайта и далее идем по пути «Структура – Схема блоков» и выводим наш кастомный блок в необходимый регион

custom_block_drupal8_2.png

И смотрим результат

custom_block_drupal8_3.png

Как вы могли заметить при создание кастомного блока, использовалось минимум кода, больше никаких hook_block_info и hook_block_view. Думаю на этом можно пока закончить.

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

Скачать

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

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

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

Приветствую, столкнулся с проблемой генерации этого блока в коде, если блок размещен в схеме блоков то конструкция $block = \Drupal\block\Entity\Block::load('id блока'); корректно его подгружает, но как его корректно вызвать/зарегистрировать при отсутствии его фактического размещения в схеме блоков?

Profile picture for user pantey
pantey
24.12.2017

Это происходит потому, что необходим экземпляр блока, который создается при создании блока в Схеме блоков. Здесь описан способ, как получить блок без экземпляра, - сам не пробовал

Profile picture for user 1541
nnnn
27.12.2017

Не подскажите как динамически выводить контент в блоке ? Допустим я хочу выводить id сесси , это работает корректно лишь при добавление блока , код класса такой :

class SimpleBlockExample extends BlockBase {
    /**
     * Implements hook_user_login().
     */

   public function db_connect(){
        $account = \Drupal::currentUser();
        $uid = $account->id();
        $query = \Drupal::database()->select('sessions', 'sessions');
        $query->addField('sessions', 'sid');
        $query->condition('sessions.uid', $uid);
        $output = $query->execute()->fetchField();

       drupal_set_message('IZ CLASSA');

        return $output;


    }


  /**
   * {@inheritdoc}
   *  Implements hook_user_login().
   */

    public function build(){
        $output = $this->db_connect();
        print_r($output);


        return array(
            '#type' => 'markup',
            '#markup' => "$output",
        );


    }
    }
Profile picture for user pantey
pantey
28.12.2017

насколько помню, сессия в объект пользователя хранится. Бери оттуда. Не корректно отображаться, может только из кэширования блока

Profile picture for user 1541
nnnn
04.01.2018

да дело было в кеше спасибо