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

2022-08-30 13:59:13

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

据我所知,Drupal模块在一个类似于钩子的系统之类的事件上工作。创建新模块时,将创建实现挂钩的函数。例如,有一个钩子。如果在模块中实现函数hook_delete

function mymodule_delete($node)
{
}

每当删除节点时,都会调用此函数。

我想知道的是,作为第三方模块开发人员,是否有办法创建我自己的钩子。比如说,这样其他模块开发人员就可以订阅这个钩子。hook_alanskickbutthook

如果这是可能的,你是怎么做到的?我已经查看了官方文档,没有找到太多,当我开始浏览Drupal源代码时,我仍然有点头晕(我理解递归,但不要花足够的时间思考递归问题)。欢迎提供全面的解决方案,但我很高兴能被指出正确的方向。


答案 1

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
}

答案 2

例如,假设您要创建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


推荐