Bitrix-D7  20.0.0
Класс EventManager

Открытые члены

 addEventHandler ($fromModuleId, $eventType, $callback, $includeFile=false, $sort=100)
 
 addEventHandlerCompatible ($fromModuleId, $eventType, $callback, $includeFile=false, $sort=100)
 
 removeEventHandler ($fromModuleId, $eventType, $iEventHandlerKey)
 
 unRegisterEventHandler ($fromModuleId, $eventType, $toModuleId, $toClass="", $toMethod="", $toPath="", $toMethodArg=array())
 
 registerEventHandler ($fromModuleId, $eventType, $toModuleId, $toClass="", $toMethod="", $sort=100, $toPath="", $toMethodArg=array())
 
 registerEventHandlerCompatible ($fromModuleId, $eventType, $toModuleId, $toClass="", $toMethod="", $sort=100, $toPath="", $toMethodArg=array())
 
 findEventHandlers ($eventModuleId, $eventType, array $filter=null)
 
 send (Event $event)
 

Открытые статические члены

static getInstance ()
 

Защищенные члены

 __construct ()
 
 addEventHandlerInternal ($fromModuleId, $eventType, $callback, $includeFile, $sort, $version)
 
 registerEventHandlerInternal ($fromModuleId, $eventType, $toModuleId, $toClass, $toMethod, $sort, $toPath, $toMethodArg, $version)
 
 formatEventName ($arEvent)
 
 loadEventHandlers ()
 
 clearLoadedHandlers ()
 
 sendToEventHandler (array $handler, Event $event)
 

Защищенные данные

 $handlers = array()
 
 $isHandlersLoaded = false
 

Статические защищенные данные

static $instance
 
static $cacheKey = "b_module_to_module"
 

Подробное описание

См. определение в файле main/lib/eventmanager.php строка 14

Конструктор(ы)

◆ __construct()

__construct ( )
protected

См. определение в файле main/lib/eventmanager.php строка 26

27  {
28  }

Методы

◆ addEventHandler()

addEventHandler (   $fromModuleId,
  $eventType,
  $callback,
  $includeFile = false,
  $sort = 100 
)

См. определение в файле main/lib/eventmanager.php строка 93

94  {
95  return $this->addEventHandlerInternal($fromModuleId, $eventType, $callback, $includeFile, $sort, 2);
96  }

◆ addEventHandlerCompatible()

addEventHandlerCompatible (   $fromModuleId,
  $eventType,
  $callback,
  $includeFile = false,
  $sort = 100 
)
Аргументы
$fromModuleId
$eventType
$callback
bool$includeFile
int$sort
Возвращает
int

См. определение в файле main/lib/eventmanager.php строка 106

107  {
108  return $this->addEventHandlerInternal($fromModuleId, $eventType, $callback, $includeFile, $sort, 1);
109  }

◆ addEventHandlerInternal()

addEventHandlerInternal (   $fromModuleId,
  $eventType,
  $callback,
  $includeFile,
  $sort,
  $version 
)
protected

См. определение в файле main/lib/eventmanager.php строка 45

46  {
47  $arEvent = array(
48  "FROM_MODULE_ID" => $fromModuleId,
49  "MESSAGE_ID" => $eventType,
50  "CALLBACK" => $callback,
51  "SORT" => $sort,
52  "FULL_PATH" => $includeFile,
53  "VERSION" => $version,
54  "TO_NAME" => $this->formatEventName(array("CALLBACK" => $callback)),
55  );
56 
57  $fromModuleId = strtoupper($fromModuleId);
58  $eventType = strtoupper($eventType);
59 
60  if (!isset($this->handlers[$fromModuleId]) || !is_array($this->handlers[$fromModuleId]))
61  {
62  $this->handlers[$fromModuleId] = array();
63  }
64 
65  $arEvents = &$this->handlers[$fromModuleId];
66 
67  if (!isset($arEvents[$eventType]) || !is_array($arEvents[$eventType]) || empty($arEvents[$eventType]))
68  {
69  $arEvents[$eventType] = array($arEvent);
70  $iEventHandlerKey = 0;
71  }
72  else
73  {
74  $newEvents = array();
75  $iEventHandlerKey = max(array_keys($arEvents[$eventType])) + 1;
76  //$iEventHandlerKey = count($arEvents[$eventType]);
77  foreach ($arEvents[$eventType] as $key => $value)
78  {
79  if ($value["SORT"] > $arEvent["SORT"])
80  {
81  $newEvents[$iEventHandlerKey] = $arEvent;
82  }
83 
84  $newEvents[$key] = $value;
85  }
86  $newEvents[$iEventHandlerKey] = $arEvent;
87  $arEvents[$eventType] = $newEvents;
88  }
89 
90  return $iEventHandlerKey;
91  }

