web-dev-qa-db-ja.com

「user:one-time-login-url」トークンがtoken_replaceに置き換えられない

Hook_mail_alterフックを使用して、ユーザーに手動で電子メールを送信しようとしています。以下は、全体としての私の機能です:

function custom_module_mail_alter(&$message) {
    $email = '[user:name],

A site administrator at [site:name] has created an account for you. You may now log in by clicking this link or copying and pasting it to your browser:

[user:one-time-login-url]

This link can only be used once to log in and will lead you to a page where you can set your password.

After setting your password, you will be able to log in at [site:login-url] in the future using:

username: [user:name]
password: Your password

--  [site:name] team';

    $account = $message['params']['account'];
    $uid = $account->uid;

    $_user = user_load($uid);

    dpm(token_replace($email, array('user'=>$_user)));
}

出力は次のようになります。

Peter,

A site administrator at Website has created an account for you. You may now log in by clicking this link or copying and pasting it to your browser:

[user:one-time-login-url]

This link can only be used once to log in and will lead you to a page where you can set your password.

After setting your password, you will be able to log in at http://localhost/website/user in the future using:

username: Peter
password: Your password

--  Website team

ご覧のとおり、[user:name]、[site:name]、[site:login-url]などが適切に処理されています。処理されない唯一のトークンは[user:one-time-login-url]です。なぜこれが起こっているのですか?

編集:参考までに、トークンdoesはシステムによって自動的に送信されるウェルカム電子メールで処理されるため、トークンモジュールはアクティブですand機能しています... token_replace()を手動で呼び出しても処理されないようです。

7
Peter

そのトークンを置き換えるには、token_replace()token_replace($email, array('user' => $_user), array('callback' => 'user_mail_tokens', 'sanitize' => FALSE))として呼び出す必要があります。

関数 ser_mail_tokens() は、ドキュメントでは次のように説明されています。

ユーザーのメールに安全でないトークンを追加するためのトークンコールバック。

この関数は token_replace() の最後に _ user_mail_text() の呼び出しで使用され、 によって生成される電子メールメッセージで使用できる追加のトークンを設定します。 user_mail()

_user_mail_text()がそのコールバックを呼び出すために使用するコードは次のコードです。

// We do not sanitize the token replacement, since the output of this
// replacement is intended for an e-mail message, not a web browser.
return token_replace($text, $variables, array('language' => $language, 'callback' => 'user_mail_tokens', 'sanitize' => FALSE));

Drupal 7.では、トークンモジュールはトークンを置き換える必要はありません。トークンを置き換えるコードは、Drupal 7コアコードの一部です。 Drupal 7は、Drupalコアモジュールが定義しない追加のトークンを定義します。

11
kiamlaluno