Ответы:
В 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;
}
}
Я не буду Х публиковать все это, но это должно дать вам идею высокого уровня.
В Drupal 7 код для обработки токенов является частью основного модуля Drupal.
Крюки, которые должны реализовать модули токенов:
Другие модули могут изменять реализацию токена, предоставленную модулем, используя 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:
hook_tokens()
параметра get, который сообщает ловушке, когда необходимо очистить содержимое токена; когда значение токена не нужно очищать, содержимое не передается функциям check_plain()
или filter_xss()
.Я хотел добавить новый токен в раздел « Информация о сайте» токенов, который называется « Название города» . Вот как я это сделал в 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;
}
[site:city_name]
. Убедитесь, что вы очистили кэши или перезапустите memcached, если он используется.
$sanitize
в приведенном выше примере не определено, так что вы получите Notice: Undefined variable
об этом.
Для 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;
}
Для 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);
new
и simple
в этом примере?