17 use Elgg\Traits\Loggable;
44 'friends_collections',
62 'uservalidationbyemail',
99 $this->context =
$request->getContextStack();
108 return $this->config->plugins_path;
119 public function setBootPlugins(?array $plugins =
null,
bool $order_plugins =
true): void {
120 $this->cache->clear();
121 if (!is_array($plugins)) {
122 unset($this->boot_plugins);
127 $this->boot_plugins = [];
129 if ($order_plugins) {
130 $plugins = $this->orderPluginsByPriority($plugins);
133 foreach ($plugins as
$plugin) {
165 $dir = $this->getPath();
172 $handle = opendir($dir);
173 if ($handle ===
false) {
178 while (($plugin_dir = readdir($handle)) !==
false) {
180 if (!str_starts_with($plugin_dir,
'.') && is_dir($dir . $plugin_dir)) {
181 $plugin_dirs[] = $plugin_dir;
202 $mod_dir = $this->getPath();
204 $known_plugins = $this->find(
'all');
211 $latest_priority = 0;
212 foreach ($known_plugins as $i =>
$plugin) {
217 unset($known_plugins[$i]);
221 $id_map[
$plugin->getID()] = $i;
228 $current_priority =
$plugin->getPriority();
229 if (($current_priority - $latest_priority) > 1) {
233 $latest_priority = $current_priority;
236 $physical_plugins = $this->getDirsInDir($mod_dir);
237 if (empty($physical_plugins)) {
260 unset($known_plugins[
$index]);
271 foreach ($known_plugins as
$plugin) {
293 $this->reindexPriorities();
319 'subtype' =>
'plugin',
320 'metadata_name_value_pairs' => [
328 if (empty($plugins)) {
346 $qb->select(
'MAX(CAST(md.value AS unsigned)) as max')
347 ->join(
$qb->getTableAlias(), MetadataTable::TABLE_NAME,
'md',
"{$qb->getTableAlias()}.guid = md.entity_guid")
357 return max(1, (
int)
$data->max);
368 if (isset($this->boot_plugins) && is_array($this->boot_plugins)) {
369 return array_key_exists(
$plugin_id, $this->boot_plugins);
377 return $plugin->hasRelationship(1,
'active_plugin');
390 $plugins_path = $this->getPath();
393 if (file_exists(
"{$plugins_path}/disabled")) {
394 if ($this->session_manager->isAdminLoggedIn() && $this->context->contains(
'admin')) {
395 $this->system_messages->addSuccessMessage($this->translator->translate(
'plugins:disabled'));
401 $this->events->registerHandler(
'plugins_load',
'system', [$this,
'register']);
402 $this->events->registerHandler(
'plugins_boot:before',
'system', [$this,
'boot']);
403 $this->events->registerHandler(
'init',
'system', [$this,
'init']);
404 $this->events->registerHandler(
'ready',
'system', [$this,
'ready']);
405 $this->events->registerHandler(
'upgrade',
'system', [$this,
'upgrade']);
406 $this->events->registerHandler(
'shutdown',
'system', [$this,
'shutdown']);
417 public function register():
void {
418 $plugins = $this->find(
'active');
419 if (empty($plugins)) {
425 foreach ($plugins as
$plugin) {
428 }
catch (\Exception $ex) {
442 $plugins = $this->find(
'active');
443 if (empty($plugins)) {
449 foreach ($plugins as
$plugin) {
452 }
catch (\Exception $ex) {
466 $plugins = $this->find(
'active');
467 if (empty($plugins)) {
473 foreach ($plugins as
$plugin) {
476 }
catch (\Exception $ex) {
490 $plugins = $this->find(
'active');
491 if (empty($plugins)) {
497 foreach ($plugins as
$plugin) {
499 $plugin->getBootstrap()->ready();
500 }
catch (\Exception $ex) {
514 $plugins = $this->find(
'active');
515 if (empty($plugins)) {
521 foreach ($plugins as
$plugin) {
523 $plugin->getBootstrap()->upgrade();
524 }
catch (\Exception $ex) {
538 $plugins = $this->find(
'active');
539 if (empty($plugins)) {
545 foreach ($plugins as
$plugin) {
547 $plugin->getBootstrap()->shutdown();
548 }
catch (\Exception $ex) {
565 $this->getLogger()->log(LogLevel::ERROR, $previous, [
571 if (!$this->config->auto_disable_plugins) {
579 $msg = $this->translator->translate(
580 'PluginException:CannotStart',
585 }
catch (PluginException $ex) {
586 $this->getLogger()->log(LogLevel::ERROR, $ex, [
601 public function find(
string $status =
'active'): array {
602 if (!$this->db || !$this->config->installed) {
606 if ($status ===
'active' && isset($this->boot_plugins)) {
608 return array_values($this->boot_plugins);
611 $volatile_data_name =
null;
617 'subtype' =>
'plugin',
624 $options[
'relationship'] =
'active_plugin';
625 $options[
'relationship_guid'] = $site_guid;
626 $options[
'inverse_relationship'] =
true;
629 $volatile_data_name =
'select:value';
630 $options[
'select'] = [MetadataTable::DEFAULT_JOIN_ALIAS .
'.value'];
638 $subquery =
$qb->subquery(
'entity_relationships',
'active_er');
639 $subquery->select(
'active_er.guid_one')
643 return $qb->compare(
"{$main_alias}.guid",
'NOT IN', $subquery->getSQL());
656 $result = $this->orderPluginsByPriority($plugins, $volatile_data_name);
658 if ($status ===
'active' && !isset($this->boot_plugins)) {
660 $this->setBootPlugins(
$result,
false);
663 foreach ($plugins as
$plugin) {
681 $sorted_plugins = [];
683 foreach ($plugins as
$plugin) {
685 if (!empty($volatile_data_name)) {
699 return array_values(array_replace($priorities, $sorted_plugins));
717 $plugins = $this->find(
'all');
718 if (empty($plugins)) {
724 $order = array_values($order);
727 $missing_plugins = [];
730 foreach ($plugins as
$plugin) {
733 if (
$plugin->getPriority() !==
null) {
756 if (empty($missing_plugins)) {
760 foreach ($missing_plugins as
$plugin) {
776 return $this->setPriorities([]);
788 $old_priority =
$plugin->getPriority() ?: 1;
800 $qb = Update::table(MetadataTable::TABLE_NAME);
805 $qb->set(
'value',
'CAST(value AS UNSIGNED) - 1');
808 $qb->set(
'value',
'CAST(value AS UNSIGNED) + 1');
812 if (!$this->db->updateData(
$qb)) {
if(! $user||! $user->canDelete()) $name
$id
Generic annotation delete action.
$plugin_id
Remove all user and plugin settings from the give plugin ID.
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'=>[],]
if(! $entity instanceof \ElggUser) $data
Plugin class containing helper functions for plugin activation/deactivation, dependency checking capa...
const PRIORITY_SETTING_NAME
static fromId(string $plugin_id, ?string $path=null)
Load a plugin object from its ID Create a new plugin entity if it doesn't exist.
Manages a global stack of strings for sharing information about the current execution context.
Entity table database service.
Persistent, installation-wide key-value storage.
disable(\ElggPlugin $plugin, \Exception $previous)
Disable a plugin upon exception.
find(string $status='active')
Returns an ordered list of plugins.
reindexPriorities()
Reindexes all plugin priorities starting at 1.
shutdown()
Run plugin shutdown handlers.
ready()
Run plugin ready handlers.
setPriorities(array $order)
Reorder plugins to an order specified by the array.
getMaxPriority()
Returns the highest priority of the plugins.
build()
Registers lifecycle events for all active plugins sorted by their priority.
getDirsInDir(?string $dir=null)
Returns a list of plugin directory names from a base directory.
setPriority(\ElggPlugin $plugin, int $priority)
Set plugin priority and adjust the priorities of other plugins.
init()
Initialize plugins.
__construct(protected PluginsCache $cache, protected Database $db, protected SessionManagerService $session_manager, protected EventsService $events, protected Translator $translator, protected ViewsService $views, protected Config $config, protected SystemMessagesService $system_messages, protected Invoker $invoker, Request $request)
Constructor.
generateEntities()
Discovers plugins in the plugins_path setting and creates \ElggPlugin entities for them if they don't...
orderPluginsByPriority(array $plugins=[], ?string $volatile_data_name=null)
Sorts plugins by priority.
isActive(string $plugin_id)
Returns if a plugin is active for a current site.
setBootPlugins(?array $plugins=null, bool $order_plugins=true)
Set the list of active plugins according to the boot data cache.
getPath()
Get the plugin path for this installation, ending with slash.
upgrade()
Run plugin upgrade handlers.
Database abstraction query builder.
Query builder for fetching data from the database.
const ELGG_IGNORE_ACCESS
elgg_call() flags
const ELGG_SHOW_DISABLED_ENTITIES
const ELGG_VALUE_INTEGER
Value types.
if($who_can_change_language==='nobody') elseif($who_can_change_language==='admin_only' &&!elgg_is_admin_logged_in()) $options
$config
Advanced site settings, debugging section.
foreach($recommendedExtensions as $extension) if(empty(ini_get('session.gc_probability'))||empty(ini_get('session.gc_divisor'))) $db
elgg_add_admin_notice(string $id, string $message)
Write a persistent message to the admin view.
elgg_get_entities(array $options=[])
Fetches/counts entities or performs a calculation on their properties.
endTimer(array $keys)
Ends the timer (when enabled)
trait Profilable
Make an object accept a timer.
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.