你能在Drupal中创建自己的钩子吗?

时间:2011-02-14 16:22:00

标签: php drupal drupal-modules system

是否可以在Drupal模块中创建您自己的钩子以供其他Drupal模块使用?如果没有,Drupal中是否有一个机制可供第三方开发人员提供钩子?如果到目前为止一切都没有,那么核心是实施的钩子列表?

据我所知,Drupal模块处理类似于hooks的系统之类的事件。创建新模块时,可以创建实现钩子的函数。例如,有hook_delete个钩子。如果在模块中实现一个功能

function mymodule_delete($node)
{
}

只要删除节点,就会调用此函数。

我想知道的是,作为第三方模块开发人员,还是有办法创建我自己的挂钩。比如hook_alanskickbutthook之类的东西,以便其他模块开发人员可以订阅这个钩子。

如果可以的话,你怎么做?我查看了官方文档并且在那里找不到多少,当我开始探索Drupal源代码时,我仍然感到有些晕眩(我理解递归,但是没有花太多时间考虑递归问题)。欢迎提供完整的解决方案,但我很高兴能够指出正确的方向。

4 个答案:

答案 0 :(得分:37)

Module_invoke_all()是创建自己的钩子的门票:

请参阅API:

http://api.drupal.org/api/drupal/includes--module.inc/function/module_invoke_all

然后看看这篇伟大的文章:

http://web.archive.org/web/20101227170201/http://himerus.com/blog/himerus/creating-hooks-your-drupal-modules

(编辑:在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()   的实施方式。