钩子系统: Difference between revisions

Jump to navigation Jump to search
no edit summary
No edit summary
Line 13: Line 13:


=简介=
=简介=
Hooks 是一项开发功能,允许开发人员将自定义代码添加到Dolibarr的标准页面,而无需修改Dolibarr的核心文件。与链接到Dolibarr事件的 [[触发系统]](与Dolibarr代码交互的另一种方式)不同,Hooks可以放置在Dolibarr核心的任何时间、任何地点运行。这些是程序中的插入点(被视为代码执行从当前页面“转移”并运行自定义代码,然后返回的点)。
Hooks 是一项开发功能,允许开发人员将自定义代码添加到Dolibarr的标准页面,而无需修改Dolibarr的核心文件。与链接到Dolibarr事件的 [[触发系统]](与Dolibarr代码交互的另一种方式)不同,Hooks可以预埋在Dolibarr核心代码的任何时间、任何地点运行。这些是程序中的插入点(被视为代码执行从当前页面“转移”并运行自定义代码,然后返回的点)。


每个Hook都有一个名字,例如,代码:$reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action)中的“doActions”;然而,Hooks名称通常不是唯一的(可能在各种代码模块中重复使用),因此为了准确识别位置,代码模块具有一个“上下文”名称,该名称将被该代码模块位置中的所有Hooks引用。因此,要使用Hooks,您需要知道它的上下文名称(位置)和Hooks名称。
每个Hook都有一个名字,例如,代码:$reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action)中的“doActions”;然而,Hook的名称通常不是唯一的(可能在各种代码模块中重复使用),因此为了准确识别位置,代码模块具有一个“上下文”名称,该名称将被该代码模块位置中的所有Hooks引用。因此,要使用Hooks,您需要知道它的上下文名称(位置)和Hooks名称。


*Hooks是否处于活动状态取决于上下文(通常每个模块有一个上下文:例如,产品模块的“productcard”,发票模块的“invoicecard”等等)。要查找现有的Hooks,请在php文件中搜索“'''initHooks('''”。
*Hook是否处于活动状态取决于上下文(通常每个模块有一个上下文:例如,产品模块的“productcard”,发票模块的“invoicecard”等等)。要查找现有的Hooks,请在php文件中搜索“'''initHooks('''”。


这将找到诸如“$hookmanager->initHooks(array('thirdpartycomm','globalcard'));”的结果,其中“thirdpartycomm”是上下文名称  
这将找到诸如“$hookmanager->initHooks(array('thirdpartycomm','globalcard'));”的结果,其中“thirdpartycomm”是上下文名称  


*Hooks是插入或替换标准代码的函数。要查找可以覆盖的代码,请搜索“'''executeHooks('''”。找不到就可能没有定义钩子,所以你可以添加自己的钩子(并在Github中提交相应的拉取请求,以便将其包含在未来的版本中)。
*Hooks是用于插入或替换标准代码的函数。要查找可以覆盖的代码,请搜索“'''executeHooks('''”。找不到就可能没有预埋Hook,所以你可以添加自己的Hook(并在Github中提交相应的拉取请求,以便将其包含在未来的版本中)。


这将找到诸如“$reshook = $hookmanager->executeHooks('addMoreBoxStatsCustomer', $parameters, $object, $action);”的结果,其中“addMoreBoxStatsCoustomer”是Hook名称。
这将找到诸如“$reshook = $hookmanager->executeHooks('addMoreBoxStatsCustomer', $parameters, $object, $action);”的结果,其中“addMoreBoxStatsCoustomer”是Hook名称。


=添加hook以允许插入代码=
=添加hook以允许插入代码=
要在您自己的模块中实现hook(以便您的模块可以被其他模块“钩住”),您需要执行两个步骤。
要在您自己的模块中预埋hook(以便您的模块可以被其他模块“挂接”),您需要执行两个步骤。


这些步骤必须为模块中要实现hook的每个PHP脚本复制。当然,这也是钩子在每个核心Dolibarr模块中实现的方式。
这些步骤必须为模块中要预埋hook的每个PHP脚本复制。当然,这也是hook在每个核心Dolibarr模块中实现的方式。


1 - 初始化HookManager对象
1 - 初始化HookManager对象
Line 52: Line 52:
global $hookmanager;
global $hookmanager;
</syntaxhighlight>
</syntaxhighlight>
2 - 然后将钩子调用放置在允许添加代码的位置:
 
2 - 然后将<syntaxhighlight lang="PHP">
$parameters=array();
$reshook=$hookmanager->executeHooks('hookname',$parameters,$object,$action); // See description below
// Note that $action and $object may have been modified by hook
if (empty($reshook))
{
  ... // standard code that can be disabled/replaced by hook if return code > 0.
}
</syntaxhighlight>调用放置在允许添加代码的位置:


<syntaxhighlight lang="PHP">
<syntaxhighlight lang="PHP">
Line 67: Line 76:


- '<nowiki/>'''hookname'''' 是将被调用的hook的名称(可以是您想要的任何内容,也可以遵循 Dolibarr 的命名法,查看下面的钩子列表)。例如:“formObjectOptions”
- '<nowiki/>'''hookname'''' 是将被调用的hook的名称(可以是您想要的任何内容,也可以遵循 Dolibarr 的命名法,查看下面的钩子列表)。例如:“formObjectOptions”


- '''$parameters''' 是一个自定义数组,用于向钩子传递更多自定义数据(钩子中的函数可以处理这些数据)。把你想要的放在这里,它可以是一个文件、一个字符串数组、或任何东西...
- '''$parameters''' 是一个自定义数组,用于向钩子传递更多自定义数据(钩子中的函数可以处理这些数据)。把你想要的放在这里,它可以是一个文件、一个字符串数组、或任何东西...
714

edits

Navigation menu