プログラムでトークンを作成するにはどうしますか?モジュールにカスタムトークンを追加したいと思います。
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()
を使用して、トークンを実装するモジュールにトークンのすべての値を要求します。これは、モジュールがトークンの値を計算できることを意味します。この値は、置き換えられるトークンには必要ありません。In Drupal 7、hook_tokens()
の実装は、置き換えられるトークンの配列である_$tokens
_を引数として受け取ります;モジュールはそれを知っているトークンの値を計算できます使用されます。
Drupal 7でトークンを値に置き換えるために使用される関数は token_replace() です。これは、トークンを値に置き換えるために使用される唯一の関数です。
Drupal 6のTokenモジュールとDrupal 7のコードは、
hook_tokens()
の実装は、トークンのコンテンツをサニタイズする必要があるときにフックに伝えるパラメータを取得します。トークンの値を無害化する必要はありません。コンテンツは関数check_plain()
またはfilter_xss()
に渡されません。市名と呼ばれるトークンのSite informationセクションに新しいトークンを追加したかったのです。 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;
}
Drupal 8の場合、ノードオブジェクトを使用した例:
トークンを登録するには、hook_token_info()を使用してmymodule.tokens.incのモジュールにトークンを配置し、置換データにはhook_tokens()を使用します。
ノードなどの既存のトークンタイプのカスタムトークンを作成する場合は、hook_token_info()内のサブ配列内にトークンを配置する必要があります。 nodeモジュールの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);