4

hook_mail を既に持っている場合、hook_mail_alter を使用する意味は何ですか?

たとえば、メール メッセージにフッターを追加するために hook_mail_alter が使用されていることがわかりました。しかしhook_mail()、2 つの関数を使用する代わりに、それを追加するために使用することもできます...何が欠けていますか?

たぶん、他の関数が呼び出された後にフッターを追加するために行われますか?

4

1 に答える 1

8

hook_mail()モジュールからそれ自体のメール メッセージを変更するためhook_mail_alter()に使用する必要がありますが、他のモジュールによって送信されたメッセージを変更するためにモジュールから使用する必要があります。

これは、 から取得した次のコードから明らかですdrupal_mail()

// Build the e-mail (get subject and body, allow additional headers) by
// invoking hook_mail() on this module. We cannot use module_invoke() as
// we need to have $message by reference in hook_mail().
if (function_exists($function = $module .'_mail')) {
  $function($key, $message, $params);
}

// Invoke hook_mail_alter() to allow all modules to alter the resulting e-mail.
drupal_alter('mail', $message);

$moduleに渡される最初のパラメータdrupal_mail()です。関数がそれを実装するすべてのモジュール
の実装を呼び出すわけではないことは明らかですが、関数を呼び出すモジュールに対してのみフックを呼び出します。hook_mail()

2 つのフックが呼び出されるタイミング ( が呼び出さhook_mail_alter()れる前に設定されたメッセージの言語を設定できないhook_mail_alter()) や、それらが取得するパラメーター (hook_mail($key, &$message, $params)に対してhook_mail_alter(&$message)) など、他にも違いがあります。

于 2010-08-03T16:38:13.893 に答える