“User: one-time-login-url” token tidak diganti oleh token_replace

7

Saya mencoba mengirim e-mail ke pengguna secara manual dengan menggunakan hook_mail_alter hook. Berikut ini adalah fungsi saya secara keseluruhan:

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

Outputnya terlihat seperti ini:

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

Seperti yang Anda lihat, hal-hal seperti [pengguna: nama], [situs: nama], dan [situs: login-url] diproses dengan benar. Satu-satunya token yang tidak diproses adalah [user: one-time-login-url]. Adakah ide mengapa ini terjadi?

EDIT: Hanya untuk referensi, token tidak diproses dalam e-mail Selamat Datang yang dikirim oleh sistem secara otomatis, sehingga modul token aktif dan berfungsi ... Sepertinya tidak diproses saat saya memanggil token_replace secara manual ().

Peter
sumber
Apakah Anda mengaktifkan token.module? Sepertinya token itu didefinisikan dalam token_token_info () dan bukan di user_token_info ().
Berdir
Ya, modul Token diaktifkan, dan saya menggunakan Beta7 terbaru ... Ini agak aneh.
Peter

Jawaban:

11

Untuk mengganti token itu, Anda harus memanggil token_replace()sebagai token_replace($email, array('user' => $_user), array('callback' => 'user_mail_tokens', 'sanitize' => FALSE)).

Fungsi user_mail_tokens () dijelaskan dalam dokumentasi sebagai:

Callback token untuk menambahkan token yang tidak aman untuk email pengguna.

Fungsi ini digunakan oleh panggilan token_replace () di akhir _user_mail_text () untuk menyiapkan beberapa token tambahan yang dapat digunakan dalam pesan email yang dihasilkan oleh user_mail () .

Kode yang digunakan oleh _user_mail_text()untuk memanggil callback adalah yang berikut.

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

Modul Token tidak perlu untuk mengganti token, dalam Drupal 7. Kode untuk mengganti token adalah bagian dari kode inti Drupal 7; modul Token di Drupal 7 mendefinisikan token tambahan yang tidak didefinisikan modul inti Drupal.

kiamlaluno
sumber