◆ clearLoadedHandlers()

clearLoadedHandlers ( )
protected

См. определение в файле main/lib/eventmanager.php строка 308

309  {
310  $managedCache = Application::getInstance()->getManagedCache();
311  $managedCache->clean(self::$cacheKey);
312 
313  foreach($this->handlers as $module=>$types)
314  {
315  foreach($types as $type=>$events)
316  {
317  foreach($events as $i => $event)
318  {
319  if($event["FROM_DB"] == true)
320  {
321  unset($this->handlers[$module][$type][$i]);
322  }
323  }
324  }
325  }
326  $this->isHandlersLoaded = false;
327  }

◆ findEventHandlers()

findEventHandlers (   $eventModuleId,
  $eventType,
array  $filter = null 
)

См. определение в файле main/lib/eventmanager.php строка 329

330  {
331  if (!$this->isHandlersLoaded)
332  {
333  $this->loadEventHandlers();
334  }
335 
336  $eventModuleId = strtoupper($eventModuleId);
337  $eventType = strtoupper($eventType);
338 
339  if (!isset($this->handlers[$eventModuleId]) || !isset($this->handlers[$eventModuleId][$eventType]))
340  {
341  return array();
342  }
343 
344  $handlers = $this->handlers[$eventModuleId][$eventType];
345  if (!is_array($handlers))
346  {
347  return array();
348  }
349 
350  if (is_array($filter) && !empty($filter))
351  {
352  $handlersTmp = $handlers;
353  $handlers = array();
354  foreach ($handlersTmp as $handler)
355  {
356  if (in_array($handler["TO_MODULE_ID"], $filter))
357  {
358  $handlers[] = $handler;
359  }
360  }
361  }
362 
363  return $handlers;
364  }

◆ formatEventName()

formatEventName (   $arEvent)
protected

См. определение в файле main/lib/eventmanager.php строка 189

190  {
191  $strName = '';
192  if (isset($arEvent["CALLBACK"]))
193  {
194  if (is_array($arEvent["CALLBACK"]))
195  {
196  $strName .= (is_object($arEvent["CALLBACK"][0]) ? get_class($arEvent["CALLBACK"][0]) : $arEvent["CALLBACK"][0]).'::'.$arEvent["CALLBACK"][1];
197  }
198  elseif (is_callable($arEvent["CALLBACK"]))
199  {
200  $strName .= "callable";
201  }
202  else
203  {
204  $strName .= $arEvent["CALLBACK"];
205  }
206  }
207  else
208  {
209  $strName .= $arEvent["TO_CLASS"].'::'.$arEvent["TO_METHOD"];
210  }
211  if (isset($arEvent['TO_MODULE_ID']) && !empty($arEvent['TO_MODULE_ID']))
212  {
213  $strName .= ' ('.$arEvent['TO_MODULE_ID'].')';
214  }
215  return $strName;
216  }

◆ getInstance()

static getInstance ( )
static
Возвращает
EventManager

См. определение в файле main/lib/eventmanager.php строка 34

35  {
36  if (!isset(self::$instance))
37  {
38  $c = __CLASS__;
39  self::$instance = new $c;
40  }
41 
42  return self::$instance;
43  }

◆ loadEventHandlers()

loadEventHandlers ( )
protected

См. определение в файле main/lib/eventmanager.php строка 218

