Токен «user: one-time-login-url» не заменяется на token_replace


7

Я пытаюсь отправить электронную почту пользователям вручную с помощью хука 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]. Есть идеи, почему это происходит?

РЕДАКТИРОВАТЬ: просто для справки, токен действительно обрабатывается в сообщениях приветствия, которые система автоматически отправляет, так что модуль токена активен и работает ... Кажется, он не обрабатывается, когда я вручную вызываю token_replace ().


У вас включен токен.модуль? Похоже, этот токен определен в token_token_info (), а не в user_token_info ().
Бердир

Да, модуль Token включен, и я использую последнюю версию Beta7 ... Это довольно странно.
Питер

Ответы:


11

Чтобы заменить этот токен, вам нужно позвонить token_replace()как token_replace($email, array('user' => $_user), array('callback' => 'user_mail_tokens', 'sanitize' => FALSE)).

Функция user_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));

Модуль Token не требуется для замены токенов в Drupal 7. Код для замены токенов является частью кода ядра Drupal 7; модуль Token в Drupal 7 определяет дополнительные токены, которые не определены базовыми модулями Drupal.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.