ShvetsGroup

 

Создание собственных Token-шаблонов

  • neochief's picture
0 comments

Создание собственных 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?