Сегодня мы поговорим о том, как сделать поддержку токенов для своей сущности. Как и в случае с предыдущим уроком, в котором я рассказывал как связать свою сущность с Views, у нас будет два способа решения данной задачи, один - с помощью модуля Entity API, второй - самописный код.
Способ 1
Данный способ очень прост, включаем модуль Entity tokens, который входит в комплект Entity API и поддержка токенов обеспечена.
Способ 2
Первым делом имплементируем хук hook_token_info():
/**
* Implements hook_token_info().
*/
function product_token_info() {
// Описываем новый тип токена.
$type = array(
'name' => t('Products'), // Человеко-понятное название токена.
'description' => t('Tokens related to individual products.'), // Описание токена.
'needs-data' => 'product', // Тип данных.
);
// Токены для продукта.
$product = array();
// id продукта.
$product['id'] = array(
'name' => t('Product ID'),
'description' => t('The unique ID of the product.'),
);
// Название продукта.
$product['title'] = array(
'name' => t('Title'),
'description' => t('The title of the product.'),
);
// Ссылка на редактирвоание продукта.
$product['edit-url'] = array(
'name' => t('Edit URL'),
'description' => t('The URL of the product\'s edit page.'),
);
// Дата создания продукта.
$product['created'] = array(
'name' => t('Date created'),
'description' => t("The date the product was posted."),
'type' => 'date',
);
// Автор продукта.
$product['author'] = array(
'name' => t('Author'),
'description' => t("The author of the product."),
'type' => 'user',
);
return array(
'types' => array('product' => $type),
'tokens' => array('product' => $product),
);
}
Далее имплементируем хук hook_tokens() с помощью которого наполняем токены данными:
/**
* Implements hook_tokens().
*/
function product_tokens($type, $tokens, array $data = array(), array $options = array()) {
$url_options = array('absolute' => TRUE);
$sanitize = !empty($options['sanitize']);
$replacements = array();
if ($type == 'product' && !empty($data['product'])) {
$product = $data['product'];
foreach ($tokens as $name => $original) {
switch ($name) {
// id продукта.
case 'id':
$replacements[$original] = $product->id;
break;
// Название продукта.
case 'title':
$replacements[$original] = $sanitize ? check_plain($product->title) : $product->title;
break;
// Ссылка на редактирвоание продукта.
case 'edit-url':
$replacements[$original] = url('product/' . $product->id . '/edit', $url_options);
break;
// Автор продукта.
case 'author':
$name = ($product->uid == 0) ? variable_get('anonymous', t('Anonymous')) : $product->name;
$replacements[$original] = $sanitize ? filter_xss($name) : $name;
break;
// Дата создания продукта.
case 'created':
$replacements[$original] = format_date($product->created, 'medium');
break;
}
}
// Если найдены токены с префиксом 'author', то добавляем токены, которые хранят
// расширенную информацию об авторе.
if ($author_tokens = token_find_with_prefix($tokens, 'author')) {
$author = user_load($product->uid);
$replacements += token_generate('user', $author_tokens, array('user' => $author), $options);
}
// Если найдены токены с префиксом 'created', то добавляем токены, которые хранят
// расширенную информацию об дате создания.
if ($created_tokens = token_find_with_prefix($tokens, 'created')) {
$replacements += token_generate('date', $created_tokens, array('date' => $product->created), $options);
}
}
return $replacements;
}
На этом создание токенов закончено. Чистим кеш и наслаждаемся результатом.