/** * Discovers plugins in the plugins_path setting and creates ElggPlugin * entities for them if they don't exist. If there are plugins with entities * but not actual files, will disable the ElggPlugin entities and mark as inactive. * The ElggPlugin object holds config data, so don't delete. * * @todo Crappy name? * @return bool * @since 1.8.0 * @access private */ function elgg_generate_plugin_entities() { // @todo $site unused, can remove? $site = get_config('site'); $dir = elgg_get_plugins_path(); $db_prefix = elgg_get_config('dbprefix'); $options = array('type' => 'object', 'subtype' => 'plugin', 'selects' => array('plugin_oe.*'), 'joins' => array("JOIN {$db_prefix}objects_entity plugin_oe on plugin_oe.guid = e.guid"), 'limit' => ELGG_ENTITIES_NO_VALUE); $old_ia = elgg_set_ignore_access(true); $old_access = access_get_show_hidden_status(); access_show_hidden_entities(true); $known_plugins = elgg_get_entities_from_relationship($options); /* @var ElggPlugin[] $known_plugins */ if (!$known_plugins) { $known_plugins = array(); } // map paths to indexes $id_map = array(); foreach ($known_plugins as $i => $plugin) { // if the ID is wrong, delete the plugin because we can never load it. $id = $plugin->getID(); if (!$id) { $plugin->delete(); unset($known_plugins[$i]); continue; } $id_map[$plugin->getID()] = $i; } $physical_plugins = elgg_get_plugin_ids_in_dir($dir); if (!$physical_plugins) { return false; } // check real plugins against known ones foreach ($physical_plugins as $plugin_id) { // is this already in the db? if (array_key_exists($plugin_id, $id_map)) { $index = $id_map[$plugin_id]; $plugin = $known_plugins[$index]; // was this plugin deleted and its entity disabled? if (!$plugin->isEnabled()) { $plugin->enable(); $plugin->deactivate(); $plugin->setPriority('last'); } // remove from the list of plugins to disable unset($known_plugins[$index]); } else { // add new plugins // priority is force to last in save() if not set. $plugin = new ElggPlugin($plugin_id); $plugin->save(); } } // everything remaining in $known_plugins needs to be disabled // because they are entities, but their dirs were removed. // don't delete the entities because they hold settings. foreach ($known_plugins as $plugin) { if ($plugin->isActive()) { $plugin->deactivate(); } // remove the priority. $name = elgg_namespace_plugin_private_setting('internal', 'priority'); remove_private_setting($plugin->guid, $name); $plugin->disable(); } access_show_hidden_entities($old_access); elgg_set_ignore_access($old_ia); elgg_reindex_plugin_priorities(); return true; }
} } } // invalidate caches elgg_invalidate_simplecache(); elgg_filepath_cache_reset(); // clean up. remove_metadata($site->guid, 'pluginorder'); remove_metadata($site->guid, 'enabled_plugins'); // do subsite plugin upgrade $site_options = array("type" => "site", "subtype" => "subsite", "limit" => false, "site_guids" => false); if ($subsites = elgg_get_entities($site_options)) { set_time_limit(0); $old_site_guid = elgg_get_config("site_guid"); $dir = elgg_get_plugins_path(); $physical_plugins = elgg_get_plugin_ids_in_dir($dir); $hidden = access_get_show_hidden_status(); access_show_hidden_entities(true); $plugin_options = array('type' => 'object', 'subtype' => 'plugin', 'limit' => false); $enabled_plugin_options = array("metadata_name" => "enabled_plugins", "site_guids" => false, "limit" => false); $subsites_done = 0; foreach ($subsites as $subsite) { if (!datalist_get("plugins_done_" . $subsite->getGUID())) { elgg_set_config("site", $subsite); elgg_set_config("site_guid", $subsite->getGUID()); // get known plugins $plugin_options["site_guids"] = array($subsite->getGUID()); $known_plugins = elgg_get_entities($plugin_options); if (!$known_plugins) { $known_plugins = array(); }