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;
130 if (count($arraytolog) > 0) {
131 dol_syslog(get_class($this).
"::initHooks Loading hooks: ".join(
', ', $arraytolog), LOG_DEBUG);
134 if (!empty($this->hooks[$context])) {
135 ksort($this->hooks[$context], SORT_NATURAL);
153 public function executeHooks($method, $parameters = array(), &$object =
'', &$action =
'')
155 if (!is_array($this->hooks) || empty($this->hooks)) {
159 $parameters[
'context'] = join(
':', $this->contextarray);
164 $hooktype =
'output';
170 'addMoreActionsButtons',
171 'addMoreMassActions',
176 'createDictionaryFieldlist',
177 'editDictionaryFieldlist',
184 'formCreateThirdpartyOptions',
187 'formBuilddocLineOptions',
188 'formatNotificationMessage',
190 'getAccessForbiddenMessage',
194 'getFormatedCustomerRef',
195 'getFormatedSupplierRef',
198 'menuDropdownQuickaddItems',
206 'pdf_getlineref_supplier',
207 'pdf_getlinevatrate',
208 'pdf_getlineupexcltax',
209 'pdf_getlineupwithtax',
211 'pdf_getlineqty_asked',
212 'pdf_getlineqty_shipped',
213 'pdf_getlineqty_keeptoship',
215 'pdf_getlineremisepercent',
216 'pdf_getlineprogress',
217 'pdf_getlinetotalexcltax',
218 'pdf_getlinetotalwithtax',
219 'paymentsupplierinvoices',
225 'printObjectSubLine',
230 'showLinkToObjectBlock',
231 'setContentSecurityPolicy',
235 'displayMarginInfos',
238 $hooktype =
'addreplace';
242 $this->resPrint =
'';
243 $this->resArray = array();
244 $this->resNbOfHooks = 0;
248 $modulealreadyexecuted = array();
251 foreach ($this->hooks as $context => $modules) {
252 if (!empty($modules)) {
254 foreach ($modules as $module => $actionclassinstance) {
255 $module = preg_replace(
'/^\d+:/',
'', $module);
259 if (in_array($module, $modulealreadyexecuted)) {
264 if (!method_exists($actionclassinstance, $method)) {
268 $this->resNbOfHooks++;
270 $modulealreadyexecuted[$module] = $module;
273 $actionclassinstance->error = 0;
274 $actionclassinstance->errors = array();
276 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);
280 $parameters[
'currentcontext'] = $context;
282 if ($hooktype ==
'addreplace') {
283 $resactiontmp = $actionclassinstance->$method($parameters, $object, $action, $this);
284 $resaction += $resactiontmp;
286 if ($resactiontmp < 0 || !empty($actionclassinstance->error) || (!empty($actionclassinstance->errors) && count($actionclassinstance->errors) > 0)) {
288 $this->error = $actionclassinstance->error;
289 $this->errors = array_merge($this->errors, (array) $actionclassinstance->errors);
290 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);
293 if (isset($actionclassinstance->results) && is_array($actionclassinstance->results)) {
294 if ($resactiontmp > 0) {
295 $this->resArray = $actionclassinstance->results;
297 $this->resArray = array_merge($this->resArray, $actionclassinstance->results);
300 if (!empty($actionclassinstance->resprints)) {
301 if ($resactiontmp > 0) {
302 $this->resPrint = $actionclassinstance->resprints;
304 $this->resPrint .= $actionclassinstance->resprints;
311 if (is_array($parameters) && !empty($parameters[
'special_code']) && $parameters[
'special_code'] > 3 && $parameters[
'special_code'] != $actionclassinstance->module_number) {
316 $resactiontmp = $actionclassinstance->$method($parameters, $object, $action, $this);
317 $resaction += $resactiontmp;
319 if (!empty($actionclassinstance->results) && is_array($actionclassinstance->results)) {
320 $this->resArray = array_merge($this->resArray, $actionclassinstance->results);
322 if (!empty($actionclassinstance->resprints)) {
323 $this->resPrint .= $actionclassinstance->resprints;
325 if (is_numeric($resactiontmp) && $resactiontmp < 0) {
327 $this->error = $actionclassinstance->error;
328 $this->errors = array_merge($this->errors, (array) $actionclassinstance->errors);
329 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);
333 if (!is_array($resactiontmp) && !is_numeric($resactiontmp)) {
334 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);
335 if (empty($actionclassinstance->resprints)) {
336 $this->resPrint .= $resactiontmp;
343 unset($actionclassinstance->results);
344 unset($actionclassinstance->resprints);
349 return ($error ? -1 : $resaction);