Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是什么将Drupal挂钩与特定模块联系在一起的?_Php_Drupal_Drupal Modules_Drupal Hooks - Fatal编程技术网

Php 是什么将Drupal挂钩与特定模块联系在一起的?

Php 是什么将Drupal挂钩与特定模块联系在一起的?,php,drupal,drupal-modules,drupal-hooks,Php,Drupal,Drupal Modules,Drupal Hooks,是什么将Drupal挂钩与特定模块联系在一起的 在Drupal7中,每个核心模块都有一个“api”文件 这些文件中的每一个都包含一个从未调用过的函数,但是记录了其他模块(包括第三方)可以实现的钩子的存在 File: modules/path/path.api.php function hook_path_delete($path) { db_delete('mytable') ->condition('pid', $path['pid']) ->execute()

是什么将Drupal挂钩与特定模块联系在一起的

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

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

File: modules/path/path.api.php
function hook_path_delete($path) {
  db_delete('mytable')
    ->condition('pid', $path['pid'])
    ->execute();
}
我的问题是:是什么将特定钩子与特定模块联系在一起?为什么
path\u delete
hook包含在
path.api.php
文件中?为什么
entity\u视图
hook包含在
system.api.php
文件中?这只是任意的,在组织之后,还是Drupal系统中有什么东西将特定的钩子绑定到特定的模块?还是别的什么?


也许你可以试着为drupal学习钩拳?很简单:


关于hook\u path\u delete:
查看path.module,您将看到path_delete(…)调用的某处
例如,在path_node_update()中,调用此函数,然后更改当前路径,即删除之前的旧路径,而不是为节点创建新路径
现在查看定义的path_delete()函数的位置-它位于path.inc文件中:
在这个函数中,您将看到:module_invoke_all('path_delete',$path);-这个函数做什么
它列出了定义了hook\u path\u delete的所有模块(在drupal 7中是缓存的)(如我前面所示,对于yiu自定义模块,它定义为YOURMODULENAME\u path\u delete,这里也包括它),并逐个运行所有这些函数(运行顺序由模块的权重和文件名定义)
那么现在在自定义模块中可以做什么呢?您可以对此删除反应作出响应,并执行一些其他操作—例如,删除可用于复制该节点路径的其他路径(这只是一个示例)。

p、 美国。 启动自定义模块的好方法:

钩子是使用and调用的:如果您查看这两个函数的代码,您可能能够拼凑出它的工作原理,但基本上,如果我将此添加到模块的代码中:

// Other code

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

// More code
Drupal将调用它在启用的模块中找到的
hook\u foo\u bar($var1,$var2)
的每个实现。基于此,您应该看到,将特定钩子与特定模块联系起来的唯一东西是命名约定:如果我调用我的模块
foo
,我的钩子函数应该以
hook\ufoo\ucode>开头

关于调用
*.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\u foo\u bar()

function mymodule_foo_bar($var1, $var2) {
  return $var1 - $var2;
}
当调用
module\u invoke\u all()


核心中的
系统
模块有点包罗万象:Drupal 8的一项任务是将其功能委托给其他模块。

在注释、节点、分类法和用户模块中调用了hook_entity_视图(可能更多关于contrib.modules)。它是“低级”钩子,在这里你可以跟踪你的“$entities”发生了什么。我知道如何使用钩子,我对特定钩子的具体内容不感兴趣;我试图完整地、孤立地理解模块系统,以便理解Drupal的其余部分。您的评论很有用,但不要回答我的核心问题:是什么将钩子与特定模块联系起来的?约定,或者一些正式的东西。嗯,从答案中可以看到:modulename\u hookname-这一层modulename和hookname.module\u hook\u name是如何实现模块的。然而,durpal在模块api文件中记录了它的钩子,这意味着每个模块“提供”了一个钩子供其他模块实现。我想问的是,这种关系是正式的,还是仅仅通过文档和用法暗示的。谢谢,这正是我想要的。我理解钩子的基本概念,但想确认模块和钩子之间没有正式的联系,这只是惯例。
function mymodule_foo_bar($var1, $var2) {
  return $var1 - $var2;
}