14 protected const CACHE_ID =
'b_module_to_module';
33 if (!isset(self::$instance))
36 self::$instance =
new $c;
39 return self::$instance;
58 'FROM_MODULE_ID' => $fromModuleId,
59 'MESSAGE_ID' => $eventType,
60 'CALLBACK' => $callback,
62 'FULL_PATH' => $includeFile,
63 'VERSION' => $version,
67 $fromModuleId = strtoupper($fromModuleId);
68 $eventType = strtoupper($eventType);
70 if (!isset($this->handlers[$fromModuleId]) || !is_array($this->handlers[$fromModuleId]))
72 $this->handlers[$fromModuleId] = [];
75 $events = &$this->handlers[$fromModuleId];
77 if (empty($events[$eventType]) || !is_array($events[$eventType]))
79 $events[$eventType] = [
$event];
85 $eventHandlerKey = max(array_keys($events[$eventType])) + 1;
87 foreach ($events[$eventType] as
$key => $value)
89 if ($value[
'SORT'] >
$event[
'SORT'])
91 $newEvents[$eventHandlerKey] =
$event;
94 $newEvents[
$key] = $value;
96 $newEvents[$eventHandlerKey] =
$event;
97 $events[$eventType] = $newEvents;
100 return $eventHandlerKey;
103 public function addEventHandler($fromModuleId, $eventType, $callback, $includeFile =
false, $sort = 100)
123 $fromModuleId = strtoupper($fromModuleId);
124 $eventType = strtoupper($eventType);
126 if (isset($this->handlers[$fromModuleId][$eventType][$iEventHandlerKey]))
128 unset($this->handlers[$fromModuleId][$eventType][$iEventHandlerKey]);
135 public function unRegisterEventHandler($fromModuleId, $eventType, $toModuleId, $toClass =
'', $toMethod =
'', $toPath =
'', $toMethodArg = [])
137 $toMethodArg = (!is_array($toMethodArg) || empty($toMethodArg) ?
'' : serialize($toMethodArg));
143 "DELETE FROM b_module_to_module " .
144 "WHERE FROM_MODULE_ID='" . $sqlHelper->forSql($fromModuleId) .
"'" .
145 " AND MESSAGE_ID='" . $sqlHelper->forSql($eventType) .
"' " .
146 " AND TO_MODULE_ID='" . $sqlHelper->forSql($toModuleId) .
"' " .
147 (($toClass !=
'') ?
" AND TO_CLASS='" . $sqlHelper->forSql($toClass) .
"' " :
" AND (TO_CLASS='' OR TO_CLASS IS NULL) ") .
148 (($toMethod !=
'') ?
" AND TO_METHOD='" . $sqlHelper->forSql($toMethod) .
"'" :
" AND (TO_METHOD='' OR TO_METHOD IS NULL) ") .
149 (($toPath !=
'' && $toPath !== 1) ?
" AND TO_PATH='" . $sqlHelper->forSql($toPath) .
"'" :
" AND (TO_PATH='' OR TO_PATH IS NULL) ") .
150 (($toMethodArg !=
'') ?
" AND TO_METHOD_ARG='" . $sqlHelper->forSql($toMethodArg) .
"'" :
" AND (TO_METHOD_ARG='' OR TO_METHOD_ARG IS NULL) ");
160 public function registerEventHandler($fromModuleId, $eventType, $toModuleId, $toClass =
'', $toMethod =
'', $sort = 100, $toPath =
'', $toMethodArg = [])
165 public function registerEventHandlerCompatible($fromModuleId, $eventType, $toModuleId, $toClass =
'', $toMethod =
'', $sort = 100, $toPath =
'', $toMethodArg = [])
172 $toMethodArg = (!is_array($toMethodArg) || empty($toMethodArg) ?
'' : serialize($toMethodArg));
173 $sort = intval($sort);
174 $version = intval($version);
176 $uniqueID = md5(mb_strtolower($fromModuleId .
'.' . $eventType .
'.' . $toModuleId .
'.' . $toPath .
'.' . $toClass .
'.' . $toMethod .
'.' . $toMethodArg .
'.' . $version));
181 $fromModuleId = $sqlHelper->forSql($fromModuleId);
182 $eventType = $sqlHelper->forSql($eventType);
183 $toModuleId = $sqlHelper->forSql($toModuleId);
184 $toClass = $sqlHelper->forSql($toClass);
185 $toMethod = $sqlHelper->forSql($toMethod);
186 $toPath = $sqlHelper->forSql($toPath);
187 $toMethodArg = $sqlHelper->forSql($toMethodArg);
189 $fields =
'(SORT, FROM_MODULE_ID, MESSAGE_ID, TO_MODULE_ID, TO_CLASS, TO_METHOD, TO_PATH, TO_METHOD_ARG, VERSION, UNIQUE_ID)';
190 $values =
"(" . $sort .
", '" . $fromModuleId .
"', '" . $eventType .
"', '" . $toModuleId .
"', " .
" '" . $toClass .
"', '" . $toMethod .
"', '" . $toPath .
"', '" . $toMethodArg .
"', " . $version .
", '" . $uniqueID .
"')";
191 $sql = $sqlHelper->getInsertIgnore(
'b_module_to_module',
$fields,
'VALUES ' . $values);
204 if (isset(
$event[
'CALLBACK']))
206 if (is_array(
$event[
'CALLBACK']))
223 if (!empty(
$event[
'TO_MODULE_ID']))
234 if ($cache->read(3600, self::CACHE_ID, self::CACHE_ID))
236 $rawEvents = $cache->get(self::CACHE_ID);
238 if (!is_array($rawEvents))
248 SELECT FROM_MODULE_ID, MESSAGE_ID, SORT, TO_MODULE_ID, TO_PATH,
249 TO_CLASS, TO_METHOD, TO_METHOD_ARG, VERSION
250 FROM b_module_to_module m2m
251 INNER JOIN b_module m ON (m2m.TO_MODULE_ID = m.ID)
255 $rawEvents =
$rs->fetchAll();
257 $cache->set(self::CACHE_ID, $rawEvents);
261 $hasHandlers = !empty($this->handlers);
263 foreach ($rawEvents as
$ar)
266 'TO_MODULE_ID' => $ar[
'TO_MODULE_ID'],
267 'TO_CLASS' =>
$ar[
'TO_CLASS'],
268 'TO_METHOD' =>
$ar[
'TO_METHOD'],
270 $ar[
'FROM_MODULE_ID'] = strtoupper(
$ar[
'FROM_MODULE_ID']);
271 $ar[
'MESSAGE_ID'] = strtoupper(
$ar[
'MESSAGE_ID']);
272 if (
$ar[
'TO_METHOD_ARG'] !=
'')
274 $ar[
'TO_METHOD_ARG'] = unserialize(
$ar[
'TO_METHOD_ARG'], [
'allowed_classes' =>
false]);
278 $ar[
'TO_METHOD_ARG'] = [];
281 $this->handlers[
$ar[
'FROM_MODULE_ID']][
$ar[
'MESSAGE_ID']][] = [
282 'SORT' => (int)
$ar[
'SORT'],
283 'TO_MODULE_ID' =>
$ar[
'TO_MODULE_ID'],
284 'TO_PATH' =>
$ar[
'TO_PATH'],
285 'TO_CLASS' =>
$ar[
'TO_CLASS'],
286 'TO_METHOD' =>
$ar[
'TO_METHOD'],
287 'TO_METHOD_ARG' =>
$ar[
'TO_METHOD_ARG'],
288 'VERSION' =>
$ar[
'VERSION'],
289 'TO_NAME' =>
$ar[
'TO_NAME'],
304 if (
$a[
'SORT'] == $b[
'SORT'])
308 return (
$a[
'SORT'] < $b[
'SORT'] ? -1 : 1);
315 $this->isHandlersLoaded =
true;
321 $managedCache->clean(self::CACHE_ID, self::CACHE_ID);
323 foreach ($this->handlers as $module => $types)
325 foreach ($types as
$type => $events)
331 unset($this->handlers[$module][
$type][
$i]);
336 $this->isHandlersLoaded =
false;
341 if (!$this->isHandlersLoaded)
346 $eventModuleId = strtoupper($eventModuleId);
347 $eventType = strtoupper($eventType);
349 if (!isset($this->handlers[$eventModuleId]) || !isset($this->handlers[$eventModuleId][$eventType]))
354 $handlers = $this->handlers[$eventModuleId][$eventType];
364 foreach ($handlersTmp as $handler)
366 if (isset($handler[
'TO_MODULE_ID']) && in_array($handler[
'TO_MODULE_ID'],
$filter))
390 $includeResult =
true;
392 $event->addDebugInfo($handler);
394 if (!empty($handler[
'TO_MODULE_ID']) && ($handler[
'TO_MODULE_ID'] !=
'main'))
398 elseif (!empty($handler[
'TO_PATH']))
400 $path = ltrim($handler[
'TO_PATH'],
'/');
403 $includeResult = include_once(
$path);
406 elseif (!empty($handler[
'FULL_PATH']) &&
IO\File::isFileExists($handler[
'FULL_PATH']))
408 $includeResult = include_once($handler[
'FULL_PATH']);
415 if (!empty($handler[
'TO_METHOD_ARG']) && is_array($handler[
'TO_METHOD_ARG']))
417 $args = $handler[
'TO_METHOD_ARG'];
424 if ($handler[
'VERSION'] > 1)
430 $args = array_merge($args, array_values(
$event->getParameters()));
434 if (isset($handler[
'CALLBACK']))
436 $callback = $handler[
'CALLBACK'];
438 elseif (!empty($handler[
'TO_CLASS']) && !empty($handler[
'TO_METHOD']) && class_exists($handler[
'TO_CLASS']))
440 $callback = [$handler[
'TO_CLASS'], $handler[
'TO_METHOD']];
443 if ($callback !=
null)
445 $result = call_user_func_array($callback, $args);
465 catch (\Exception $ex)
469 $event->addException($ex);
static getConnection($name="")
registerEventHandler($fromModuleId, $eventType, $toModuleId, $toClass='', $toMethod='', $sort=100, $toPath='', $toMethodArg=[])
addEventHandlerInternal($fromModuleId, $eventType, $callback, $includeFile, $sort, $version)
registerEventHandlerCompatible($fromModuleId, $eventType, $toModuleId, $toClass='', $toMethod='', $sort=100, $toPath='', $toMethodArg=[])
addEventHandlerCompatible($fromModuleId, $eventType, $callback, $includeFile=false, $sort=100)
removeEventHandler($fromModuleId, $eventType, $iEventHandlerKey)
sendToEventHandler(array $handler, Event $event)
addEventHandler($fromModuleId, $eventType, $callback, $includeFile=false, $sort=100)
unRegisterEventHandler($fromModuleId, $eventType, $toModuleId, $toClass='', $toMethod='', $toPath='', $toMethodArg=[])
registerEventHandlerInternal($fromModuleId, $eventType, $toModuleId, $toClass, $toMethod, $sort, $toPath, $toMethodArg, $version)
static setInstance($instance)
findEventHandlers($eventModuleId, $eventType, array $filter=null)
static includeModule($moduleName)
static getLocal($path, $root=null)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key