如何以编程方式在模块中创建自定义令牌


Answers:


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;
  }
}

我不会X发布整个内容,但这应该可以给您一个高层次的想法。


20

在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中的代码之间的其他区别是:

  • 在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中,没有任何功能显示可用令牌的列表。如果模块需要显示可用令牌的列表,则它必须自己构建令牌的列表,并在表单字段的描述中显示它;或者,它可以使用令牌模块中仍然可用的主题功能。

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(如果使用)。
kenorb

注意:$sanitize在上面的示例中未定义,因此您将Notice: Undefined variable了解。
kenorb

@kenorb好眼神,我看到这个答案已经更新了:)
WebMW

3

对于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;
}

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
什么是newsimple在这个例子吗?
user1359

使用Drupal \ Core \ Render \ BubbleableMetadata; $ token = \ Drupal :: token(); 函数modulename_tokens($ type,$ tokens,array $ data,array $ options,BubbleableMetadata $ bubbleable_metadata){...}
Karthikeyan Manivasagam

这应该放在modulename.tokens.inc中
oknate,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.