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

Ala*_*orm 33 php drupal system drupal-modules

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

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

function mymodule_delete($node)
{
}
Run Code Online (Sandbox Code Playgroud)

删除节点时将调用此函数.

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

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

jps*_*ack 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
}
Run Code Online (Sandbox Code Playgroud)

  • 一些更正/ tipps:a)使用module_invoke_all()时,$ args不是引用.b)如果你想通过引用传递一些东西,可以使用drupal_alter()(在钩子名称上强制'_alter'后缀)或者module_implements +一个循环,然后直接调用实现.c)记录钩子的推荐方法是在yourmodule.api.php文件中,参见core的例子.d)收集信息时D7中的常见模式,如果使用信息后缀,也可以调用drupal_alter.示例<?php $ stuff = module_invoke_all('yourmodule_stuff_info'); drupal_alter('yourmodule_stuff_info',$ stuff); ?>. (4认同)

tyl*_*ein 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.
Run Code Online (Sandbox Code Playgroud)

现在,如果有人想使用你的钩子,那么他们可以在他们自己的模块中这样做:

/**
 * Implements hook_my_custom_goodness().
 */
function SOME_OTHER_MODULE_my_custom_goodness($variables) {
  $variables['msg'] = 'bar';
  return $variables;
}
Run Code Online (Sandbox Code Playgroud)

这里有一个更完整的解释:

http://tylerfrankenstein.com/code/drupal-create-custom-hook-for-other-modules