20 const REG_KEY_PRIORITY = 0;
21 const REG_KEY_INDEX = 1;
22 const REG_KEY_HANDLER = 2;
24 const OPTION_STOPPABLE =
'stoppable';
25 const OPTION_USE_TIMER =
'use_timer';
26 const OPTION_TIMER_KEYS =
'timer_keys';
27 const OPTION_BEGIN_CALLBACK =
'begin_callback';
28 const OPTION_END_CALLBACK =
'end_callback';
30 protected int $next_index = 0;
32 protected array $ordered_handlers_cache = [];
37 protected array $registrations = [];
39 protected array $backups = [];
65 self::OPTION_STOPPABLE =>
true,
69 if ($this->
hasTimer() && $type ===
'system' && $name !==
'shutdown') {
70 $options[self::OPTION_USE_TIMER] =
true;
71 $options[self::OPTION_TIMER_KEYS] = [
"[{$name},{$type}]"];
75 $handlers = $this->getOrderedHandlers($name, $type);
92 list($success, $return, $event) = $this->callHandler($handler, $event, $event_args,
$options);
98 if (!empty(
$options[self::OPTION_STOPPABLE]) && ($return ===
false)) {
125 foreach ($this->getOrderedHandlers($name, $type) as
$handler) {
128 list($success, $return, $event) = $this->callHandler($handler, $event, $event_args,
$options);
134 if ($return !== null) {
136 $event->setValue($value);
185 $options[self::OPTION_STOPPABLE] =
false;
206 $options[
'_elgg_sequence_id'] = uniqid(
"{$name}{$type}",
true);
244 $unique_id = uniqid(
"{$name}{$type}results",
true);
245 $options[
'_elgg_sequence_id'] = $unique_id;
246 $params[
'_elgg_sequence_id'] = $unique_id;
283 $message =
"The '{$name}', '{$type}' event is deprecated. {$message}";
305 $message =
"The '{$name}', '{$type}' event is deprecated. {$message}";
308 return $this->triggerResults($name, $type,
$params, $returnvalue,
$options);
325 if (empty($name) || empty($type) || !is_callable($callback,
true)) {
329 if (in_array($this->
getLogger()->getLevel(
false), [LogLevel::WARNING, LogLevel::NOTICE, LogLevel::INFO, LogLevel::DEBUG])) {
330 if (!$this->handlers->isCallable($callback)) {
331 $this->
getLogger()->warning(
'Handler: ' . $this->handlers->describeCallable($callback) .
' is not callable');
335 $this->registrations[
$name][
$type][
"{$priority}_{$this->next_index}"] = [
337 self::REG_KEY_INDEX => $this->next_index,
338 self::REG_KEY_HANDLER => $callback,
342 unset($this->ordered_handlers_cache);
358 if (empty($this->registrations[$name][$type])) {
362 $matcher = $this->getMatcher($callback);
364 foreach ($this->registrations[$name][$type] as $i => $registration) {
366 if (!$matcher->matches($registration[self::REG_KEY_HANDLER])) {
369 }
elseif ($registration[self::REG_KEY_HANDLER] != $callback) {
373 unset($this->registrations[$name][$type][$i]);
374 unset($this->ordered_handlers_cache);
389 unset($this->registrations[$name][$type]);
390 unset($this->ordered_handlers_cache);
409 foreach ($this->registrations as
$name => $types) {
410 foreach ($types as
$type => $registrations) {
411 foreach ($registrations as $registration) {
412 $priority = $registration[self::REG_KEY_PRIORITY];
432 return !empty($this->registrations[$name][$type]);
446 if (isset($this->ordered_handlers_cache[$name . $type])) {
447 return $this->ordered_handlers_cache[$name .
$type];
450 if (!empty($this->registrations[$name][$type])) {
451 if ($name !==
'all' && $type !==
'all') {
452 $registrations = $this->registrations[
$name][
$type];
456 if (!empty($this->registrations[
'all'][$type])) {
457 if ($type !==
'all') {
458 $registrations += $this->registrations[
'all'][
$type];
462 if (!empty($this->registrations[$name][
'all'])) {
463 if ($name !==
'all') {
464 $registrations += $this->registrations[
$name][
'all'];
468 if (!empty($this->registrations[
'all'][
'all'])) {
469 $registrations += $this->registrations[
'all'][
'all'];
472 ksort($registrations, SORT_NATURAL);
475 foreach ($registrations as $registration) {
476 $handlers[] = $registration[self::REG_KEY_HANDLER];
479 $this->ordered_handlers_cache[$name .
$type] = $handlers;
492 if (is_string($spec) && str_contains($spec,
'::')) {
493 list (
$type, $method) = explode(
'::', $spec, 2);
497 if (!is_array($spec) || empty($spec[0]) || empty($spec[1]) || !is_string($spec[1])) {
501 if (is_object($spec[0])) {
502 $spec[0] = get_class($spec[0]);
505 if (!is_string($spec[0])) {
522 $this->backups[] = $this->registrations;
523 $this->registrations = [];
524 unset($this->ordered_handlers_cache);
533 $backup = array_pop($this->backups);
534 if (is_array($backup)) {
535 $this->registrations = $backup;
538 unset($this->ordered_handlers_cache);
552 $message =
trim($message);
553 if (empty($message)) {
557 if (!$this->hasHandler($name, $type)) {
575 if (is_callable($begin_callback)) {
576 call_user_func($begin_callback, [
577 'callable' => $callable,
578 'readable_callable' => $this->handlers->describeCallable($callable),
580 'arguments' =>
$args,
588 $timer_keys[] = $this->handlers->describeCallable($callable);
593 $results = $this->handlers->call($callable, $event, $args);
602 if (is_callable($end_callback)) {
603 call_user_func($end_callback, [
604 'callable' => $callable,
605 'readable_callable' => $this->handlers->describeCallable($callable),
607 'arguments' =>
$args,
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...
$args
Some servers don't allow PHP to check the rewrite, so try via AJAX.
hasTimer()
Has a timer been set.
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']))
elgg_extract($key, $array, $default=null, bool $strict=true)
Checks for $array[$key] and returns its value if it exists, else returns $default.
if($who_can_change_language=== 'nobody') elseif($who_can_change_language=== 'admin_only'&&!elgg_is_admin_logged_in()) $options
trait Loggable
Enables adding a logger.
triggerDeprecated(string $name, string $type, $object=null, string $message= '', string $version= '', array $options=[])
Trigger an event sequence normally, but send a notice about deprecated use if any handlers are regist...
triggerDeprecatedResults(string $name, string $type, array $params=[], $returnvalue=null, string $message= '', string $version= '', array $options=[])
Trigger an event sequence normally, but send a notice about deprecated use if any handlers are regist...
trigger(string $name, string $type, $object=null, array $options=[])
Triggers an Elgg event.
triggerResults(string $name, string $type, array $params=[], $value=null, array $options=[])
Triggers a event that is allowed to return a mixed result.
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.
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 a sequence of <event>:before, <event>, and <event>:after handlers.
__construct(protected HandlersService $handlers)
Constructor.
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)
callHandler($callable, $event, array $args, array $options=[])
checkDeprecation(string $name, string $type, string $message, string $version)
Check if handlers are registered on a deprecated event.
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.
endTimer(array $keys)
Ends the timer (when enabled)
logDeprecatedMessage(string $message, string $version)
Sends a message about deprecated use of a function, view, etc.