Все прекрасно знаю, для чего нужен токен и, в каких моментах он используется при разработке сайта. Сегодня мы рассмотрим, как программно создать кастомный токен, который будет выводить необходимую нам информацию.
Как всегда, все действия проводим в кастомном модуле, в моем случае он будет называться 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
Теперь создадим материал типа «Страница» и посмотрим на его URL
Как видим, токен у нас работает. На этом можно закончить.
Скачать модуль используемый в примере
Комментарии (5)
Здравствуйте, мне нужно нечто подобное но для модуля domain, как можно внедрить поля из определённого типа материала в front page домена (делаю мульти лендинг).
не очень понимаю для чего вам токены для мульти сайта. В 8ке уже есть средства для переводов контента.
Подскажите пожалуйста! Есть словарь таксономии со списком городов. В типе материала используется этот словарь и в содержимом самой страницы я могу использовать такие токены: [node:field_city] или [node:field_city:entity:name]. Мне нужно эти токены использовать в блоках, чтобы в одном и том же блоке на разных страницах выводился соответствующий данной странице город. Поставил модуль Token Filter и теперь в блоках могу использовать токены, но токены ноды в блоках не поддерживаются. Какие варианты решения есть? Может через ваш способ своего токена - но как туда подставить значение города текущей страницы?
Решается обычной views с применением контекстного фильтра по ноде. Далее сможете вытащить в блок все поля ноды.
Спасибо, так и сделал!