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;
35 protected array $registrations = [];
37 protected array $backups = [];
63 self::OPTION_STOPPABLE =>
true,
67 if ($this->
hasTimer() && $type ===
'system' && $name !==
'shutdown') {
68 $options[self::OPTION_USE_TIMER] =
true;
69 $options[self::OPTION_TIMER_KEYS] = [
"[{$name},{$type}]"];
73 $handlers = $this->getOrderedHandlers($name, $type);
90 list($success, $return, $event) = $this->callHandler($handler, $event, $event_args,
$options);
96 if (!empty(
$options[self::OPTION_STOPPABLE]) && ($return ===
false)) {
123 foreach ($this->getOrderedHandlers($name, $type) as
$handler) {
126 list($success, $return, $event) = $this->callHandler($handler, $event, $event_args,
$options);
132 if ($return !== null) {
134 $event->setValue($value);
183 $options[self::OPTION_STOPPABLE] =
false;
204 $options[
'_elgg_sequence_id'] = uniqid(
"{$name}{$type}",
true);
242 $unique_id = uniqid(
"{$name}{$type}results",
true);
243 $options[
'_elgg_sequence_id'] = $unique_id;
244 $params[
'_elgg_sequence_id'] = $unique_id;
281 $message =
"The '{$name}', '{$type}' event is deprecated. {$message}";
303 $message =
"The '{$name}', '{$type}' event is deprecated. {$message}";
306 return $this->triggerResults($name, $type,
$params, $returnvalue,
$options);
323 if (empty($name) || empty($type) || !is_callable($callback,
true)) {
327 if (in_array($this->
getLogger()->getLevel(
false), [LogLevel::WARNING, LogLevel::NOTICE, LogLevel::INFO, LogLevel::DEBUG])) {
328 if (!$this->handlers->isCallable($callback)) {
329 $this->
getLogger()->warning(
'Handler: ' . $this->handlers->describeCallable($callback) .
' is not callable');
335 self::REG_KEY_INDEX => $this->next_index,
336 self::REG_KEY_HANDLER => $callback,
354 if (empty($this->registrations[$name][$type])) {
358 $matcher = $this->getMatcher($callback);
360 foreach ($this->registrations[$name][$type] as $i => $registration) {
362 if (!$matcher->matches($registration[self::REG_KEY_HANDLER])) {
365 }
elseif ($registration[self::REG_KEY_HANDLER] != $callback) {
369 unset($this->registrations[$name][$type][$i]);
383 unset($this->registrations[$name][$type]);
402 foreach ($this->registrations as
$name => $types) {
403 foreach ($types as
$type => $registrations) {
404 foreach ($registrations as $registration) {
405 $priority = $registration[self::REG_KEY_PRIORITY];
425 return !empty($this->registrations[$name][$type]);
439 if (!empty($this->registrations[$name][$type])) {
440 if ($name !==
'all' && $type !==
'all') {
441 array_splice($registrations,
count($registrations), 0, $this->registrations[$name][$type]);
445 if (!empty($this->registrations[
'all'][$type])) {
446 if ($type !==
'all') {
447 array_splice($registrations,
count($registrations), 0, $this->registrations[
'all'][$type]);
451 if (!empty($this->registrations[$name][
'all'])) {
452 if ($name !==
'all') {
453 array_splice($registrations,
count($registrations), 0, $this->registrations[$name][
'all']);
457 if (!empty($this->registrations[
'all'][
'all'])) {
458 array_splice($registrations,
count($registrations), 0, $this->registrations[
'all'][
'all']);
461 usort($registrations,
function ($a, $b) {
463 if ($a[self::REG_KEY_PRIORITY] < $b[self::REG_KEY_PRIORITY]) {
467 if ($a[self::REG_KEY_PRIORITY] > $b[self::REG_KEY_PRIORITY]) {
472 return ($a[self::REG_KEY_INDEX] < $b[self::REG_KEY_INDEX]) ? -1 : 1;
476 foreach ($registrations as $registration) {
477 $handlers[] = $registration[self::REG_KEY_HANDLER];
491 if (is_string($spec) && str_contains($spec,
'::')) {
492 list (
$type, $method) = explode(
'::', $spec, 2);
496 if (!is_array($spec) || empty($spec[0]) || empty($spec[1]) || !is_string($spec[1])) {
500 if (is_object($spec[0])) {
501 $spec[0] = get_class($spec[0]);
504 if (!is_string($spec[0])) {
521 $this->backups[] = $this->registrations;
522 $this->registrations = [];
531 $backup = array_pop($this->backups);
532 if (is_array($backup)) {
533 $this->registrations = $backup;
548 $message =
trim($message);
549 if (empty($message)) {
553 if (!$this->hasHandler($name, $type)) {
571 if (is_callable($begin_callback)) {
572 call_user_func($begin_callback, [
573 'callable' => $callable,
574 'readable_callable' => $this->handlers->describeCallable($callable),
576 'arguments' =>
$args,
584 $timer_keys[] = $this->handlers->describeCallable($callable);
589 $results = $this->handlers->call($callable, $event, $args);
598 if (is_callable($end_callback)) {
599 call_user_func($end_callback, [
600 'callable' => $callable,
601 'readable_callable' => $this->handlers->describeCallable($callable),
603 '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.