Ala*_*orm 5 php drupal drupal-hooks drupal-modules
什么将 Drupal Hook 与特定模块联系起来?
在 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
Run Code Online (Sandbox Code Playgroud)
这些文件中的每一个都包含一个从不 (?) 调用的函数,但记录了其他模块(包括第 3 方)可以实现的钩子的存在。
File: modules/path/path.api.php
function hook_path_delete($path) {
db_delete('mytable')
->condition('pid', $path['pid'])
->execute();
}
Run Code Online (Sandbox Code Playgroud)
我的问题:是什么将特定钩子与特定模块联系起来?为什么path_delete钩子包含在path.api.php文件中?为什么entity_view钩子包含在system.api.php文件中?这只是任意的,事后组织,还是 Drupal 系统中是否有将特定钩子与特定模块联系起来的东西?或者是其他东西?
小智 5
使用module_invoke()and调用钩子module_invoke_all():如果您查看这两个函数的代码,您可能能够拼凑出它是如何工作的,但基本上,如果我将其添加到我的模块代码中:
// Other code
$foo = module_invoke_all('foo_bar', $var1, $var2);
// More code
Run Code Online (Sandbox Code Playgroud)
Drupal 将调用hook_foo_bar($var1, $var2)它在已启用模块中找到的每个实现。基于此,您应该看到唯一将特定钩子与特定模块联系起来的东西是命名约定:如果我调用我的模块foo,我的钩子函数应该以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;
}
Run Code Online (Sandbox Code Playgroud)
但作为模块实现者,我可以hook_foo_bar()用不同的方式实现:
function mymodule_foo_bar($var1, $var2) {
return $var1 - $var2;
}
Run Code Online (Sandbox Code Playgroud)
当module_invoke_all()被调用时,Drupal 将使用实现模块的短名称 ( mymodule) 和传递给module_invoke_all()( foo_bar)的钩子名称制作一个函数,从而调用mymodule_foo_bar()我刚刚定义的函数。
system核心中的模块有点包罗万象:Drupal 8 的一项任务是将其关闭并将其功能委托给其他模块。
| 归档时间: |
|
| 查看次数: |
1220 次 |
| 最近记录: |