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

Главные вкладки

Аватар пользователя neochief neochief 1 сентября 2008 в 18:38

Первое знакомство с модулем Token, любой друпаллер начинает с включения таких модулей как PathAuto или Auto Node Titles. Этот модуль служит для подстановки различных значений в шаблоны строк других модулей.

Модуль предоставляет великое множество возможных шаблонов, но все же, довольно часто, при построении сайта не хватает специфических шаблонов. Например, у вас есть соц. сеть. Вы хотите, чтобы у топиков в личном блоге УРЛы были вида http://site.com/vasya-pupkin/post-title, а у тех же топиков, принадлежащих группе — http://site.com/group-title/post-title. Так как для одного типа контента можно прописать только один шаблон Токена, то вы можете создать либо [user-raw][title], либо [group-title][title], но не все вместе. Большинство пользователей Друпала на этом шаге зайдет в тупик и подумает, что проблему решить невозможно.

Однако, это не так. Тем более теперь, когда решение находится внутри этой статьи.

Ссылки на скачку там же.

Комментарии

Аватар пользователя gn@drupal.org gn@drupal.org 1 сентября 2008 в 19:42

Спасибо.
А сложно ли добавить к доступным параметрам поле node.tnid (номер ноды, переводом которой является данная нода), чтобы можно было генерить с помощью pathauto для ноды и её переводов на другие языки одинаковые URLы, отличающиеся лишь языковым префиксом?
(См. Token feature request http://drupal.org/user/39430).

P.S. На drupaldance комментарии не принимаются - скрытая капча не пускает.

Аватар пользователя neochief neochief 1 сентября 2008 в 20:12

Да, Григорий, именно под впечатлением от вашей ситуации была создана статья, только я забыл какая конкретно была у вас проблема Smile

Скачайте модуль для нужной ветки Дру, откройте файл bonus_token.module, в нем замените функции на:

function bonus_token_token_values($type, $object = NULL, $options = array()) {
  if ($type == 'node') {
    $node = $object;

    $tokens['tnid'] = $node->tnid;
    return $tokens;
  }
}

function bonus_token_token_list($type = 'all') {
  if ($type == 'node') {
    $tokens['node']['tnid'] = t("Language prefix of a node");
    return $tokens;
  }
}

Проблема скорее всего решится, но я не совсем уверен, что в ноде есть конкретно поле $node->tnid, посему проверка за вами. Если не будет работать, надо будет просто поискать, где в объекте ноды хранится этот идетификатор.

На счет комментов на сайте — странно. Все проверил, вроде работает. Какой у вас браузер?

Аватар пользователя gn@drupal.org gn@drupal.org 2 сентября 2008 в 13:36

Спасибо, попробую.
В Д6 tnid хранится в таблице node, поле tnid; "$node->tnid" используется в модулях translations и i18n.

А по поводу капчи - я пробовал под FF 3.0.1 & Opera 9.51. Даже специально отключал в FF Adblock Plus, но не помогло.
А сегодня почему-то вообще не могу зайти на drupaldance - сайт прекрасно пингуется, но открываться не хочет.

Аватар пользователя neochief neochief 2 сентября 2008 в 15:05

Сейчас там какие-то проблемы с хостингом, решаем-с.

А вот на счет капчи — весьма занятно, надо будет еще раз протестировать все.

Аватар пользователя gn@drupal.org gn@drupal.org 3 сентября 2008 в 12:14

DrupalDance поднялся, ещё раз попробовал прокомментировать под FF 3.0.1 -
* Invalid CAPTCHA token.
* Вы ввели неверный код. Пожалуйста, попытайтесь еще раз.

Каковое сообщение, наверное, должно выглядеть несколько удивительно для тех кто не в курсе и уверен, что он никакого кода не вводил Lol

Аватар пользователя Шмыг Шмыг 23 сентября 2008 в 20:05

Я совсем не гуру Drupal. Уже давно бился над решением проблемы "красивых" url для форума. Для основных разделов форума я вручную прописал псевдонимы, например forum/2 -> forum/photo, и хотел бы для подразделов данного форума получать ссылки вида forum/photo/topic-34 или просто forum/photo/34 (где число - id ноды). Популярный вариант с транслитерацией мне сильно не нравится. Пожалуйста, подскажите, как это можно реализовать.

Не знаю, разумно ли для каждой ветки форума использовать отдельные id топиков со сквозной нумерацией (1, 2, 3... и т.п.) вместо уникального id?

Аватар пользователя B.X B.X 21 марта 2009 в 4:02

"neochief" wrote:
Ошибку с комментами нашел и поправил.

расскажите как поправили...
а то у меня на сайте теперь только зарегистрированные пользователи могут добавлять комментарии...

Аватар пользователя neochief neochief 21 марта 2009 в 12:14

"B.X" wrote:
а то у меня на сайте теперь только зарегистрированные пользователи могут добавлять комментарии

Проверьте наявность юзера с UID=0 в таблице {users}

Аватар пользователя gn@drupal.org gn@drupal.org 28 июля 2009 в 14:01

Я вижу, в последних версиях модуля 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.

С вот таким синтаксисом:

<?php/**
 * 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;
}?>