219  {
220  $cache = Application::getInstance()->getManagedCache();
221  if ($cache->read(3600, self::$cacheKey))
222  {
223  $arEvents = $cache->get(self::$cacheKey);
224  }
225  else
226  {
227  $arEvents = array();
228 
230  $rs = $con->query("
231  SELECT FROM_MODULE_ID, MESSAGE_ID, SORT, TO_MODULE_ID, TO_PATH,
232  TO_CLASS, TO_METHOD, TO_METHOD_ARG, VERSION
233  FROM b_module_to_module m2m
234  INNER JOIN b_module m ON (m2m.TO_MODULE_ID = m.ID)
235  ORDER BY SORT
236  ");
237  while ($ar = $rs->fetch())
238  {
239  $ar['TO_NAME'] = $this->formatEventName(
240  array(
241  "TO_MODULE_ID" => $ar["TO_MODULE_ID"],
242  "TO_CLASS" => $ar["TO_CLASS"],
243  "TO_METHOD" => $ar["TO_METHOD"]
244  )
245  );
246  $ar["~FROM_MODULE_ID"] = strtoupper($ar["FROM_MODULE_ID"]);
247  $ar["~MESSAGE_ID"] = strtoupper($ar["MESSAGE_ID"]);
248  if (strlen($ar["TO_METHOD_ARG"]) > 0)
249  {
250  $ar["TO_METHOD_ARG"] = unserialize($ar["TO_METHOD_ARG"]);
251  }
252  else
253  {
254  $ar["TO_METHOD_ARG"] = array();
255  }
256 
257  $arEvents[] = $ar;
258  }
259 
260  $cache->set(self::$cacheKey, $arEvents);
261  }
262 
263  if (!is_array($arEvents))
264  {
265  $arEvents = array();
266  }
267 
269  $hasHandlers = !empty($this->handlers);
270 
271  // compatibility with former event manager
272  foreach ($arEvents as $ar)
273  {
274  $this->handlers[$ar["~FROM_MODULE_ID"]][$ar["~MESSAGE_ID"]][] = array(
275  "SORT" => $ar["SORT"],
276  "TO_MODULE_ID" => $ar["TO_MODULE_ID"],
277  "TO_PATH" => $ar["TO_PATH"],
278  "TO_CLASS" => $ar["TO_CLASS"],
279  "TO_METHOD" => $ar["TO_METHOD"],
280  "TO_METHOD_ARG" => $ar["TO_METHOD_ARG"],
281  "VERSION" => $ar["VERSION"],
282  "TO_NAME" => $ar["TO_NAME"],
283  "FROM_DB" => true,
284  );
285  }
286 
287  if ($hasHandlers)
288  {
289  // need to re-sort because of AddEventHandler() calls (before loadEventHandlers)
290  foreach (array_keys($handlers) as $moduleId)
291  {
292  foreach (array_keys($handlers[$moduleId]) as $event)
293  {
294  Collection::sortByColumn(
295  $this->handlers[$moduleId][$event],
296  ['SORT' => SORT_ASC],
297  '',
298  null,
299  true
300  );
301  }
302  }
303  }
304 
305  $this->isHandlersLoaded = true;
306  }

◆ registerEventHandler()

registerEventHandler (   $fromModuleId,
  $eventType,
  $toModuleId,
  $toClass = "",
  $toMethod = "",
  $sort = 100,
  $toPath = "",
  $toMethodArg = array() 
)

См. определение в файле main/lib/eventmanager.php строка 150

151  {
152  $this->registerEventHandlerInternal($fromModuleId, $eventType, $toModuleId, $toClass, $toMethod, $sort, $toPath, $toMethodArg, 2);
153  }

◆ registerEventHandlerCompatible()

registerEventHandlerCompatible (   $fromModuleId,
  $eventType,
  $toModuleId,
  $toClass = "",
  $toMethod = "",
  $sort = 100,
  $toPath = "",
  $toMethodArg = array() 
)

См. определение в файле main/lib/eventmanager.php строка 155

156  {
157  $this->registerEventHandlerInternal($fromModuleId, $eventType, $toModuleId, $toClass, $toMethod, $sort, $toPath, $toMethodArg, 1);
158  }

◆ registerEventHandlerInternal()

registerEventHandlerInternal (   $fromModuleId,
  $eventType,
  $toModuleId,
  $toClass,
  $toMethod,
  $sort,
  $toPath,
  $toMethodArg,
  $version 
)
protected

См. определение в файле main/lib/eventmanager.php строка 160

161  {
162  $toMethodArg = ((!is_array($toMethodArg) || is_array($toMethodArg) && empty($toMethodArg)) ? "" : serialize($toMethodArg));
163  $sort = intval($sort);
164  $version = intval($version);
165 
166  $uniqueID = md5(strtolower($fromModuleId.'.'.$eventType.'.'.$toModuleId.'.'.$toPath.'.'.$toClass.'.'.$toMethod.'.'.$toMethodArg.'.'.$version));
167 
169  $sqlHelper = $con->getSqlHelper();
170 
171  $fromModuleId = $sqlHelper->forSql($fromModuleId);
172  $eventType = $sqlHelper->forSql($eventType);
173  $toModuleId = $sqlHelper->forSql($toModuleId);
174  $toClass = $sqlHelper->forSql($toClass);
175  $toMethod = $sqlHelper->forSql($toMethod);
176  $toPath = $sqlHelper->forSql($toPath);
177  $toMethodArg = $sqlHelper->forSql($toMethodArg);
178 
179  $con->queryExecute(
180  "INSERT IGNORE INTO b_module_to_module (SORT, FROM_MODULE_ID, MESSAGE_ID, TO_MODULE_ID, ".
181  " TO_CLASS, TO_METHOD, TO_PATH, TO_METHOD_ARG, VERSION, UNIQUE_ID) ".
182  "VALUES (".$sort.", '".$fromModuleId."', '".$eventType."', '".$toModuleId."', ".
183  " '".$toClass."', '".$toMethod."', '".$toPath."', '".$toMethodArg."', ".$version.", '".$uniqueID."')"
184  );
185 
186  $this->clearLoadedHandlers();
187  }

◆ removeEventHandler()

removeEventHandler (   $fromModuleId,
  $eventType,
  $iEventHandlerKey 
)

См. определение в файле main/lib/eventmanager.php строка 111

112  {
113  $fromModuleId = strtoupper($fromModuleId);
114  $eventType = strtoupper($eventType);
115 
116  if (is_array($this->handlers[$fromModuleId][$eventType]))
117  {
118  if (isset($this->handlers[$fromModuleId][$eventType][$iEventHandlerKey]))
119  {
120  unset($this->handlers[$fromModuleId][$eventType][$iEventHandlerKey]);
121  return true;
122  }
123  }
124 
125  return false;
126  }

◆ send()

send ( Event  $event)

См. определение в файле main/lib/eventmanager.php строка 366

367  {
368  $handlers = $this->findEventHandlers($event->getModuleId(), $event->getEventType(), $event->getFilter());
369  foreach ($handlers as $handler)
370  {
371  $this->sendToEventHandler($handler, $event);
372  }
373  }

◆ sendToEventHandler()

sendToEventHandler ( array  $handler,
Event  $event 
)
protected

См. определение в файле main/lib/eventmanager.php строка 375

376  {
377  try
378  {
379  $result = true;
380  $includeResult = true;
381 
382  $event->addDebugInfo($handler);
383 
384  if (isset($handler["TO_MODULE_ID"]) && !empty($handler["TO_MODULE_ID"]) && ($handler["TO_MODULE_ID"] != 'main'))
385  {
386  $result = Loader::includeModule($handler["TO_MODULE_ID"]);
387  }
388  elseif (isset($handler["TO_PATH"]) && !empty($handler["TO_PATH"]))
389  {
390  $path = ltrim($handler["TO_PATH"], "/");
391  if (($path = Loader::getLocal($path)) !== false)
392  {
393  $includeResult = include_once($path);
394  }
395  }
396  elseif (isset($handler["FULL_PATH"]) && !empty($handler["FULL_PATH"]) && IO\File::isFileExists($handler["FULL_PATH"]))
397  {
398  $includeResult = include_once($handler["FULL_PATH"]);
399  }
400 
401  $event->addDebugInfo($result);
402 
403  if ($result)
404  {
405  if (isset($handler["TO_METHOD_ARG"]) && is_array($handler["TO_METHOD_ARG"]) && !empty($handler["TO_METHOD_ARG"]))
406  {
407  $args = $handler["TO_METHOD_ARG"];
408  }
409  else
410  {
411  $args = array();
412  }
413 
414  if ($handler["VERSION"] > 1)
415  {
416  $args[] = $event;
417  }
418  else
419  {
420  $args = array_merge($args, array_values($event->getParameters()));
421  }
422 
423  $callback = null;
424  if (isset($handler["CALLBACK"]))
425  {
426  $callback = $handler["CALLBACK"];
427  }
428  elseif (!empty($handler["TO_CLASS"]) && !empty($handler["TO_METHOD"]) && class_exists($handler["TO_CLASS"]))
429  {
430  $callback = array($handler["TO_CLASS"], $handler["TO_METHOD"]);
431  }
432 
433  if ($callback != null)
434  {
435  $result = call_user_func_array($callback, $args);
436  }
437  else
438  {
439  $result = $includeResult;
440  }
441 
442  if (($result != null) && !($result instanceof EventResult))
443  {
444  $result = new EventResult(EventResult::UNDEFINED, $result, $handler["TO_MODULE_ID"]);
445  }
446 
447  $event->addDebugInfo($result);
448 
449  if ($result != null)
450  {
451  $event->addResult($result);
452  }
453  }
454  }
455  catch (\Exception $ex)
456  {
457  if ($event->isDebugOn())
458  {
459  $event->addException($ex);
460  }
461  else
462  {
463  throw $ex;
464  }
465  }
466  }

◆ unRegisterEventHandler()

unRegisterEventHandler (   $fromModuleId,
  $eventType,
  $toModuleId,
  $toClass = "",
  $toMethod = "",
  $toPath = "",
  $toMethodArg = array() 
)

См. определение в файле main/lib/eventmanager.php строка 128

129  {
130  $toMethodArg = ((!is_array($toMethodArg) || is_array($toMethodArg) && empty($toMethodArg)) ? "" : serialize($toMethodArg));
131 
133  $sqlHelper = $con->getSqlHelper();
134 
135  $strSql =
136  "DELETE FROM b_module_to_module ".
137  "WHERE FROM_MODULE_ID='".$sqlHelper->forSql($fromModuleId)."'".
138  " AND MESSAGE_ID='".$sqlHelper->forSql($eventType)."' ".
139  " AND TO_MODULE_ID='".$sqlHelper->forSql($toModuleId)."' ".
140  (($toClass != "") ? " AND TO_CLASS='".$sqlHelper->forSql($toClass)."' " : " AND (TO_CLASS='' OR TO_CLASS IS NULL) ").
141  (($toMethod != "") ? " AND TO_METHOD='".$sqlHelper->forSql($toMethod)."'": " AND (TO_METHOD='' OR TO_METHOD IS NULL) ").
142  (($toPath != "" && $toPath !== 1/*controller disconnect correction*/) ? " AND TO_PATH='".$sqlHelper->forSql($toPath)."'" : " AND (TO_PATH='' OR TO_PATH IS NULL) ").
143  (($toMethodArg != "") ? " AND TO_METHOD_ARG='".$sqlHelper->forSql($toMethodArg)."'" : " AND (TO_METHOD_ARG='' OR TO_METHOD_ARG IS NULL) ");
144 
145  $con->queryExecute($strSql);
146 
147  $this->clearLoadedHandlers();
148  }

Поля

◆ $cacheKey

$cacheKey = "b_module_to_module"
staticprotected

См. определение в файле main/lib/eventmanager.php строка 24

◆ $handlers

$handlers = array()
protected

См. определение в файле main/lib/eventmanager.php строка 21

◆ $instance

$instance
staticprotected

См. определение в файле main/lib/eventmanager.php строка 19

◆ $isHandlersLoaded

$isHandlersLoaded = false
protected

См. определение в файле main/lib/eventmanager.php строка 22


Объявления и описания членов класса находятся в файле:
Bitrix\Main\EventManager\formatEventName
formatEventName($arEvent)
Definition: main/lib/eventmanager.php:189
Bitrix\Main\EventManager\$instance
static $instance
Definition: main/lib/eventmanager.php:19
Bitrix\Main\EventManager\$handlers
$handlers
Definition: main/lib/eventmanager.php:21
Bitrix\Main\EventManager\clearLoadedHandlers
clearLoadedHandlers()
Definition: main/lib/eventmanager.php:308
Bitrix\Main\EventManager\registerEventHandlerInternal
registerEventHandlerInternal($fromModuleId, $eventType, $toModuleId, $toClass, $toMethod, $sort, $toPath, $toMethodArg, $version)
Definition: main/lib/eventmanager.php:160
Bitrix\Main\IO\File\isFileExists
static isFileExists($path)
Definition: main/lib/io/file.php:256
Bitrix\Main\EventManager\findEventHandlers
findEventHandlers($eventModuleId, $eventType, array $filter=null)
Definition: main/lib/eventmanager.php:329
Bitrix\Main\Application\getConnection
static getConnection($name="")
Static method returns database connection for the specified name.
Definition: main/lib/application.php:381
Bitrix\Main\EventResult\UNDEFINED
const UNDEFINED
Definition: main/lib/eventresult.php:6
Bitrix\Main\Application\getInstance
static getInstance()
Returns current instance of the Application.
Definition: main/lib/application.php:86
Bitrix\Main\IO
Definition: main/lib/io/directory.php:2
Bitrix\Main\EventManager\loadEventHandlers
loadEventHandlers()
Definition: main/lib/eventmanager.php:218
Bitrix\Main\Loader\getLocal
static getLocal($path, $root=null)
Checks if file exists in /local or /bitrix directories.
Definition: main/lib/loader.php:439
Bitrix\Main\EventManager\sendToEventHandler
sendToEventHandler(array $handler, Event $event)
Definition: main/lib/eventmanager.php:375
Bitrix\Main\Loader\includeModule
static includeModule($moduleName)
Includes module by its name.
Definition: main/lib/loader.php:70
Bitrix\Main\EventManager\addEventHandlerInternal
addEventHandlerInternal($fromModuleId, $eventType, $callback, $includeFile, $sort, $version)
Definition: main/lib/eventmanager.php:45