web-dev-qa-db-ja.com

[user:display-name]トークンの背後にあるワークフローは何ですか?

電子メールテンプレートで、[user:display-name]という名前のトークンを見たことがあります。さらに、このトークンはグローバルではないことに注意してください。その値はメールテンプレートでのみレンダリングされます(間違っている場合は修正してください)。

電子メールトークン専用に特別に設計されたこれらの特定のトークンはどのように作成されましたか?

現在のユーザーは、電子メールの送信先である電子メールレシーバーの値を保存していないため、そのロジックがどのファイルに書き込まれているのか、私はとても興味があります。次に、現在のユーザーがメールを送信しているときに、表示名の値を選択します。

1
Sugandh Khanna

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()からは置き換えられません)を正しい値に置き換えます。

同様のコードを任意のモジュールから使用して、特定のコンテキストでのみ使用可能でなければならないトークンを生成できます。

2
kiamlaluno

その値はメールテンプレートでのみレンダリングされます

真実ではありません。そのトークンは、システムがユーザーエンティティタイプのトークンを収集するときにいつでも使用できます。

電子メールトークン専用に特別に設計されたこれらの特定のトークンはどのように作成されましたか?

前述のように、これらはメールだけでなく、 user_token_info() で定義され、 user_tokens() で生成されます。

次に、現在のユーザーがメールを送信しているときに、表示名の値を選択します。

トークンフックはユーザーアカウントにアクセスできるため、$account->getDisplayName();を使用してデータを入力します。

1
Clive