45 public $errors = array();
48 public $contextarray = array();
51 public $hooks = array();
54 public $resArray = array();
56 public $resPrint =
'';
58 public $resNbOfHooks = 0;
87 if (!is_array($conf->modules_parts[
'hooks']) || empty($conf->modules_parts[
'hooks'])) {
92 if (!is_array($arraycontext)) {
93 $arraycontext = array($arraycontext);
96 $this->contextarray = array_unique(array_merge($arraycontext, $this->contextarray));
98 $arraytolog = array();
99 foreach ($conf->modules_parts[
'hooks'] as $module => $hooks) {
100 if (empty($conf->$module->enabled)) {
105 foreach ($arraycontext as $context) {
106 if (is_array($hooks)) {
107 $arrayhooks = $hooks;
109 $arrayhooks = explode(
':', $hooks);
112 if (in_array($context, $arrayhooks) || in_array(
'all', $arrayhooks)) {
114 if (empty($this->hooks[$context][$module]) || !is_object($this->hooks[$context][$module])) {
115 $path =
'/'.$module.
'/class/';
116 $actionfile =
'actions_'.$module.
'.class.php';
118 $arraytolog[] =
'context='.$context.
'-path='.$path.$actionfile;
121 $controlclassname =
'Actions'.ucfirst($module);
122 $actionInstance =
new $controlclassname($this->
db);
123 $priority = empty($actionInstance->priority) ? 50 : $actionInstance->priority;
124 $this->hooks[$context][$priority.
':'.$module] = $actionInstance;
131 if (count($arraytolog) > 0) {
132 dol_syslog(get_class($this).
"::initHooks Loading hooks: ".join(
', ', $arraytolog), LOG_DEBUG);
135 foreach ($arraycontext as $context) {
136 if (!empty($this->hooks[$context])) {
137 ksort($this->hooks[$context], SORT_NATURAL);
156 public function executeHooks($method, $parameters = array(), &$object =
'', &$action =
'')
158 if (!is_array($this->hooks) || empty($this->hooks)) {
162 $parameters[
'context'] = join(
':', $this->contextarray);
167 $hooktype =
'output';
173 'addMoreActionsButtons',
174 'addMoreMassActions',
179 'createDictionaryFieldlist',
180 'editDictionaryFieldlist',
187 'formCreateThirdpartyOptions',
190 'formBuilddocLineOptions',
191 'formatNotificationMessage',
193 'getAccessForbiddenMessage',
197 'getFormatedCustomerRef',
198 'getFormatedSupplierRef',
201 'menuDropdownQuickaddItems',
209 'pdf_getlineref_supplier',
210 'pdf_getlinevatrate',
211 'pdf_getlineupexcltax',
212 'pdf_getlineupwithtax',
214 'pdf_getlineqty_asked',
215 'pdf_getlineqty_shipped',
216 'pdf_getlineqty_keeptoship',
218 'pdf_getlineremisepercent',
219 'pdf_getlineprogress',
220 'pdf_getlinetotalexcltax',
221 'pdf_getlinetotalwithtax',
222 'paymentsupplierinvoices',
228 'printObjectSubLine',
233 'showLinkToObjectBlock',
234 'setContentSecurityPolicy',
238 'displayMarginInfos',
241 $hooktype =
'addreplace';
245 $this->resPrint =
'';
246 $this->resArray = array();
247 $this->resNbOfHooks = 0;
251 $modulealreadyexecuted = array();
254 foreach ($this->hooks as $context => $modules) {
255 if (!empty($modules)) {
257 foreach ($modules as $module => $actionclassinstance) {
258 $module = preg_replace(
'/^\d+:/',
'', $module);
262 if (in_array($module, $modulealreadyexecuted)) {
267 if (!method_exists($actionclassinstance, $method)) {
271 $this->resNbOfHooks++;
273 $modulealreadyexecuted[$module] = $module;
276 $actionclassinstance->error = 0;
277 $actionclassinstance->errors = array();
279 if (
getDolGlobalInt(
'MAIN_DEBUG_SHOW_EACH_QUALIFIED_HOOK_CALL') >= 2) {
281 dol_syslog(get_class($this).
"::executeHooks Qualified hook found (hooktype=".$hooktype.
"). We call method ".get_class($actionclassinstance).
'->'.$method.
", context=".$context.
", module=".$module.
", action=".$action.((is_object($object) && property_exists($object,
'id')) ?
', object id='.$object->id :
'').((is_object($object) && property_exists($object,
'element')) ?
', object element='.$object->element :
''), LOG_DEBUG);
286 $parameters[
'currentcontext'] = $context;
288 if ($hooktype ==
'addreplace') {
289 $resactiontmp = $actionclassinstance->$method($parameters, $object, $action, $this);
290 $resaction += $resactiontmp;
292 if ($resactiontmp < 0 || !empty($actionclassinstance->error) || (!empty($actionclassinstance->errors) && count($actionclassinstance->errors) > 0)) {
294 $this->error = $actionclassinstance->error;
295 $this->errors = array_merge($this->errors, (array) $actionclassinstance->errors);
296 dol_syslog(
"Error on hook module=".$module.
", method ".$method.
", class ".get_class($actionclassinstance).
", hooktype=".$hooktype.(empty($this->error) ?
'' :
" ".$this->error).(empty($this->errors) ?
'' :
" ".join(
",", $this->errors)), LOG_ERR);
299 if (isset($actionclassinstance->results) && is_array($actionclassinstance->results)) {
300 if ($resactiontmp > 0) {
301 $this->resArray = $actionclassinstance->results;
303 $this->resArray = array_merge($this->resArray, $actionclassinstance->results);
306 if (!empty($actionclassinstance->resprints)) {
307 if ($resactiontmp > 0) {
308 $this->resPrint = $actionclassinstance->resprints;
310 $this->resPrint .= $actionclassinstance->resprints;
317 if (is_array($parameters) && !empty($parameters[
'special_code']) && $parameters[
'special_code'] > 3 && $parameters[
'special_code'] != $actionclassinstance->module_number) {
322 $resactiontmp = $actionclassinstance->$method($parameters, $object, $action, $this);
323 $resaction += $resactiontmp;
325 if (!empty($actionclassinstance->results) && is_array($actionclassinstance->results)) {
326 $this->resArray = array_merge($this->resArray, $actionclassinstance->results);
328 if (!empty($actionclassinstance->resprints)) {
329 $this->resPrint .= $actionclassinstance->resprints;
331 if (is_numeric($resactiontmp) && $resactiontmp < 0) {
333 $this->error = $actionclassinstance->error;
334 $this->errors = array_merge($this->errors, (array) $actionclassinstance->errors);
335 dol_syslog(
"Error on hook module=".$module.
", method ".$method.
", class ".get_class($actionclassinstance).
", hooktype=".$hooktype.(empty($this->error) ?
'' :
" ".$this->error).(empty($this->errors) ?
'' :
" ".join(
",", $this->errors)), LOG_ERR);
339 if (!is_array($resactiontmp) && !is_numeric($resactiontmp)) {
340 dol_syslog(
'Error: Bug into hook '.$method.
' of module class '.get_class($actionclassinstance).
'. Method must not return a string but an int (0=OK, 1=Replace, -1=KO) and set string into ->resprints', LOG_ERR);
341 if (empty($actionclassinstance->resprints)) {
342 $this->resPrint .= $resactiontmp;
349 unset($actionclassinstance->results);
350 unset($actionclassinstance->resprints);
355 return ($error ? -1 : $resaction);
initHooks($arraycontext)
Init array $this->hooks with instantiated action controlers.
executeHooks($method, $parameters=array(), &$object='', &$action='')
Execute hooks (if they were initialized) for the given method.
__construct($db)
Constructor.
if(!function_exists('dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
$conf db
API class for accounts.