

Первое знакомство с модулем 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 прописать наш шаблон:

В атаче лежит цельный модуль для обоих Друпалов.
| Прикрепленный файл | Размер |
|---|---|
| bonus_token - Drupal 5 | 1.06 кб |
| bonus_token - Drupal 6 | 1.11 кб |
А что означает -raw в шаблоне? (в смысле чем title-raw отличается от просто title?)
raw значение не проходит проверку checkplain(), т.е. там может быть html код. Поэтому, в случаях с генерацией урлов, стоит использовать не-raw значение. Но, возможно, где-то в другом месте, появление html кода не будет фатальным (к примеру, при вставке шаблонов в текст email).
# | Barma3
Я совсем не гуру Drupal. Уже давно бился над решением проблемы "красивых" url для форума. Для основных разделов форума я вручную прописал псевдонимы, например forum/2 -> forum/photo, и хотел бы для подразделов данного форума получать ссылки вида forum/photo/topic-34 или просто forum/photo/34 (где число - id ноды). Популярный вариант с транслитерацией мне сильно не нравится. Пожалуйста, подскажите, как это можно реализовать.
Не знаю, разумно ли для каждой ветки форума использовать отдельные id топиков со сквозной нумерацией (1, 2, 3... и т.п.) вместо уникального id?
Да все можно :)
Я не помню где именно в объекте ноды лежат данные о ветке форума, посему оставляю выяснить это вам. Проще всего в шаблоне ноды форума (node-forum.tpl.php) сделать один print_r($node), которое выведет вам объект ноды. Там находите что-то похожее на раздел форума и эту переменную засовываете в мой модуль в bonus_token_token_values() например так:
function bonus_token_token_values($type, $object = NULL, $options = array()) {
if ($type == 'node') {
$node = $object;
$tokens['forum-section'] = $node->some_id;
return $tokens;
}
}
function bonus_token_token_list($type = 'all') {
if ($type == 'node') {
$tokens['node']['forum-section'] = t("Section of the forum");
return $tokens;
}
}
Где $node->some_id — это как раз та переменная, о которой я говорил.
Гм
А останні версії pathauto надають можливість робити різні шаблони для різних розділів та типів матеріалу...
Чи може я щось не зрозумів...
А.. все зрозумів...
А чи не отримає користувач бан за те, що по різним лінкам однаковий контент?
Так а чому по різним? Ви створюєте аліас для якогось матеріалу чи розділу, і цей аліас буде використовуватись автоматом усюди.
# | Dimanic
В imagefield есть пункт Title text settings, к которому можно добавлять токены. Мне нужно автоматически добавлять в это поле заголовок ноды, но такого токена в списке нет, только Global tokens((( Вот с друпала.ру к вам за советом пришел. Поможете?
# | Dimanic
Мне не нужно создавать новый токен - он уже есть в системе. Просто нужно чтобы он высвечивался в imagefield.
Очень полезная статья.
Позволит решить множество проблем.
Во-первых, позволяет вытаскивать параметры из родительских элементов, во-вторых решается проблема с единообразными адреса для многоязычных сайтов (например, чтобы при базовом node/1 на английский становился не en/node/2, а прописывался en/node/1).
Новая плоскость для экспериментов :-)
Насколько я понимаю, в последних версиях модуля Token реализовали нечто очень похожее, и назвали его субмодулем TokenSTARTER:
tokenSTARTER
============
Want to add your own custom tokens to a site? Not sure how to write a module? Worry no more, it's now quite easy.
...
2. Edit the .module file and change hook_token_list and hook_token_values to provide whatever additional tokens or logic your site needs.
А синтаксис там предлагается такой:
/**
* Implementation of hook_token_list().
*/
function tokenSTARTER_token_list($type = 'all') {
if ($type == 'global' || $type == 'all') {
$tokens['global']['site-date-timestamp'] = t('The current timestamp in seconds past January 1, 1970.');
}
if ($type == 'node' || $type == 'all') {
// Node tokens here.
}
return $tokens;
}
/**
* Implementation of hook_token_values().
*/
function tokenSTARTER_token_values($type, $object = NULL) {
$values = array();
switch ($type) {
case 'global':
// Create a UNIX timestamp token.
$time = time();
$tz = variable_get('date_default_timezone', 0);
$values['site-date-timestamp'] = format_date($time, 'custom', 'Y', $tz);
break;
case 'node':
// Node tokens here.
break;
}
return $values;
}# | анонимус
читаю статью и потом обнаруживаю, что ей ровно год))
А так статья хорошая, спасибо, я весьма начинающий друпалер))
# | Сергей
А можно ли сделать токен - аналог [termpath].
Вообще то [termpath], то что мне нужно, но при добавлении в Auto Node Title, он срабатывает только при обновлении ноды. А мне нужно чтобы он заработал при сразу после создания.
спасибо.
Ссылки с других сайтов
Все молчат как партизаны.