電子メールテンプレートで、[user:display-name]という名前のトークンを見たことがあります。さらに、このトークンはグローバルではないことに注意してください。その値はメールテンプレートでのみレンダリングされます(間違っている場合は修正してください)。
電子メールトークン専用に特別に設計されたこれらの特定のトークンはどのように作成されましたか?
現在のユーザーは、電子メールの送信先である電子メールレシーバーの値を保存していないため、そのロジックがどのファイルに書き込まれているのか、私はとても興味があります。次に、現在のユーザーがメールを送信しているときに、表示名の値を選択します。
Cliveが言ったように、トークンは hook_token_info()
および hook_tokens()
から生成されます。 User
エンティティの場合、これらのフックはUserモジュールから実装されます。トークンの値は、メールテンプレートだけでなく、 token サービスを使用するすべての関数/メソッドで利用できます。たとえば、コントローラーでは、次のようなコードを使用できます。
_$bubbleable_metadata = new BubbleableMetadata();
$build['#markup'] = $this->tokenService->replace('Tokens: [node:nid] [current-user:uid]', ['node' => $node], [], $bubbleable_metadata);
$bubbleable_metadata->applyTo($build);
_
ユーザーアカウントの表示名を取得することは簡単です。ユーザートークンが生成されると、user_tokens()
はユーザーオブジェクトを取得します。そのユーザーオブジェクトで User::getDisplayName()
を呼び出すと、その表示名が返されます。user_tokens()
から使用されるコードを参照してください。特に、次のコードを参照してください。 (コメントは私のものです。)
_// Retrieves the user object passed to the hook.
$account = $data['user'];
_
_// Generates the value for the display name token.
$replacements[$original] = $account
->getDisplayName();
if ($account->isAnonymous()) {
$bubbleable_metadata->addCacheableDependency(\Drupal::config('user.settings'));
}
_
電子メールテンプレートでのみ使用できるユーザートークンがあるのは事実ですが、電子メールテンプレートのトークンを置き換えるときに使用されるコールバックから生成されます。 user_mail()
および user_mail_tokens()
を参照してください。
_ // user_mail()
$token_service = \Drupal::token();
$language_manager = \Drupal::languageManager();
$langcode = $message['langcode'];
$variables = ['user' => $params['account']];
$language = $language_manager->getLanguage($params['account']
->getPreferredLangcode());
$original_language = $language_manager->getConfigOverrideLanguage();
$language_manager->setConfigOverrideLanguage($language);
$mail_config = \Drupal::config('user.mail');
$token_options = [
'langcode' => $langcode,
'callback' => 'user_mail_tokens',
'clear' => TRUE,
];
$message['subject'] .= PlainTextOutput::renderFromHtml($token_service
->replace($mail_config->get($key . '.subject'), $variables, $token_options));
$message['body'][] = $token_service
->replace($mail_config->get($key . '.body'), $variables, $token_options);
_
_function user_mail_tokens(&$replacements, $data, $options) {
if (isset($data['user'])) {
$replacements['[user:one-time-login-url]'] = user_pass_reset_url($data['user'], $options);
$replacements['[user:cancel-url]'] = user_cancel_url($data['user'], $options);
}
}
_
user_mail()
は Token::replace()
と言い、すべてのトークンが生成された後にuser_mail_tokens()
を呼び出す必要があり、user_mail_tokens()
が置き換えられます[user:one-time-login-url]および[user:one-time-cancel-url] (Token::replace()
からは置き換えられません)を正しい値に置き換えます。
同様のコードを任意のモジュールから使用して、特定のコンテキストでのみ使用可能でなければならないトークンを生成できます。
その値はメールテンプレートでのみレンダリングされます
真実ではありません。そのトークンは、システムがユーザーエンティティタイプのトークンを収集するときにいつでも使用できます。
電子メールトークン専用に特別に設計されたこれらの特定のトークンはどのように作成されましたか?
前述のように、これらはメールだけでなく、 user_token_info()
で定義され、 user_tokens()
で生成されます。
次に、現在のユーザーがメールを送信しているときに、表示名の値を選択します。
トークンフックはユーザーアカウントにアクセスできるため、$account->getDisplayName();
を使用してデータを入力します。