Answers:
在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中,令牌模块将使用来向实现令牌的模块询问其令牌的所有值hook_token_values()
。这意味着模块可以计算令牌的值,然后替换令牌不需要这些值。在Drupal 7中,hook_tokens()
receives 的实现$tokens
作为参数替换了要替换的令牌数组;然后,模块将知道将要使用的令牌,从而能够计算令牌的值。
在Drupal 7中用于用其值替换标记的函数是token_replace(),这是用于用其值替换标记的唯一函数。
Drupal 6的Token模块与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,使用节点对象的示例:
您可以使用hook_token_info()注册令牌,并使用hook_tokens()获取替换数据,将令牌放入模块的mymodule.tokens.inc中。
如果要为现有令牌类型(例如为节点)创建自定义令牌,则需要将令牌放入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
在这个例子吗?