回答:
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では、receiveの実装hook_tokens()
は$tokens
、引数として置換されるトークンの配列です。モジュールは、トークンが使用されることを認識して、トークンの値を計算できます。
Drupal 7でトークンを値に置き換えるために使用される関数はtoken_replace()です。これは、トークンを値に置き換えるために使用される唯一の関数です。
Drupal 6のトークンモジュールとDrupal 7のコードのその他の違いは次のとおりです。
hook_tokens()
トークンのコンテンツをサニタイズする必要があるときにフックに通知するパラメーターの取得の実装。トークン値をサニタイズする必要がない場合、コンテンツは関数check_plain()
またはに渡されませんfilter_xss()
。トークンのサイト情報セクションにCity nameと呼ばれる新しいトークンを追加したかった。これが、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モジュールの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
、この例では?