2010-08-03 3 views
4

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

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

Возможно, это делается для добавления нижнего колонтитула после вызывается другая функция?

ответ

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

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

+0

@kiamlaluno: «Понятно, что функция не вызывает реализацию hook_mail() каждого модуля, реализующего ее». Вызывает ли это вызов реализации hook_mail_alter для каждого модуля? – aneuryzm

+0

@ Патрик: Да. Это цель 'drupal_alter()': вызывать каждый модуль, реализующий перекрестный крючок, который соответствует имени, переданному в качестве первого аргумента функции. – kiamlaluno

+0

@Patrick: после вызова крюка (скажем, hook_example), и что-то вызывает 'drupal_alter',' hook_example_alter'. Поэтому 'hook _ * _ alter' всегда запускается после обычного hook. См. Http://api.drupal.org/api/function/drupal_alter/6 и функции, которые его называют, чтобы получить представление о том, как это работает. – 2010-08-03 17:08:36

 Смежные вопросы

  • Нет связанных вопросов^_^