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

Шаг 1: Создание своего виджета

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


use Drupal\Core\Form\FormStateInterface;

/**
 * Implements hook_block_configure().
 */
function my_module_block_configure($delta = '') {
  $form = array();

  $form['my_module_widget'] = array(
    '#type' => 'textfield',
    '#title' => t('Enter your text'),
    '#default_value' => isset($config['my_module_widget']) ? $config['my_module_widget'] : '',
  );

  return $form;
}

/**
 * Implements hook_block_save().
 */
function my_module_block_save($delta = '', $edit = array()) {
  $config = array(
    'my_module_widget' => $edit['my_module_widget'],
  );

  return $config;
}

Шаг 2: Создание блока

После создания своего виджета вы должны создать блок, чтобы его можно было разместить на сайте. Вот пример кода, который создает блок с вашим виджетом:


use Drupal\Core\Block\BlockBase;
use Drupal\Core\Form\FormStateInterface;

/**
 * Provides a 'My Custom Block' block.
 *
 * @Block(
 *   id = "my_module_custom_block",
 *   admin_label = @Translation("My Custom Block"),
 * )
 */
class MyCustomBlock extends BlockBase {

  /**
   * {@inheritdoc}
   */
  public function build() {
    $config = $this->getConfiguration();

    $widget = isset($config['my_module_widget']) ? $config['my_module_widget'] : '';

    return array(
      '#type' => 'markup',
      '#markup' => $this->t($widget),
    );
  }

  /**
   * {@inheritdoc}
   */
  public function blockForm($form, FormStateInterface $form_state) {
    $form = parent::blockForm($form, $form_state);

    $config = $this->getConfiguration();

    $form['my_module_widget'] = array(
      '#type' => 'textfield',
      '#title' => $this->t('Enter your text'),
      '#default_value' => isset($config['my_module_widget']) ? $config['my_module_widget'] : '',
    );

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function blockSubmit($form, FormStateInterface $form_state) {
      $this->setConfigurationValue('my_module_widget', $form_state->getValue('my_module_widget'));
  }

}

Шаг 3: Размещение блока

После создания блока с вашим виджетом, вам нужно разместить его на сайте. Вы можете сделать это на странице «Модули» в административной панели Drupal. Найдите ваш модуль в списке модулей и включите его, а затем перейдите на страницу «Оформление > Блоки» и найдите ваш блок по названию или ID. Затем выберите регион, в котором вы хотите разместить блок, и сохраните изменения.

Вопросы и ответы

1. Как изменить внешний вид своего виджета?

Вы можете изменить внешний вид вашего виджета, используя тему оформления Drupal. Создайте файл шаблона для вашего виджета в папке вашей темы и настройте его в соответствии с вашими потребностями.

2. Можно ли добавить несколько виджетов внутри одного блока?

Да, вы можете добавить несколько виджетов внутри одного блока. Просто добавьте дополнительные поля в форму виджета и обработайте их значения в функциях blockForm() и blockSubmit().

3. Как удалить свой виджет из блока?

Чтобы удалить свой виджет из блока, перейдите на страницу «Оформление > Блоки» и найдите ваш блок по названию или ID. Затем удалите содержимое поля виджета и сохраните изменения. Ваш виджет будет удален из блока, но останется доступным в коде модуля.