Какой смысл иметь hook_mail_alter, если у меня уже есть hook_mail?

Какой смысл иметь hook_mail_alter, если у меня уже есть hook_mail?

Например, я увидел, что hook_mail_alter используется для добавления нижнего колонтитула в мое почтовое сообщение. Но я мог бы использовать hook_mail() добавить его, вместо того, чтобы использовать 2 функции... Чего мне не хватает?

Может быть, это сделано, чтобы добавить нижний колонтитул после вызова какой-либо другой функции?

1 ответ

Решение

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() каждого реализующего его модуля, но он вызывает хук только для модуля, вызывающего функцию.

Существуют и другие различия, например, когда вызываются два хука (hook_mail_alter() невозможно установить язык для сообщения, установленного ранее hook_mail_alter() вызывается), и параметры они получают (hook_mail($key, &$message, $params) против hook_mail_alter(&$message)).

Другие вопросы по тегам