Відповіді:
У 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;
}
}
Я не буду X розміщувати все це, але це повинно дати вам ідею на високому рівні.
У Drupal 7 код для обробки токенів є частиною основного модуля Drupal.
Гачки, які необхідно здійснити для лексеми модулів:
Інші модулі можуть змінювати маркера реалізації , що надається з модуля з допомогою hook_token_info_alter () і hook_tokens_alter () .
На відміну від модуля Token, код в ядрі Drupal дозволяє створювати вміст маркера лише при строгій необхідності. У Drupal 6 модуль Token попросить модулі, що реалізують маркери, усі значення для їх використання маркера hook_token_values()
; Це означає , що модуль може обчислити значення для маркерів , який в цьому випадку не потрібно для маркерів замінюються. У Drupal 7 реалізація hook_tokens()
отримує $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, використовуючи kuk_token_info (), щоб зареєструвати їх, а для_заміни даних_upload_tokens ().
Якщо ви хочете створити спеціальний маркер для існуючого типу лексеми, наприклад, для вузлів, вам потрібно буде помістити маркер у підмагістраль в межах kuka_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
в цьому прикладі?