Поддержка токенов для своей сущности в Drupal

Сегодня мы поговорим о том, как сделать поддержку токенов для своей сущности. Как и в случае с предыдущим уроком, в котором я рассказывал как связать свою сущность с Views, у нас будет два способа решения данной задачи, один - с помощью модуля Entity API, второй - самописный код.

Способ 1

Данный способ очень прост, включаем модуль Entity tokens, который входит в комплект Entity API и поддержка токенов обеспечена.

Способ 2

Первым делом имплементируем хук hook_token_info():

/**
 * Implements hook_token_info().
 */
function product_token_info() {
  // Описываем новый тип токена.
  $type = array(
    'name' => t('Products'), // Человеко-понятное название токена.
    'description' => t('Tokens related to individual products.'), // Описание токена.
    'needs-data' => 'product', // Тип данных.
  );

  // Токены для продукта.
  $product = array();
  
  // id продукта.
  $product['id'] = array(
    'name' => t('Product ID'),
    'description' => t('The unique ID of the product.'),
  );
  // Название продукта.
  $product['title'] = array(
    'name' => t('Title'),
    'description' => t('The title of the product.'),
  );
  // Ссылка на редактирвоание продукта.
  $product['edit-url'] = array(
    'name' => t('Edit URL'),
    'description' => t('The URL of the product\'s edit page.'),
  );
  // Дата создания продукта.
  $product['created'] = array(
    'name' => t('Date created'),
    'description' => t("The date the product was posted."),
    'type' => 'date',
  );
  // Автор продукта.
  $product['author'] = array(
    'name' => t('Author'),
    'description' => t("The author of the product."),
    'type' => 'user',
  );

  return array(
    'types' => array('product' => $type),
    'tokens' => array('product' => $product),
  );
}

Далее имплементируем хук hook_tokens() с помощью которого наполняем токены данными:

/**
 * Implements hook_tokens().
 */
function product_tokens($type, $tokens, array $data = array(), array $options = array()) {
  $url_options = array('absolute' => TRUE);
  $sanitize = !empty($options['sanitize']);

  $replacements = array();
  if ($type == 'product' && !empty($data['product'])) {
    $product = $data['product'];

    foreach ($tokens as $name => $original) {
      switch ($name) {
        // id продукта. 
        case 'id':
          $replacements[$original] = $product->id;
          break;

        // Название продукта.   
        case 'title':
          $replacements[$original] = $sanitize ? check_plain($product->title) : $product->title;
          break;

        // Ссылка на редактирвоание продукта.
        case 'edit-url':
          $replacements[$original] = url('product/' . $product->id . '/edit', $url_options);
          break;

        // Автор продукта.
        case 'author':
          $name = ($product->uid == 0) ? variable_get('anonymous', t('Anonymous')) : $product->name;
          $replacements[$original] = $sanitize ? filter_xss($name) : $name;
          break;

        // Дата создания продукта.
        case 'created':
          $replacements[$original] = format_date($product->created, 'medium');
          break;
      }
    }

    // Если найдены токены с префиксом 'author', то добавляем токены, которые хранят
    // расширенную информацию об авторе.
    if ($author_tokens = token_find_with_prefix($tokens, 'author')) {
      $author = user_load($product->uid);
      $replacements += token_generate('user', $author_tokens, array('user' => $author), $options);
    }

    // Если найдены токены с префиксом 'created', то добавляем токены, которые хранят
    // расширенную информацию об дате создания.
    if ($created_tokens = token_find_with_prefix($tokens, 'created')) {
      $replacements += token_generate('date', $created_tokens, array('date' => $product->created), $options);
    }
  }

  return $replacements;
}

На этом создание токенов закончено. Чистим кеш и наслаждаемся результатом.

Benya