20 const REG_KEY_PRIORITY = 0;
21 const REG_KEY_INDEX = 1;
22 const REG_KEY_HANDLER = 2;
24 const OPTION_STOPPABLE =
'stoppable';
34 protected $next_index = 0;
39 protected $registrations = [];
44 protected $backups = [];
52 $this->handlers = $handlers;
71 self::OPTION_STOPPABLE =>
true,
75 $handlers = $this->getOrderedHandlers($name, $type);
83 $handler_description =
false;
84 if ($this->
hasTimer() && $type ===
'system' && $name !==
'shutdown') {
85 $handler_description = $this->handlers->describeCallable($handler) .
'()';
86 $this->
beginTimer([
"[{$name},{$type}]", $handler_description]);
89 list($success, $return, $event) = $this->handlers->call($handler, $event, [
99 if ($handler_description) {
100 $this->
endTimer([
"[{$name},{$type}]", $handler_description]);
107 if (!empty(
$options[self::OPTION_STOPPABLE]) && ($return ===
false)) {
133 foreach ($this->getOrderedHandlers($name, $type) as
$handler) {
134 list($success, $return, $event) = $this->handlers->call($handler, $event, [$name, $type,
$value,
$params]);
140 if ($return !== null) {
191 $options[self::OPTION_STOPPABLE] =
false;
212 $options[
'_elgg_sequence_id'] = uniqid(
"{$name}{$type}",
true);
248 $unique_id = uniqid(
"{$name}{$type}results",
true);
249 $options[
'_elgg_sequence_id'] = $unique_id;
250 $params[
'_elgg_sequence_id'] = $unique_id;
284 $message =
"The '{$name}', '{$type}' event is deprecated. {$message}";
287 return $this->trigger($name, $type,
$object);
305 $message =
"The '{$name}', '{$type}' event is deprecated. {$message}";
308 return $this->triggerResults($name, $type,
$params, $returnvalue);
325 if (empty($name) || empty($type) || !is_callable($callback,
true)) {
329 if (($name ==
'view' || $name ==
'view_vars') && $type !==
'all') {
330 $type = ViewsService::canonicalizeViewName($type);
334 if (in_array($this->
getLogger()->getLevel(
false), [LogLevel::WARNING, LogLevel::NOTICE, LogLevel::INFO, LogLevel::DEBUG])) {
335 if (!$services->handlers->isCallable($callback)) {
336 $this->
getLogger()->warning(
'Handler: ' . $services->handlers->describeCallable($callback) .
' is not callable');
342 self::REG_KEY_INDEX => $this->next_index,
343 self::REG_KEY_HANDLER => $callback,
361 if (($name ===
'view' || $name ===
'view_vars') && $type !==
'all') {
362 $type = ViewsService::canonicalizeViewName($type);
365 if (empty($this->registrations[$name][$type])) {
369 $matcher = $this->getMatcher($callback);
371 foreach ($this->registrations[$name][$type] as $i => $registration) {
373 if (!$matcher->matches($registration[self::REG_KEY_HANDLER])) {
376 }
elseif ($registration[self::REG_KEY_HANDLER] != $callback) {
380 unset($this->registrations[$name][$type][$i]);
394 unset($this->registrations[$name][$type]);
413 foreach ($this->registrations as
$name => $types) {
414 foreach ($types as
$type => $registrations) {
415 foreach ($registrations as $registration) {
416 $priority = $registration[self::REG_KEY_PRIORITY];
436 return !empty($this->registrations[$name][$type]);
450 if (!empty($this->registrations[$name][$type])) {
451 if ($name !==
'all' && $type !==
'all') {
452 array_splice($registrations,
count($registrations), 0, $this->registrations[$name][$type]);
456 if (!empty($this->registrations[
'all'][$type])) {
457 if ($type !==
'all') {
458 array_splice($registrations,
count($registrations), 0, $this->registrations[
'all'][$type]);
462 if (!empty($this->registrations[$name][
'all'])) {
463 if ($name !==
'all') {
464 array_splice($registrations,
count($registrations), 0, $this->registrations[$name][
'all']);
468 if (!empty($this->registrations[
'all'][
'all'])) {
469 array_splice($registrations,
count($registrations), 0, $this->registrations[
'all'][
'all']);
472 usort($registrations,
function ($a, $b) {
474 if ($a[self::REG_KEY_PRIORITY] < $b[self::REG_KEY_PRIORITY]) {
478 if ($a[self::REG_KEY_PRIORITY] > $b[self::REG_KEY_PRIORITY]) {
483 return ($a[self::REG_KEY_INDEX] < $b[self::REG_KEY_INDEX]) ? -1 : 1;
487 foreach ($registrations as $registration) {
488 $handlers[] = $registration[self::REG_KEY_HANDLER];
502 if (is_string($spec) && str_contains($spec,
'::')) {
503 list (
$type, $method) = explode(
'::', $spec, 2);
507 if (!is_array($spec) || empty($spec[0]) || empty($spec[1]) || !is_string($spec[1])) {
511 if (is_object($spec[0])) {
512 $spec[0] = get_class($spec[0]);
515 if (!is_string($spec[0])) {
532 $this->backups[] = $this->registrations;
533 $this->registrations = [];
542 $backup = array_pop($this->backups);
543 if (is_array($backup)) {
544 $this->registrations = $backup;
559 $message =
trim($message);
560 if (empty($message)) {
564 if (!$this->hasHandler($name, $type)) {
trait Profilable
Make an object accept a timer.
$params
Saves global plugin settings.
registerHandler(string $name, string $type, $callback, int $priority=500)
Register a callback as a event handler.
Helpers for providing callable-based APIs.
hasHandler(string $name, string $type)
Is a handler registered for this specific name and type? "all" handlers are not considered.
if(!$user||!$user->canDelete()) $name
triggerAfter(string $name, string $type, $object=null, array $options=[])
Trigger an "After event" indicating a process has finished.
c Accompany it with the information you received as to the offer to distribute corresponding source complete source code means all the source code for all modules it plus any associated interface definition plus the scripts used to control compilation and installation of the executable as a special the source code distributed need not include anything that is normally and so on of the operating system on which the executable unless that component itself accompanies the executable If distribution of executable or object code is made by offering access to copy from a designated then offering equivalent access to copy the source code from the same place counts as distribution of the source even though third parties are not compelled to copy the source along with the object code You may not or distribute the Program except as expressly provided under this License Any attempt otherwise to sublicense or distribute the Program is void
getAllHandlers()
Returns all registered handlers as array( $name => array( $type => array( $priority => array( callbac...
hasTimer()
Has a timer been set.
__construct(HandlersService $handlers)
Constructor.
triggerBefore(string $name, string $type, $object=null, array $options=[])
Trigger a "Before event" indicating a process is about to begin.
if($item instanceof\ElggEntity) elseif($item instanceof\ElggRiverItem) elseif($item instanceof\ElggRelationship) elseif(is_callable([$item, 'getType']))
triggerDeprecatedResults(string $name, string $type, array $params=[], $returnvalue=null, string $message= '', string $version= '')
Trigger an event sequence normally, but send a notice about deprecated use if any handlers are regist...
elgg_extract($key, $array, $default=null, bool $strict=true)
Checks for $array[$key] and returns its value if it exists, else returns $default.
trait Loggable
Enables adding a logger.
trigger(string $name, string $type, $object=null, array $options=[])
Triggers an Elgg event.
triggerResultsSequence(string $name, string $type, array $params=[], $value=null, callable $callable=null, array $options=[])
Trigger an sequence of <event>:before, <event>, and <event>:after handlers.
triggerDeprecated(string $name, string $type, $object=null, string $message= '', string $version= '')
Trigger an event sequence normally, but send a notice about deprecated use if any handlers are regist...
getOrderedHandlers(string $name, string $type)
Returns an ordered array of handlers registered for $name and $type.
restore()
Restore backed up event registrations (after tests)
triggerSequence(string $name, string $type, $object=null, callable $callable=null, array $options=[])
Trigger an sequence of <event>:before, <event>, and <event>:after handlers.
getLogger()
Returns logger.
if($email instanceof\Elgg\Email) $object
Identify a static/dynamic method callable, even if contains an object to which you don't have a refer...
beginTimer(array $keys)
Start the timer (when enabled)
backup()
Temporarily remove all event registrations (before tests)
checkDeprecation(string $name, string $type, string $message, string $version)
Check if handlers are registered on a deprecated event.
_elgg_services()
Get the global service provider.
unregisterHandler(string $name, string $type, $callback)
Unregister a callback as an event handler.
getMatcher($spec)
Create a matcher for the given callable (if it's for a static or dynamic method)
clearHandlers(string $name, string $type)
Clears all callback registrations for an event.
triggerResults(string $name, string $type, array $params=[], $value=null)
Triggers a event that is allowed to return a mixed result.
endTimer(array $keys)
Ends the timer (when enabled)
logDeprecatedMessage(string $message, string $version)
Sends a message about deprecated use of a function, view, etc.