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()实现它的每个模块的实现,但它只为调用该函数的模块调用钩子。

还有其他一些区别,比如两个钩子被调用的时间(hook_mail_alter()不能设置消息的语言,这是在hook_mail_alter()调用之前设置的),以及它们得到的参数(hook_mail($key, &$message, $params)vs hook_mail_alter(&$message))。

于 2010-08-03T16:38:13.893 回答