Немного о токенах
Здесь будет описано несколько вариантов работы с токенами. Токены предоставляет третий по популярности модуль Token. Токены - это специальные слова обрамленные квадратными скобками ("[", "]"), которые в некоторых случаях могут заменяться на смысловые значения. Например, если установить четвертый по популярности модуль pathauto, то в админке "Home » Administration » Configuration » Search and metadata » URL aliases" (admin/config/search/path/patterns) можно будет использовать токены для генерации человекочитабельных путей (алиасов) к страницам:
Чтобы получить список токенов достаточно кликнуть на ссылку Browse available tokens (Показать список доступных токенов), после чего откроется всплывающее окно.
Для того, чтобы использовать в качестве пути заголовок страницы достаточно вставить токен [node:title] в поле соответствующее пути шаблону пути для вашего типа материала.
Создание своих токенов
Предположим существующие токены, по какой-либо причине, не подходят и нужно создать свой токен. Для этого необходимо создать свой модуль и реализовать два хука:
- hook_token_info - описывает список доступных токенов
- hook_tokens - заменяет токен на данные в момент использования
Чтобы программно найти и заменить токены на данные в тексте, достаточно использовать функцию token_replace($text), где $text - это любой текст в котором могут быть токены (так же доступны более сложные варианты использования этой функции. См. в документации).
Итак, у нас уже есть модуль example, теперь нужно реализовать хуки. Чтобы было понятно, что к чему относится, придумаем легенду. Предположим:
У нас есть сайт, который продает какой-либо функционал со своего сайта, а в качестве продуктов использует роли. Если пользователь купил продукт, то ему назначается роль. На сайте есть страница, с карточками продуктов, где пользователи должны видеть ссылки на покупку продукта, если у него нет роли связанной с этим продуктом. Иначе, он должен видеть слово "Куплено", которое означает, что этот продукт уже куплен.
Реализация hook_token_info
Этот хук "сообщает" Друпалу, о новом токене, который он может использовать. Мы назовем его check-product. Добавляем код в файл example.module:
<?php
/**
* Implements hook_token_info().
*/
function example_token_info() {
$tokens['user']['check-product:?'] = array(
'name' => t('User has product'),
'description' => t('Creates link to purchase ANY product in case if' .
' signed in user has no the product, show flag that the product' .
' is purchased otherwise.'),
);
return array(
'tokens' => $tokens,
);
}
Здесь мы добавляем знак вопроса в ключе, таким способом давая понять администратору, что вместо знака вопроса можно подставлять имя любого продукта (роли).
Токен появился - идем дальше. Теперь нужно добавить обработчик этого токена, иначе он так и будет показываться: [current-user:has-product:?].
Реализация hook_tokens
Теперь Drupal "знает" о новых токенах, которые он может обрабатывать. Но обработчика еще нет. Исправляем этот недочет:
<?php
/**
* Implements hook_tokens().
*/
function example_tokens($type, $tokens, array $data = array()) {
// Список замененных токенов на данные.
$replacements = array();
// Только если мы получили правильный тип данных и пользователь авторизован.
if ($type == 'current-user' && !empty($GLOBALS['user']->uid)) {
$products = $GLOBALS['user']->roles;
// Шаблон указанный в токене.
$pattern = 'check-product:';
// Список токенов приходит как массив, где администратор
// может проверять наличие сразу несколько продуктов,
// указав несколько токенов: [current-user:check-product:First] [current-user:check-product:Second]
foreach ($tokens as $name => $original) {
// Обрабатываем токен, только если он подходит под наш шаблон.
if (strpos($name, $pattern) !== FALSE) {
// Получаем имя продукта(роли).
$product = substr($name, mb_strlen($pattern));
// Если у пользователя куплен продукт, то просто показываем Куплено (Purchased).
if(in_array($product, $products)) {
$replacements[$original] = t('Purchased');
}
// Иначе показываем ссылку на (выдуманную) страницу покупки этого продукта.
else {
$title_link = t('Purchase product @product', array(
'@product' => $product
));
$replacements[$original] = l($title_link, '/purchase/'.$product);
}
}
}
}
return $replacements;
}
Результат работы токенов
Администратору сайта достаточно написать [current-user:has-product:Царь], где Role - это любая роль на сайте и пользователи будут видеть Purchase product Царь или Purchased (Куплено).
Правильность написания ролей/продуктов в данном случае мы оставляем на совести администраторов сайта.
Теперь все готово, можно насладиться результатом. Если ввести список токенов:
то можно получить
Этот метод подразумевает под собой использование токенов в теле материала, но Друпал по умолчанию эти поля не обрабатывает. Чтобы это исправить можно поставить модуль Token Filter. Установка и настройка модуля Token Filter достаточно проста.
Продолжение: Работа с токенами. Часть 2