Создание пользовательских токенов с помощью Token API

Token API - очень интересный и полезный инструмент который был включен в ядро Drupal 7, он позволяет создавать что-то вроде маркеров(токенов) которые перед выводом заменяются на какую-либо информацию в зависимости от контекста.

Drupal по умолчанию предоставляет большой набор токенов, но иногда возникает необходимость создавать свои токены, как это делать рассмотрим на примере модуля Global count tokens (global_count_tokens) который будет предоставлять нам три новых токена: общее количество комментариев, общее количество материалов и количество зарегистрированных пользователей.

Первым делом создадим файл global_count_tokens.info:

name = Global count tokens
description = Provide global count tokens
core = 7.x
package = Custom

Далее рассмотрим листинг файла global_count_tokens.module:

/**
 * Implements hook_token_info().
 */
function global_count_tokens_token_info() {
  // объявляем новую группу Global
  $type = array(
    'name' => t('Global'),
    'description' => t('Global data.'),
  );
 
  // объявляем несколько токенов
  $global['user-count'] = array(
    'name' => t('User count'),
    'description' => t('Registered users count'),
  );
 
  $global['comment-count'] = array(
    'name' => t('Comment count'),
    'description' => t('Total comment count'),
  );
 
  $global['node-count'] = array(
    'name' => t('Node count'),
    'description' => t('Total node count'),
  );
 
  // возвращаем метаданные о новой группе и токенах
  return array(
    'types' => array('global' => $type),
    'tokens' => array('global' => $global),
  );
}
 
/**
 * Implements hook_tokens().
 */
function global_count_tokens_tokens($type, $tokens, array $data = array(), array $options = array()) {
  // заполняем массив значениями для каждого объявленного токена
  // этот хук будет вызываться в момент вызова функции token_replace
  if ($type == 'global') {
    foreach ($tokens as $name => $original) {
      switch ($name) {
        case 'user-count':
          $replacements[$original] = global_count_tokens_get_user_count();
          break;
 
        case 'comment-count':
          $replacements[$original] = global_count_tokens_get_comment_count();
          break;
 
        case 'node-count':
          $replacements[$original] = global_count_tokens_get_node_count();
          break;
      }
    }
  }
 
  return $replacements;
}
 
 
/**
 * Get users count.
 */
function global_count_tokens_get_user_count() {
  return db_query('SELECT count(uid) FROM {users} WHERE uid > 0')->fetchField();
}
 
/**
 * Get comment count.
 */
function global_count_tokens_get_comment_count() {
  return db_query('SELECT count(cid) FROM {comment} WHERE status = 1')->fetchField();
}
 
/**
 * Get node count.
 */
function global_count_tokens_get_node_count() {
  return db_query('SELECT count(nid) FROM {node} WHERE status = 1')->fetchField();
}

Код довольно простой. В первом хуке hook_token_info мы описываем метаданные для наших токенов, во втором хуке hook_tokens - реализацию.

Теперь посмотрим как это работает на практике. Для этого включим наш модуль Global count tokens, а также модули Token и Token filter на демо сайте.

Включение модулей Token, Token filter и Global count tokens

Модуль Token в Drupal 7 нужен только для отображения Token browser, а Token filter добавляет фильтр Replace tokens который понадобится нам для демонстрации.

Добавление фильтра Replace tokens

Добавляем этот фильтр в формат Full HTML.

Создание блока Global counters

Создаем новый блок Gloabl counters который будет использовать все три новых токена.

Отображение блока Global counters

Как видно все токены при выводе были заменены на соответствующие значения. Попробуем добавить одну статью и пару комментариев к ней.

Обновленное отображение блока Global counters

Теперь значения токенов изменились так как изменилось количество материалов и комментариев. Это говорит о том что все работает правильно.

Исходник модуля Global count tokens.

Поделись с друзьями: