Создать блок программно на Drupal 8

Модуль в Drupal 8

Для программного создания блока, нам понадобится модуль, который будет отвечать за вывод и настройку этого блока. 

Первое с чего стоит начать - создать описание модуля: файл block_example.info.yml, в котором будет информация о нашем модуле:

name: Block example
type: module
description: 'Create blocks.'
package: Dribbit examples
core: 8.x
dependencies:
  - block

Ну и естественно файл block_example.module, в котором мы напишем:

/**
 * @file
 * Currently (24/08/2017), Drupal needs this blank file.
 */

Теперь можно приступить к созданию самого блока:

Блок в Drupal 8

В Drupal 8 блоки практически преобразовались в плагины. Теперь они представляют собой функциональные элементы, которые можно использовать в разных местах.

Создадим простой тип блока, который выводит на экран по умолчанию "Привет, Мир!". Все, что нам понадобится - это один файл классов, расположенный в папке src/Plugin/Block корневой директории нашего модуля (путь обязательный!).

Давайте назовем наш новый тип блока BlockExampleSimpleBlock, и, естественно, он должен будет содержаться в файле с именем BlockExampleSimpleBlock.php. В этот файл мы для начала можем добавить следующее:

<?php
/**
 * @file
 * Contains \Drupal\block_example\Plugin\Block\BlockExampleSimpleBlock.
 */
namespace Drupal\block_example\Plugin\Block;
use Drupal\block\BlockBase;
use Drupal\Component\Annotation\Plugin;
use Drupal\Core\Annotation\Translation;
use Drupal\Core\Session\AccountInterface;
/**
 * Provides a 'Example: empty block' block.
 *
 * @Block(
 *   id = "example_simple",
 *   subject = @Translation("Simple example block"),
 *   admin_label = @Translation("Simple example block")
 * )
 */
class BlockExampleSimpleBlock extends BlockBase {
  /**
   * Implements \Drupal\block\BlockBase::blockBuild().
   */
  public function build() {
    return array(
      '#markup' => t('Привет, Мир!'),
    );
  }
}

Как и для любого другого файла классов, мы начинаем с определения области имен нашего класса. После этого используем класс BlockBase, так чтобы мы могли расширить его. Затем следует то, с чем вы определенно не встречались в Drupal 7: аннотации.

Аннотации являются инструментом пояснения PHP, они расположены в блоке комментариев того же файла, в котором определяется класс. Используя аннотации, мы сообщаем Drupal, что мы хотим зарегистрировать новый тип блока (@Block) с идентификатором exampl_simple и admin_label - Simple exampl block (передаваемым через систему перевода).

Далее, мы расширяем класс BlockBase в наш собственный BlockExampleSimpleBlock, внутри которого мы реализуем метод build() - он возвращает отображаемый массив, который будет выводить блок.

Вот и все. Теперь вы можете очистить кэш и перейти на страницу конфигурации Block layout.

Конфигурация блока Drupal 8

После создания нового типа блока, можно добавить для него форму конфигурации. Сделаем так, чтоб вы могли изменять данный блок. Создадим текстовое поле "Имя", значение которого будет передаваться в блок и теперь выводиться будет: "Привет, #значение в поле".

Во-первых, мы должны определить форму, содержащую текстовое поле. Так в нашем классе BlockExampleSimpleBlock мы можем добавить новый метод blockForm():

/**
* {@inheritdoc}
*/
public function blockForm($form, &$form_state) {
  $form = parent::blockForm($form, $form_state);
  $config = $this->getConfiguration();
  $form['block_example_simple_block_settings'] = array(
    '#type' => 'textfield',
    '#title' => $this->t('Who'),
    '#description' => $this->t('Кому Вы хотите сказать "Привет"?'),
    '#default_value' => isset($config['block_example_simple_block_settings']) ? $config['block_example_simple_block_settings'] : '',
  );
  return $form;
}

Эта форма реализации API очень похожа на Drupal 7. Однако есть и определенные новые элементы. Во-первых, мы извлекаем массив $form из родительского класса (так мы создаем свою форму на базе существующей, добавляя собственное поле). Затем мы извлекаем и сохраняем конфигурацию этого блока.

Класс BlockBase определяет метод getConfiguration(), который делает это для нас. И в случае, если он был уже установлен, мы устанавливаем для block_example_simple_block_settings значение #default_value.

Теперь пришло время предоставить обработчик этой формы, который будет обрабатывать значение нашего поля и хранить его в конфигурации блока:

/**
* {@inheritdoc}
*/
public function blockSubmit($form, &$form_state) {
 $this->setConfigurationValue('block_example_simple_block_settings', $form_state['values'][block_example_simple_block_settings']);
}

Этот метод также находится внутри класса BlockExampleSimpleBlock, и все, что он делает, это сохраняет значение поля block_example_simple_block_settings в качестве нового пункта конфигурации блока (с ключом того же имени для соответствия).

Наконец, мы должны настроить наш метод build(), так чтобы включить в него имя, которому блок должен говорить "Привет!":

/**
 * {@inheritdoc}
 */
public function build() {
  $config = $this->getConfiguration();
  if (isset($config['block_example_simple_block_settings']) && !empty($config['block_example_simple_block_settings'])) {
    $name = $config['block_example_simple_block_settings'];
  }
  else {
    $name = $this->t('никто');
  }
  return array(
    '#markup' => $this->t('Привет, @name!', array('@name' => $name)),
  ); 
}

До сих пор все было довольно просто. Мы извлекаем конфигурацию блока и если значение нашего поля установлено, мы используем его в операторе вывода на экран. Если нет, то используется общее выражение. Вы можете очистить кэш и проверить, работает ли блок.

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


Надеюсь статья была полезной. Спасибо.

Добавить комментарий

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и абзацы переносятся автоматически.
2 + 7 =

Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.

Поделиться...

Группа вконтакте

Последние статьи

Поделиться

Подписаться

Политика конфиденциальности