diff options
| author | Sem <sembrestels@riseup.net> | 2014-01-22 03:37:52 +0100 | 
|---|---|---|
| committer | Sem <sembrestels@riseup.net> | 2014-01-22 03:37:52 +0100 | 
| commit | 4a2ed114bb18c5363f594a380676c5654f4165a4 (patch) | |
| tree | 3a37094b249c40e3e6bf122691db53115f65f8f0 /engine/lib/plugins.php | |
| parent | 673932bc46a3918293a28c2c2fc622b3e5ff6bde (diff) | |
| parent | 0dd36c458d41e77521c36ae572fe73114ad4bc5a (diff) | |
| download | elgg-4a2ed114bb18c5363f594a380676c5654f4165a4.tar.gz elgg-4a2ed114bb18c5363f594a380676c5654f4165a4.tar.bz2  | |
Merge tag '1.8.18' of git://github.com/Elgg/Elgg into develop
1.8.18
Conflicts:
	mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/en.js
	mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js
Diffstat (limited to 'engine/lib/plugins.php')
| -rw-r--r-- | engine/lib/plugins.php | 90 | 
1 files changed, 70 insertions, 20 deletions
diff --git a/engine/lib/plugins.php b/engine/lib/plugins.php index 94aff277e..d5d3db466 100644 --- a/engine/lib/plugins.php +++ b/engine/lib/plugins.php @@ -91,7 +91,9 @@ function elgg_get_plugin_ids_in_dir($dir = null) {   * @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'); @@ -107,6 +109,7 @@ function elgg_generate_plugin_entities() {  	$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(); @@ -138,7 +141,7 @@ function elgg_generate_plugin_entities() {  			$index = $id_map[$plugin_id];  			$plugin = $known_plugins[$index];  			// was this plugin deleted and its entity disabled? -			if ($plugin->enabled != 'yes') { +			if (!$plugin->isEnabled()) {  				$plugin->enable();  				$plugin->deactivate();  				$plugin->setPriority('last'); @@ -192,7 +195,7 @@ function _elgg_cache_plugin_by_id(ElggPlugin $plugin) {   * Returns an ElggPlugin object with the path $path.   *   * @param string $plugin_id The id (dir name) of the plugin. NOT the guid. - * @return mixed ElggPlugin or false. + * @return ElggPlugin|false   * @since 1.8.0   */  function elgg_get_plugin_from_id($plugin_id) { @@ -260,6 +263,8 @@ function elgg_get_max_plugin_priority() {  	$data = get_data($q);  	if ($data) {  		$max = $data[0]->max; +	} else { +		$max = 1;  	}  	// can't have a priority of 0. @@ -306,13 +311,11 @@ function elgg_is_active_plugin($plugin_id, $site_guid = null) {   * @access private   */  function elgg_load_plugins() { -	global $CONFIG; -  	$plugins_path = elgg_get_plugins_path(); -	$start_flags =	ELGG_PLUGIN_INCLUDE_START -					| ELGG_PLUGIN_REGISTER_VIEWS -					| ELGG_PLUGIN_REGISTER_LANGUAGES -					| ELGG_PLUGIN_REGISTER_CLASSES; +	$start_flags = ELGG_PLUGIN_INCLUDE_START | +					ELGG_PLUGIN_REGISTER_VIEWS | +					ELGG_PLUGIN_REGISTER_LANGUAGES | +					ELGG_PLUGIN_REGISTER_CLASSES;  	if (!$plugins_path) {  		return false; @@ -360,7 +363,7 @@ function elgg_load_plugins() {   *   * @param string $status      The status of the plugins. active, inactive, or all.   * @param mixed  $site_guid   Optional site guid - * @return array + * @return ElggPlugin[]   * @since 1.8.0   * @access private   */ @@ -441,6 +444,7 @@ function elgg_set_plugin_priorities(array $order) {  	// though we do start with 1  	$order = array_values($order); +	$missing_plugins = array();  	foreach ($plugins as $plugin) {  		$plugin_id = $plugin->getID(); @@ -639,19 +643,18 @@ function elgg_get_plugins_provides($type = null, $name = null) {   * @access private   */  function elgg_check_plugins_provides($type, $name, $version = null, $comparison = 'ge') { -	if (!$provided = elgg_get_plugins_provides($type, $name)) { +	$provided = elgg_get_plugins_provides($type, $name); +	if (!$provided) {  		return array(  			'status' => false,  			'version' => ''  		);  	} -	if ($provided) { -		if ($version) { -			$status = version_compare($provided['version'], $version, $comparison); -		} else { -			$status = true; -		} +	if ($version) { +		$status = version_compare($provided['version'], $version, $comparison); +	} else { +		$status = true;  	}  	return array( @@ -861,9 +864,9 @@ function elgg_set_plugin_user_setting($name, $value, $user_guid = null, $plugin_  /**   * Unsets a user-specific plugin setting   * - * @param str $name      Name of the setting - * @param int $user_guid Defaults to logged in user - * @param str $plugin_id Defaults to contextual plugin name + * @param string $name      Name of the setting + * @param int    $user_guid Defaults to logged in user + * @param string $plugin_id Defaults to contextual plugin name   *   * @return bool   * @since 1.8.0 @@ -1087,7 +1090,7 @@ function plugin_run_once() {  /**   * Runs unit tests for the entity objects.   * - * @param sting  $hook   unit_test + * @param string  $hook   unit_test   * @param string $type   system   * @param mixed  $value  Array of tests   * @param mixed  $params Params @@ -1102,6 +1105,49 @@ function plugins_test($hook, $type, $value, $params) {  }  /** + * Checks on deactivate plugin event if disabling it won't create unmet dependencies and blocks disable in such case. + * + * @param string $event  deactivate + * @param string $type   plugin + * @param array  $params Parameters array containing entry with ELggPlugin instance under 'plugin_entity' key + * @return bool  false to block plugin deactivation action + * + * @access private + */ +function _plugins_deactivate_dependency_check($event, $type, $params) { +	$plugin_id = $params['plugin_entity']->getManifest()->getPluginID(); +	$plugin_name = $params['plugin_entity']->getManifest()->getName(); + +	$active_plugins = elgg_get_plugins(); + +	$dependents = array(); +	foreach ($active_plugins as $plugin) { +		$manifest = $plugin->getManifest(); +		$requires = $manifest->getRequires(); + +		foreach ($requires as $required) { +			if ($required['type'] == 'plugin' && $required['name'] == $plugin_id) { +				// there are active dependents +				$dependents[$manifest->getPluginID()] = $plugin; +			} +		} +	} + +	if ($dependents) { +		$list = '<ul>'; +		// construct error message and prevent disabling +		foreach ($dependents as $dependent) { +			$list .= '<li>' . $dependent->getManifest()->getName() . '</li>'; +		} +		$list .= '</ul>'; + +		register_error(elgg_echo('ElggPlugin:Dependencies:ActiveDependent', array($plugin_name, $list))); + +		return false; +	} +} + +/**   * Initialize the plugin system   * Listens to system init and registers actions   * @@ -1112,6 +1158,10 @@ function plugin_init() {  	run_function_once("plugin_run_once");  	elgg_register_plugin_hook_handler('unit_test', 'system', 'plugins_test'); +	 +	// note - plugins are booted by the time this handler is registered +	// deactivation due to error may have already occurred +	elgg_register_event_handler('deactivate', 'plugin', '_plugins_deactivate_dependency_check');  	elgg_register_action("plugins/settings/save", '', 'admin');  	elgg_register_action("plugins/usersettings/save");  | 
