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

23

Как бы вы занялись программным созданием токена? Я хочу добавить несколько пользовательских токенов для моего модуля.

Люси
источник
Дополнительная документация была обновлена ​​(31 октября 2012 г.), и ее можно найти по адресу drupal.org/documentation/modules/token
iStryker,

Ответы:

7

В Drupal 6 вы используете hook_token_values().

Этот хук позволит вам создавать токены. Вы можете создать их в глобальной области видимости или использовать объект, такой как узел, или пользователя для заполнения значений.

Вы также должны использовать, hook_token_list()чтобы объяснить, каковы ваши токены.

Документация token.api довольно понятна.

function my_user_token_values($type, $object = NULL, $options = array()) {
  if ($type == 'user') {
    $user = $object;
    $tokens['name']      = $user->name;
    $tokens['mail']      = $user->mail;
    return $tokens;
  }
}

Я не буду Х публиковать все это, но это должно дать вам идею высокого уровня.

Джереми Френч
источник
20

В Drupal 7 код для обработки токенов является частью основного модуля Drupal.

Крюки, которые должны реализовать модули токенов:

  • hook_token_info () - это ловушка, которая предоставляет информацию о токенах, реализованных модулем.
  • hook_tokens () - это ловушка, которая должна быть реализована для предоставления фактических значений, заменяющих токены.

Другие модули могут изменять реализацию токена, предоставленную модулем, используя hook_token_info_alter () и hook_tokens_alter () .

В отличие от модуля Token, код в ядре Drupal позволяет создавать содержимое токена только в случае крайней необходимости. В Drupal 6 модуль Token запрашивал у модулей, реализующих токены, все значения их токенов hook_token_values(); это означает, что модуль может вычислить значение для токена, которое затем не требуется для заменяемых токенов. В Drupal 7 реализация hook_tokens()receive $tokens- аргумент для замены массива токенов; Затем модуль может вычислить значение токена, зная, что он будет использован.

Функция, которая в Drupal 7 используется для замены токенов на их значения, является token_replace () , которая является единственной функцией, используемой для замены токенов на их значения.

Другое различие между модулем Token для Drupal 6 и кодом в Drupal 7:

  • В Drupal 7 [node: author] возвращает имя автора; [node: author: mail] возвращает адрес электронной почты, связанный с автором узла, а [node: author: url] возвращает URL-адрес профиля пользователя для автора узла. Другими словами, можно использовать [node: author: xyz], где «xyz» - это один из токенов, возвращаемых для объекта пользователя.
  • В Drupal 7 нет необработанных токенов; реализация hook_tokens()параметра get, который сообщает ловушке, когда необходимо очистить содержимое токена; когда значение токена не нужно очищать, содержимое не передается функциям check_plain()или filter_xss().
  • В Drupal 7 нет функции, которая отображала бы список доступных токенов. Если модуль должен отобразить список доступных токенов, он должен построить сам список токенов и показать его в описании поля формы; Кроме того, он может использовать функцию темы, все еще доступную в модуле Token.
киамалуно
источник
8

Я хотел добавить новый токен в раздел « Информация о сайте» токенов, который называется « Название города» . Вот как я это сделал в Drupal 7.

 /**
 * Implements hook_token_info().
 */
function my_module_token_info() {

  // Add tokens.
  $site['city_name'] = array(
    'name' => t('Token Name'),
    'description' => t('Token Description'),
  );

  return array(
    'tokens' => array(
      'site' => $site,
    ),
  );
}

/**
 * Implements hook_tokens().
 */
function my_module_tokens($type, $tokens, array $data = array(), array $options = array()) {
  $replacements = array();

 if ($type == 'site') {
    foreach ($tokens as $name => $original) {
      switch ($name) {
        case 'city_name':
          $city_name = variable_get('city_name');
          $replacements[$original] = $sanitize ? check_plain($city_name) : $city_name;
          break;
      }
    }
  }

  // Return the replacements.
  return $replacements;
}
Ли Вудман
источник
Спасибо за предоставленный пример. Они всегда полезны
iStryker
1
Таким образом, маркер будет в приведенном выше примере: [site:city_name]. Убедитесь, что вы очистили кэши или перезапустите memcached, если он используется.
Кенорб
Примечание: $sanitizeв приведенном выше примере не определено, так что вы получите Notice: Undefined variableоб этом.
Кенорб
@kenorb хороший глаз, и я вижу, что этот ответ был с тех пор обновлен :)
WebMW
3

Для Drupal 8, пример использования объекта узла:

Вы можете поместить токены в свой модуль по адресу mymodule.tokens.inc, используя hook_token_info () для их регистрации и hook_tokens () для данных замены.

Если вы хотите создать собственный токен для существующего типа токена, например, для узлов, вам необходимо поместить свой токен в подмассив hook_token_info (). Обратитесь к node.tokens.inc в модуле узла, чтобы увидеть, из чего вы строите.

mymodule.tokens.inc:

<?php

use Drupal\Core\Render\BubbleableMetadata;
use Drupal\image\Entity\ImageStyle;

/**
 * Implements hook_token_info().
 */
function mymodule_token_info() {
  $info = array();

  $info['tokens']['node']['custom_title'] = [
    'name' => t("Custom Title"),
    'description' => t("a custom node title token"),
  ];
  // Return them.
  return $info;
}

/**
 * Implements hook_tokens().
 */
function mymodule_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) {

  $replacements = array();
  if ($type == 'node') {
    foreach ($tokens as $name => $original) {
      // Find the desired token by name
      switch ($name) {
        case '$data['node']':
          $node = $data['node'];
          $replacements[$original] = $node->label();
          break;
      }
    }
  }
  // Return the replacements.
  return $replacements;
}
oknate
источник
2

Для Drupal 8

// We need to include the needed class for tokens.

use Drupal\Core\Render\BubbleableMetadata;

/**
 * Implements hook_token_info().
 */
function modulename_token_info() {
  $info = array();
  // Add any new tokens.
  $info['tokens']['customtokentype']['customtoken'] = t('Telling drupal that you define custom token');
  // Return them.
  return $info;
}

/**
 * Implements hook_tokens().
 */
function modulename_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) {
  $replacements = array();
  $simple = $data["customanything"];
  if ($type == 'customtokentype') {
    foreach ($tokens as $name => $original) {
      // Find the desired token by name
      switch ($name) {
        case 'customtoken':
          $new = $simple;
          $replacements[$original] = $new;
          break;
      }
    }
  }   
  // Return the replacements.
  return $replacements;
}

Для получения значения токенов в вашей функции необходим код, подобный следующему.

$token = \Drupal::token();
$message_html = "hello my custom token is replaced see it here [customtokentype:customtoken]";

// Token data.
$data = array('customanything' => $tosendtotokens);
$message_html = $token->replace($message_html, $data);
Картикеян Манивасагам
источник
1
Что есть newи simpleв этом примере?
user1359
использовать Drupal \ Core \ Render \ BubbleableMetadata; $ token = \ Drupal :: token (); function modulename_tokens ($ type, $ tokens, array $ data, array $ options, BubbleableMetadata $ bubbleable_metadata) {...}
Картикеян Манивагасагам
Это должно быть в modulename.tokens.inc
oknate