• урок
  • pantey

Drupal 8 – создаем кастомный токен

21.08.2017

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

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

Файл ex_token.info.yml

name: Example token
type: module
description: Пример создания кастомного токена в Drupal 8
core: 8.x
dependencies:
  - token

Далее, нам необходимо реализовать hook_token_info(). Данным хуком мы описываем создание нового токена, а именно тип токена и его возможные варианты.

Файл ex_token.module

<?php

/**
* Implements hook_token_info().
*/
function ex_token_token_info() {

  return array(
    # Определили тип токена
    'types' => array(
      'ex_token' => array(
        'name' => t('Ex token'),
        'description' => t('Example custom token'),
      ),
    ),
    # Добавили возможные варианты для типа токена
    'tokens' => array(
      'ex_token' => array(
        'title' => array(
          'name' => t('Title'),
          'description' => t('Ex custom token'),
        ),
      ),
    ),
  );

}

Как вы можете видеть, мы описали новый тип токена под именем Ex token, который содержит единственный вариант – title.

Хочу заметить, что все токены строятся по принципу [тип токена:вариант токена], в нашем случае наш токен будет выглядеть как – [ex_token:title]

Теперь нам необходимо определить действия для каждого из вариантов нашего типа токена – hook_tokens().

Файл ex_token.module

<?php

/**
* Implements hook_token_info().
*/
function ex_token_token_info() {

  return array(
    # Определили тип токена
    'types' => array(
      'ex_token' => array(
        'name' => t('Ex token'),
        'description' => t('Example custom token'),
      ),
    ),
    # Добавили возможные варианты для типа токена
    'tokens' => array(
      'ex_token' => array(
        'title' => array(
          'name' => t('Title'),
          'description' => t('Ex custom token'),
        ),
      ),
    ),
  );

}

/**
* Implements hook_tokens().
*/
function ex_token_tokens($type, $tokens, array $data, array $options, \Drupal\Core\Render\BubbleableMetadata $bubbleable_metadata) {

  $replacements = array();
  if ($type == 'ex_token') {
    foreach ($tokens as $name => $original) {
      # Описываем действия для вариантов типа токена
      switch ($name) {
        case 'title':
          $replacements[$original] = 'custom-example-token';
          break;
      }
    }
  }

  return $replacements;
}

Где:

  • $type – тип токена
  • $tokens – массив с вариантами типа токена
  • $data – массив с сущностью
  • $options – дополнительные параметры, например как код языка (en, ru)
  • $bubbleable_metadata - метаданные

В данном случаем, для варианта токена - title, будет использоваться вывод текста – custom-example-token. Теперь можем активировать данный модуль и проверить его работу.

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

Хочу заметить, что для создания URL адреса по шаблону используется модуль pathauto

drupal_8_custom_create_token.png

Теперь создадим материал типа «Страница» и посмотрим на его URL

drupal_8_custom_create_token_1.png

Как видим, токен у нас работает. На этом можно закончить.

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

Скачать

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

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

Profile picture for user 1541
Алексей К
06.08.2018

Здравствуйте, мне нужно нечто подобное но для модуля domain, как можно внедрить поля из определённого типа материала в front page домена (делаю мульти лендинг).

Profile picture for user pantey
pantey
06.08.2018

не очень понимаю для чего вам токены для мульти сайта. В 8ке уже есть средства для переводов контента.

Profile picture for user 1541
Дмитрий
30.11.2018

Подскажите пожалуйста! Есть словарь таксономии со списком городов. В типе материала используется этот словарь и в содержимом самой страницы я  могу использовать такие токены: [node:field_city] или [node:field_city:entity:name]. Мне нужно эти токены использовать в блоках, чтобы  в одном и том же блоке на разных страницах выводился соответствующий данной странице город. Поставил модуль Token Filter и теперь в блоках могу использовать токены, но токены ноды в блоках не поддерживаются. Какие варианты решения есть? Может через ваш  способ своего токена - но как туда подставить значение города текущей страницы?

Profile picture for user pantey
pantey
30.11.2018

Решается обычной views с применением контекстного фильтра по ноде. Далее сможете вытащить в блок все поля ноды.

Profile picture for user 1541
Дмитрий
01.12.2018

Спасибо, так и сделал!