【发布时间】:2010-08-03 16:19:11
【问题描述】:
如果我已经拥有 hook_mail,那么拥有 hook_mail_alter 有什么意义?
例如,我看到 hook_mail_alter 用于为我的邮件添加页脚。但我可以使用 hook_mail() 来添加它,而不是使用 2 个函数……我错过了什么?
也许在调用其他函数之后添加页脚?
【问题讨论】:
标签: drupal drupal-6 drupal-hooks
如果我已经拥有 hook_mail,那么拥有 hook_mail_alter 有什么意义?
例如,我看到 hook_mail_alter 用于为我的邮件添加页脚。但我可以使用 hook_mail() 来添加它,而不是使用 2 个函数……我错过了什么?
也许在调用其他函数之后添加页脚?
【问题讨论】:
标签: drupal drupal-6 drupal-hooks
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)与@ 987654334@).
【讨论】:
drupal_alter() 的目的:调用每个实现与作为第一个参数传递给函数的名称相匹配的更改钩子的模块。
drupal_alter、hook_example_alter 之后运行。所以hook_*_alter 总是在常规钩子之后运行。请参阅 api.drupal.org/api/function/drupal_alter/6 以及调用它的函数以了解它的工作原理。
hook_example_alter() 将在模块调用drupal_alter('example') 时被调用;并非所有使用hook_example() 的模块也使用hook_example_alter()。确实一般hook_example_alter() is invoked after hook_example()`。
hook_mail() 的一些实现不检查第一个参数(比较 user_mail() 和 contact_mail()),因为它们只是发送一种消息。如果您调用module_invoke_all('mail'),这些实现会认为他们收到了他们发送的消息,并且他们可能会以不正确的方式更改消息。