将Drupal连接到特定模块的关系是什么?

时间:2011-02-15 04:18:15

标签: php drupal drupal-modules drupal-hooks

Drupal与特定模块的关系是什么?

在Drupal 7中,每个核心模块都有一个“api”文件

$ ls modules/*/*.api.php
modules/aggregator/aggregator.api.php   modules/openid/openid.api.php
modules/block/block.api.php             modules/overlay/overlay.api.php
modules/comment/comment.api.php         modules/path/path.api.php
modules/contextual/contextual.api.php   modules/rdf/rdf.api.php
modules/dashboard/dashboard.api.php     modules/search/search.api.php
modules/field/field.api.php             modules/shortcut/shortcut.api.php
modules/field_ui/field_ui.api.php       modules/simpletest/simpletest.api.php
modules/file/file.api.php               modules/system/system.api.php
modules/filter/filter.api.php           modules/system/theme.api.php
modules/help/help.api.php               modules/taxonomy/taxonomy.api.php
modules/image/image.api.php             modules/trigger/trigger.api.php
modules/locale/locale.api.php           modules/update/update.api.php
modules/menu/menu.api.php               modules/user/user.api.php
modules/node/node.api.php

这些文件中的每一个都包含一个从不(?)调用的函数,但记录了其他模块(包括第三方)可以实现的钩子的存在。

File: modules/path/path.api.php
function hook_path_delete($path) {
  db_delete('mytable')
    ->condition('pid', $path['pid'])
    ->execute();
}

我的问题:特定挂钩与特定模块的关系是什么?为什么path_delete挂钩包含在path.api.php文件中?为什么entity_view挂钩包含在system.api.php文件中?在事实组织之后,这是否是武断的,或者Drupal系统中是否存在将特定挂钩与特定模块联系起来的东西?或其他什么?

2 个答案:

答案 0 :(得分:4)

使用module_invoke()module_invoke_all()调用挂钩:如果你查看这两个函数的代码,你可以将它的工作原理拼凑在一起,但基本上,如果我将它添加到我的模块的代码:

// Other code

$foo = module_invoke_all('foo_bar', $var1, $var2);

// More code

Drupal将调用它在启用的模块中找到的hook_foo_bar($var1, $var2)的每个实现。基于此,您应该看到只有特定钩子与特定模块相关联的是命名约定:如果我调用模块foo,我的钩子函数应该以{{1​​}}开头。

你在调用hook_foo_时没有任何意义:因为模块调用只是一个函数调用,所以模块作者只包含*.api.php仅用于文档目的,以通知实现者如何实现钩子。

例如,在上面的情况中,foo.api.php将包含一个示例函数,如:

foo.api.php

但作为模块实现者,我可以以不同的方式实现/** * Doxygen comments documenting the function goes here */ function hook_foo_bar($var1, $var2) { return $var1 + $var2; }

hook_foo_bar()

当调用function mymodule_foo_bar($var1, $var2) { return $var1 - $var2; } 时,Drupal将使用实现模块的短名称(module_invoke_all())和传递给mymodulemodule_invoke_all())的钩子名称来制作函数,因此调用我刚刚定义的函数foo_bar

核心中的mymodule_foo_bar()模块有点全面:Drupal 8的一个任务是kill it off并将其功能委托给其他模块。

答案 1 :(得分:0)


也许你可以尝试学习drupal挂钩?这很容易:
http://api.drupal.org/api/drupal/includes--module.inc/group/hooks/7
 
关于hook_path_delete:
看看path.module,你会看到某个地方的path_delete(...)调用。
例如,在path_node_update()中 - 此函数调用然后您更改当前路径 - 它之前删除旧路径,而不是为节点创建新路径。
现在查看定义的path_delete()函数 - 它放在path.inc文件中:
在这个函数中你会看到:module_invoke_all('path_delete',$ path); - 这个功能有用吗?
它列出了所有模块(在drupal 7中它被缓存),其中定义了hook_path_delete(如我之前所示,对于yiu自定义模块,它定义为YOURMODULENAME_path_delete,它也将包括在这里),并逐个运行所有这些函数(运行顺序)由模块的重量和文件名定义)。
那么现在你可以在自定义模块中做什么?您可以响应此删除反应并执行其他操作 - 例如,删除可用于复制该节点路径的其他路径(仅作为示例)。  

P.S。 启动自定义模块的好处:http://drupal.org/contributors-guide