Создание собственных Token-шаблонов
Статья эвакуирована с DrupalDance.com
Первое знакомство с модулем Token, любой друпаллер начинает с включения таких модулей как PathAuto или Auto Node Titles. Этот модуль служит для подстановки различных значений в шаблоны строк других модулей.
Модуль предоставляет великое множество возможных шаблонов, но все же, довольно часто, при построении сайта не хватает специфических шаблонов. Например, у вас есть соц. сеть. Вы хотите, чтобы у топиков в личном блоге УРЛы были вида http://site.com/vasya-pupkin/post-title, а у тех же топиков, принадлежащих группе — http://site.com/group-title/post-title. Так как для одного типа контента можно прописать только один шаблон Токена, то вы можете создать либо [author-name][title], либо [group-title][title], но не все вместе. Большинство пользователей Друпала на этом шаге зайдут в тупик и подумает, что проблему решить невозможно.
Однако, это не так. Тем более теперь, когда решение находится чуть ниже.
Итак, модуль Token предоставляет два хука, с помощью которых можно добавить новые Токен-шаблоны. Это — hook_token_token_list()
и hook_token_token_values()
. Первый из них отвечает за вывод шаблона в списках при настройке. Второй, собственно и делает всю работу.
Итак, наше решение задачи для УРЛов соц. сети будет выглядеть так:
/**
* Implementation of hook_token_values()
*/
// $type - контекст шаблона. Т.е. для $type == 'node', в $object будет находиться нода, для 'user' - объект юзера и т.д.
function bonus_token_token_values($type, $object = NULL, $options = array()) {
if ($type == 'node') {
$node = $object;
// Проверяем, назначена ли группа этой ноде
if (($node->og_groups)&&(count($node->og_groups)>0)){
// Если да, то соединяем все названия группы через дефис
$groups = array();
foreach ($node->og_groups as $gid) {
$group = node_load($gid);
$groups[] = check_plain($group->title);
}
$path = implode('-', $groups);
}
if ($path == '') {
// Если нет, то возвращаем имя автора ноды (название личного блога)
$path = check_plain($node->name);
}
// В этой функции нам необходимо вернуть вссоциированный массив
// типа $array['шаблон'] => 'значение', поэтому возвращаем наш Токен-массив:
$tokens['blog'] = $path;
return $tokens;
}
}
/**
* Implementation of hook_token_list()
*/
function bonus_token_token_list($type = 'all') {
// Наш шаблон нужен только в контексте нодов
if ($type == 'node') {
// 'blog' - это название шаблона
$tokens['node']['blog'] = t("Group name or username");
return $tokens;
}
}
После включения мини-модуля, осталось в настройках pathauto прописать наш шаблон:
В атаче лежит цельный модуль для обоих Друпалов.
Got anything to add?