7 use Elgg\Traits\Loggable;
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)) {
128 list($success, $return, $event) = $this->callHandler(
$handler, $event, $event_args,
$options);
134 if ($return !==
null) {
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}";
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);
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);
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];
446 if (isset($this->ordered_handlers_cache[
$name .
$type])) {
447 return $this->ordered_handlers_cache[
$name .
$type];
450 if (!empty($this->registrations[
$name][
$type])) {
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])) {
509 return new MethodMatcher($spec[0], $spec[1]);
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);
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);
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,
if(! $user||! $user->canDelete()) $name
$params
Saves global plugin settings.
return[ 'admin/delete_admin_notices'=>['access'=> 'admin'], 'admin/menu/save'=>['access'=> 'admin'], 'admin/plugins/activate'=>['access'=> 'admin'], 'admin/plugins/activate_all'=>['access'=> 'admin'], 'admin/plugins/deactivate'=>['access'=> 'admin'], 'admin/plugins/deactivate_all'=>['access'=> 'admin'], 'admin/plugins/set_priority'=>['access'=> 'admin'], 'admin/security/security_txt'=>['access'=> 'admin'], 'admin/security/settings'=>['access'=> 'admin'], 'admin/security/regenerate_site_secret'=>['access'=> 'admin'], 'admin/site/cache/invalidate'=>['access'=> 'admin'], 'admin/site/flush_cache'=>['access'=> 'admin'], 'admin/site/icons'=>['access'=> 'admin'], 'admin/site/set_maintenance_mode'=>['access'=> 'admin'], 'admin/site/set_robots'=>['access'=> 'admin'], 'admin/site/theme'=>['access'=> 'admin'], 'admin/site/unlock_upgrade'=>['access'=> 'admin'], 'admin/site/settings'=>['access'=> 'admin'], 'admin/upgrade'=>['access'=> 'admin'], 'admin/upgrade/reset'=>['access'=> 'admin'], 'admin/user/ban'=>['access'=> 'admin'], 'admin/user/bulk/ban'=>['access'=> 'admin'], 'admin/user/bulk/delete'=>['access'=> 'admin'], 'admin/user/bulk/unban'=>['access'=> 'admin'], 'admin/user/bulk/validate'=>['access'=> 'admin'], 'admin/user/change_email'=>['access'=> 'admin'], 'admin/user/delete'=>['access'=> 'admin'], 'admin/user/login_as'=>['access'=> 'admin'], 'admin/user/logout_as'=>[], 'admin/user/makeadmin'=>['access'=> 'admin'], 'admin/user/resetpassword'=>['access'=> 'admin'], 'admin/user/removeadmin'=>['access'=> 'admin'], 'admin/user/unban'=>['access'=> 'admin'], 'admin/user/validate'=>['access'=> 'admin'], 'annotation/delete'=>[], 'avatar/upload'=>[], 'comment/save'=>[], 'diagnostics/download'=>['access'=> 'admin'], 'entity/chooserestoredestination'=>[], 'entity/delete'=>[], 'entity/mute'=>[], 'entity/restore'=>[], 'entity/subscribe'=>[], 'entity/trash'=>[], 'entity/unmute'=>[], 'entity/unsubscribe'=>[], 'login'=>['access'=> 'logged_out'], 'logout'=>[], 'notifications/mute'=>['access'=> 'public'], 'plugins/settings/remove'=>['access'=> 'admin'], 'plugins/settings/save'=>['access'=> 'admin'], 'plugins/usersettings/save'=>[], 'register'=>['access'=> 'logged_out', 'middleware'=>[\Elgg\Router\Middleware\RegistrationAllowedGatekeeper::class,],], 'river/delete'=>[], 'settings/notifications'=>[], 'settings/notifications/subscriptions'=>[], 'user/changepassword'=>['access'=> 'public'], 'user/requestnewpassword'=>['access'=> 'public'], 'useradd'=>['access'=> 'admin'], 'usersettings/save'=>[], 'widgets/add'=>[], 'widgets/delete'=>[], 'widgets/move'=>[], 'widgets/save'=>[],]
Identify a static/dynamic method callable, even if contains an object to which you don't have a refer...
unregisterHandler(string $name, string $type, $callback)
Unregister a callback as an event handler.
callHandler($callable, $event, array $args, array $options=[])
__construct(protected HandlersService $handlers)
Constructor.
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...
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...
getAllHandlers()
Returns all registered handlers as array( $name => array( $type => array( $priority => array( callbac...
triggerSequence(string $name, string $type, $object=null, ?callable $callable=null, array $options=[])
Trigger a sequence of <event>:before, <event>, and <event>:after handlers.
getMatcher($spec)
Create a matcher for the given callable (if it's for a static or dynamic method)
triggerResults(string $name, string $type, array $params=[], $value=null, array $options=[])
Triggers a event that is allowed to return a mixed result.
registerHandler(string $name, string $type, $callback, int $priority=500)
Register a callback as a event handler.
trigger(string $name, string $type, $object=null, array $options=[])
Triggers an Elgg event.
restore()
Restore backed up event registrations (after tests)
checkDeprecation(string $name, string $type, string $message, string $version)
Check if handlers are registered on a deprecated event.
triggerAfter(string $name, string $type, $object=null, array $options=[])
Trigger an "After event" indicating a process has finished.
getOrderedHandlers(string $name, string $type)
Returns an ordered array of handlers registered for $name and $type.
clearHandlers(string $name, string $type)
Clears all callback registrations for an event.
backup()
Temporarily remove all event registrations (before tests)
hasHandler(string $name, string $type)
Is a handler registered for this specific name and type? "all" handlers are not considered.
triggerResultsSequence(string $name, string $type, array $params=[], $value=null, ?callable $callable=null, array $options=[])
Trigger a sequence of <event>:before, <event>, and <event>:after handlers.
triggerBefore(string $name, string $type, $object=null, array $options=[])
Trigger a "Before event" indicating a process is about to begin.
Helpers for providing callable-based APIs.
if($who_can_change_language==='nobody') elseif($who_can_change_language==='admin_only' &&!elgg_is_admin_logged_in()) $options
if($email instanceof \Elgg\Email) $object
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.
$args
Some servers don't allow PHP to check the rewrite, so try via AJAX.
endTimer(array $keys)
Ends the timer (when enabled)
trait Profilable
Make an object accept a timer.
hasTimer()
Has a timer been set.
beginTimer(array $keys)
Start the timer (when enabled)
if(parse_url(elgg_get_site_url(), PHP_URL_PATH) !=='/') if(file_exists(elgg_get_root_path() . 'robots.txt'))
Set robots.txt.