Le jeton «utilisateur: connexion unique» n'est pas remplacé par token_replace

7

J'essaie d'envoyer des e-mails aux utilisateurs manuellement en utilisant le hook hook_mail_alter. Ce qui suit est ma fonction dans son intégralité:

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)));
}

La sortie ressemble à ceci:

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

Comme vous pouvez le voir, des choses comme [utilisateur: nom], [site: nom] et [site: login-url] sont correctement traitées. Le seul jeton non traité est [user: one-time-login-url]. Des idées pourquoi cela se produit?

EDIT: Juste pour référence, le jeton est traité dans les e-mails de bienvenue envoyés automatiquement par le système, donc le module de jeton est actif et fonctionne ... Il ne semble tout simplement pas être traité lorsque j'appelle manuellement token_replace ().

Peter
la source
Avez-vous le token.module activé? Il semble que le jeton soit défini dans token_token_info () et non dans user_token_info ().
Berdir
Oui, le module Token est activé, et j'utilise la dernière Beta7 ... C'est plutôt étrange.
Peter

Réponses:

11

Pour remplacer ce jeton, vous devez appeler en token_replace()tant que token_replace($email, array('user' => $_user), array('callback' => 'user_mail_tokens', 'sanitize' => FALSE)).

La fonction user_mail_tokens () est décrite dans la documentation comme:

Rappel de jeton pour ajouter des jetons dangereux pour les e-mails des utilisateurs.

Cette fonction est utilisée par l' appel token_replace () à la fin de _user_mail_text () pour configurer des jetons supplémentaires qui peuvent être utilisés dans les messages électroniques générés par user_mail () .

Le code utilisé par _user_mail_text()pour appeler ce rappel est le suivant.

// 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));

Le module Token n'est pas nécessaire pour remplacer les jetons, dans Drupal 7. Le code pour remplacer les jetons fait partie du code principal de Drupal 7; le module Token de Drupal 7 définit des jetons supplémentaires que les modules de base Drupal ne définissent pas.

kiamlaluno
la source