Темизация кастомного блока в Drupal 8

В Drupal 8 убрали возможность писать PHP-код прямо в блоке, тем самым залатав потенциальную уязвимость. Пришлось разобраться как делать кастомные блоки и навешивать на них twig-шаблоны. Я покажу как сделать блок, в котором будет отображаться ссылка на вход, если пользователь не залогинен.

Если еще не создан, создаем кастомный модуль. У меня мультисайтинг, поэтому я продпочитаю держать кастомные модули в папке сайта,  в данном случае /sites/milsad/modules/custom/custom.module.

  1. Устанавливаем хук темы в файле модуля custom.module

    function custom_theme($existing, $type, $theme, $path) {
      return array('custom' =>
        array(
          'variables' => array(
            'user' => NULL,
          ),
          'template' => 'block--user-block'
        )
      );
    }
  2. В каталоге модуля sites/milsad/modules/custom/src/Plugin/Block создаем файл блока UserBlock.php:
    <?php
    namespace Drupal\custom\Plugin\Block;
    use Drupal\Core\Block\BlockBase;
    
    /**
     * Provides a 'Header user' Block.
     *
     * @Block(
     *   id = "user_block",
     *   admin_label = @Translation("Пользователь в шапке сайта"),
     * )
     */
    class UserBlock extends BlockBase {
    
      /**
       * {@inheritdoc}
       */
      public function build() {
        return array (
          '#theme' => 'custom', //Название темы указано в custom_theme
          '#user' => \Drupal::currentUser(),
        );
      }
    }
  3. В каталоге модуля sites/milsad/modules/custom/templates создаем файл шаблона block--user-block.html.twig:
    {% if user.id %}
        <ul class="user">
            <li class="user__welcome"><a href="{{ path('entity.user.canonical', {'user': user.id}) }}" rel="nofollow">{{ user.getDisplayName() }}</a></li>
            {#<li class="user__signout"><a href="/user/logout" rel="nofollow">Выход</a></li>#}
        </ul>
    {% else %}
        <ul class="user">
            <li class="user__signin"><a href="/user/login">Вход</a></li>
            <li class="user__registration"><a href="/user/register">Регистрация</a></li>
        </ul>
    {% endif %}
  4. Работа с кодом модуля закончена, в результате должна получиться следующая структура:
    Структура каталогов модуля
  5. Теперь нужно в админке сайта добавить блок на страницу темы, для этого переходим на страницу схемы блоков /admin/structure/block и добавляем модуль в необходимом регионе.
    Добавление блока на страницу сайта
  6. Любуемся результатом!
    Результат работы
Комментарии