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)
).
@kiamlaluno: «Понятно, что функция не вызывает реализацию hook_mail() каждого модуля, реализующего ее». Вызывает ли это вызов реализации hook_mail_alter для каждого модуля? – aneuryzm
@ Патрик: Да. Это цель 'drupal_alter()': вызывать каждый модуль, реализующий перекрестный крючок, который соответствует имени, переданному в качестве первого аргумента функции. – kiamlaluno
@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