47 'friends_collections',
64 'uservalidationbyemail',
145 $this->
cache = $cache;
164 $path = $this->config->plugins_path;
181 unset($this->boot_plugins);
186 $this->boot_plugins = [];
188 if ($order_plugins) {
202 $plugin->registerLanguages();
214 $this->
cache->clear();
223 $this->
cache->invalidate();
243 $handle = opendir($dir);
244 if ($handle ===
false) {
249 while (($plugin_dir = readdir($handle)) !==
false) {
251 if (
substr($plugin_dir, 0, 1) !==
'.' && is_dir($dir . $plugin_dir)) {
252 $plugin_dirs[] = $plugin_dir;
274 $old_ia = $this->session->setIgnoreAccess(
true);
277 $old_access = $this->session->setDisabledEntityVisibility(
true);
279 $known_plugins = $this->
find(
'all');
280 if (empty($known_plugins)) {
289 $latest_priority = -1;
290 foreach ($known_plugins as $i =>
$plugin) {
295 unset($known_plugins[$i]);
298 $id_map[
$plugin->getID()] = $i;
306 $current_priority =
$plugin->getPriority();
307 if (($current_priority - $latest_priority) > 1) {
311 $latest_priority = $current_priority;
315 if (empty($physical_plugins)) {
316 $this->session->setIgnoreAccess($old_ia);
317 $this->session->setDisabledEntityVisibility($old_access);
325 if (array_key_exists($plugin_id, $id_map)) {
340 unset($known_plugins[
$index]);
352 foreach ($known_plugins as
$plugin) {
353 if (!$plugin->isEnabled()) {
359 if ($plugin->isActive()) {
361 $plugin->deactivate();
377 $this->session->setIgnoreAccess($old_ia);
378 $this->session->setDisabledEntityVisibility($old_access);
391 if (!$plugin->
getID()) {
429 'subtype' =>
'plugin',
430 'metadata_name_value_pairs' => [
478 $qb->select(
'MAX(CAST(ps.value AS unsigned)) as max')
479 ->join(
'e',
'private_settings',
'ps',
'e.guid = ps.entity_guid')
500 if (isset($this->boot_plugins) && is_array($this->boot_plugins)) {
501 return array_key_exists($plugin_id, $this->boot_plugins);
523 $plugins_path = $this->
getPath();
526 if (file_exists(
"$plugins_path/disabled")) {
527 if ($this->session->isAdminLoggedIn() && $this->context->contains(
'admin')) {
528 $this->system_messages->addSuccessMessage($this->translator->translate(
'plugins:disabled'));
534 $this->events->registerHandler(
'plugins_load',
'system', [$this,
'register']);
535 $this->events->registerHandler(
'plugins_boot:before',
'system', [$this,
'boot']);
536 $this->events->registerHandler(
'init',
'system', [$this,
'init']);
537 $this->events->registerHandler(
'ready',
'system', [$this,
'ready']);
538 $this->events->registerHandler(
'upgrade',
'system', [$this,
'upgrade']);
539 $this->events->registerHandler(
'shutdown',
'system', [$this,
'shutdown']);
551 public function register() {
637 $plugin->getBootstrap()->ready();
662 $plugin->getBootstrap()->upgrade();
687 $plugin->getBootstrap()->shutdown();
705 $this->
getLogger()->log(LogLevel::ERROR, $previous, [
711 $disable_plugins = $this->config->auto_disable_plugins;
712 if ($disable_plugins === null) {
713 $disable_plugins =
true;
716 if (!$disable_plugins) {
724 $msg = $this->translator->translate(
725 'PluginException:CannotStart',
726 [
$id, $plugin->guid, $previous->getMessage()]
731 $this->
getLogger()->log(LogLevel::ERROR, $ex, [
746 public function find(
string $status =
'active'): array {
747 if (!$this->db || !$this->config->installed) {
751 if ($status ===
'active' && isset($this->boot_plugins)) {
753 return array_values($this->boot_plugins);
756 $volatile_data_name = null;
762 'subtype' =>
'plugin',
767 'preload_private_settings' =>
true,
772 $options[
'relationship'] =
'active_plugin';
773 $options[
'relationship_guid'] = $site_guid;
774 $options[
'inverse_relationship'] =
true;
777 $volatile_data_name =
'select:value';
779 $options[
'private_setting_names'] = [
786 $subquery = $qb->
subquery(
'entity_relationships',
'active_er');
787 $subquery->select(
'active_er.guid_one')
791 return $qb->
compare(
"{$main_alias}.guid",
'NOT IN', $subquery->getSQL());
800 $old_ia = $this->session->setIgnoreAccess(
true);
802 $this->session->setIgnoreAccess($old_ia);
806 if ($status ===
'active' && !isset($this->boot_plugins)) {
824 $sorted_plugins = [];
828 if (!empty($volatile_data_name)) {
829 $priority = $plugin->getVolatileData($volatile_data_name);
836 $priorities[$plugin->guid] = (int)
$priority;
837 $sorted_plugins[$plugin->guid] =
$plugin;
842 return array_values(array_replace($priorities, $sorted_plugins));
867 $order = array_values($order);
870 $missing_plugins = [];
874 if (!$plugin->isEnabled()) {
876 if ($plugin->getPriority() !== null) {
878 $plugin->removePrivateSetting(
$name);
898 if (empty($missing_plugins)) {
902 foreach ($missing_plugins as $plugin) {
939 if (!$plugin->guid) {
948 $qb->set(
'value',
"CAST(value AS UNSIGNED) - 1");
951 $qb->set(
'value',
"CAST(value AS UNSIGNED) + 1");
955 if (!$this->db->updateData(
$qb)) {
isActive(string $plugin_id)
Returns if a plugin is active for a current site.
trait Profilable
Make an object accept a timer.
static project()
Get the project root (where composer is installed) path with "/".
getID()
Returns the ID (dir name) of this plugin.
reindexPriorities()
Reindexes all plugin priorities starting at 1.
if(!$user||!$user->canDelete()) $name
Base exception of invalid argument exceptions in the Elgg system.
getMaxPriority()
Returns the highest priority of the plugins.
static table($table, $alias=null)
{}
setPrivateSetting($name, $value)
Adds a private setting to this entity.
build()
Registers lifecycle hooks for all active plugins sorted by their priority.
const ELGG_VALUE_INTEGER
Value types.
if(elgg_trigger_plugin_hook('usersettings:save', 'user', $hooks_params, true)) foreach($request->validation() ->all() as $item) $data
Database abstraction query builder.
invalidate()
Invalidate plugin cache.
getDirsInDir($dir=null)
Returns a list of plugin directory names from a base directory.
disable(\ElggPlugin $plugin,\Exception $previous)
Disable a plugin upon exception.
$plugin_id
Remove all user and plugin settings from the give plugin ID.
elgg_invalidate_caches()
Invalidate all the registered caches.
trait Loggable
Enables adding a logger.
exists(string $id)
Returns if a plugin exists in the system.
orderPluginsByPriority($plugins=[], $volatile_data_name=null)
Sorts plugins by priority.
elgg_get_entities(array $options=[])
Fetches/counts entities or performs a calculation on their properties.
ready()
Run plugin ready handlers.
init()
Initialize plugins.
In memory cache of known private settings values stored by entity.
generateEntities()
Discovers plugins in the plugins_path setting and creates entities for them if they don't exist...
setBootPlugins($plugins, $order_plugins=true)
Set the list of active plugins according to the boot data cache.
__construct(\ElggCache $cache, Database $db,\ElggSession $session, EventsService $events, Translator $translator, ViewsService $views, PrivateSettingsCache $private_settings_cache, Config $config, SystemMessagesService $system_messages, Request $request)
Constructor.
compare($x, $comparison, $y=null, $type=null, $case_sensitive=null)
Build value comparison clause.
upgrade()
Run plugin upgrade handlers.
check_entity_relationship($guid_one, $relationship, $guid_two)
Check if a relationship exists between two entities.
clear()
Clear plugin caches.
invalidateCache($plugin_id)
Remove plugin from cache.
const PRIORITY_SETTING_NAME
subquery($table, $alias=null)
Creates a new SelectQueryBuilder for join/where subqueries using the DB connection of the primary Que...
static fromTable($table, $alias=null)
{}
getLogger()
Returns logger.
deactivate()
Deactivates the plugin.
getContextStack()
Returns context stack.
beginTimer(array $keys)
Start the timer (when enabled)
getPath()
Get the plugin path for this installation, ending with slash.
getPriority()
Gets the plugin's load priority.
setPriorities(array $order)
Reorder plugins to an order specified by the array.
elgg_add_admin_notice(string $id, string $message)
Write a persistent message to the admin view.
shutdown()
Run plugin shutdown handlers.
Persistent, installation-wide key-value storage.
cache(\ElggPlugin $plugin)
Cache a reference to this plugin by its ID.
find(string $status= 'active')
Returns an ordered list of plugins.
$id
Generic annotation delete action.
static fromId($plugin_id, $path=null)
Load a plugin object from its ID Create a new plugin entity if doesn't exist.
trait Cacheable
Utility trait for injecting cache.
endTimer(array $keys)
Ends the timer (when enabled)
setPriority(\ElggPlugin $plugin, $priority)
Set plugin priority and adjust the priorities of other plugins.