是否可以在Drupal模块中创建您自己的钩子以供其他Drupal模块使用?如果没有,Drupal中是否有一个机制可供第三方开发人员提供钩子?如果到目前为止一切都没有,那么核心是实施的钩子列表?
据我所知,Drupal模块处理类似于hooks的系统之类的事件。创建新模块时,可以创建实现钩子的函数。例如,有hook_delete
个钩子。如果在模块中实现一个功能
function mymodule_delete($node)
{
}
只要删除节点,就会调用此函数。
我想知道的是,作为第三方模块开发人员,还是有办法创建我自己的挂钩。比如hook_alanskickbutthook
之类的东西,以便其他模块开发人员可以订阅这个钩子。
如果可以的话,你怎么做?我查看了官方文档并且在那里找不到多少,当我开始探索Drupal源代码时,我仍然感到有些晕眩(我理解递归,但是没有花太多时间考虑递归问题)。欢迎提供完整的解决方案,但我很高兴能够指出正确的方向。
答案 0 :(得分:37)
Module_invoke_all()是创建自己的钩子的门票:
请参阅API:
http://api.drupal.org/api/drupal/includes--module.inc/function/module_invoke_all
然后看看这篇伟大的文章:
(编辑:在http://himerus.com/blog/himerus/creating-hooks-your-drupal-modules,但现在已经消失了)
一旦你完成了钩子,可以使用以下方法在另一个模块中调用它:
/**
* Implementation of hook_myhookname()
*/
function THISMODULENAME_myhookname(args){
//do stuff
}
答案 1 :(得分:6)
例如,假设你想为其他人创建hook_my_custom_goodness()。然后只需将这样的代码放在您希望挂钩发生的模块中:
$variables['msg'] = 'foo';
// Make sure at least one module implements our hook.
if (sizeof(module_implements('my_custom_goodness')) > 0) {
// Call modules that implement the hook, and let them change $variables.
$variables = module_invoke_all('my_custom_goodness', $variables);
}
drupal_set_message($variables['msg']); // Will display 'bar' instead.
现在,如果有人想使用你的钩子,那么他们可以在他们自己的模块中这样做:
/**
* Implements hook_my_custom_goodness().
*/
function SOME_OTHER_MODULE_my_custom_goodness($variables) {
$variables['msg'] = 'bar';
return $variables;
}
这里有一个更完整的解释:
http://tylerfrankenstein.com/code/drupal-create-custom-hook-for-other-modules
答案 2 :(得分:0)
如果我记得...... http://api.drupal.org/api/drupal/modules--node--node.api.php/function/hook_delete/7
有帮助吗?我和Drupal搞砸了一段时间。
要创建/提供自定义Drupal挂钩,必须以一种方式实现,即使用module_invoke或module_invoke_all调用挂钩不会与其他模块挂钩发生冲突。钩子的名称应该是唯一的,并且应该以一般方式提供所有/特定功能,使得它不需要对代码进行任何类型的调整。所有配置必须放在管理页面上,并且应该将这些配置存储在单独的表中,或者由Drupal创建的任何现有表或模块所依赖的模块。钩子应该易于被其他模块实施,并且实现起来不应该太复杂。创建自定义挂钩时,您的模块将作为API提供程序。
答案 3 :(得分:0)
对于Drupal 6& 7,drupal_alter()可能是最好的选择。
如the module_invoke_all() documentation中所述,
所有参数都按值传递。如果需要,请使用drupal_alter() 通过引用传递参数。
在Drupal 8中,使用ModuleHandler::alter。
将可变变量传递给特定的hook_TYPE_alter() 的实施方式。