X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=application%2FConfig.php;h=05a594527e5aabde23f20551f848247081134ac4;hb=6d03a9b2b38dd27c6df3127fcd2e24c686cab9df;hp=c71ef68cd9ade1d07eeb6ebaf5a60338f8336339;hpb=fd006c630b64146edc402b68d8503c716f8a55d6;p=github%2Fshaarli%2FShaarli.git diff --git a/application/Config.php b/application/Config.php index c71ef68c..05a59452 100644 --- a/application/Config.php +++ b/application/Config.php @@ -74,30 +74,103 @@ function writeConfig($config, $isLoggedIn) } /** - * Milestone 0.9 - shaarli/Shaarli#41: options.php is not supported anymore. - * ==> if user is loggedIn, merge its content with config.php, then delete options.php. + * Process plugin administration form data and save it in an array. * - * @param array $config contains all configuration fields. - * @param bool $isLoggedIn true if user is logged in. + * @param array $formData Data sent by the plugin admin form. * - * @return void + * @return array New list of enabled plugin, ordered. + * + * @throws PluginConfigOrderException Plugins can't be sorted because their order is invalid. */ -function mergeDeprecatedConfig($config, $isLoggedIn) +function save_plugin_config($formData) { - $config_file = $config['config']['CONFIG_FILE']; + // Make sure there are no duplicates in orders. + if (!validate_plugin_order($formData)) { + throw new PluginConfigOrderException(); + } + + $plugins = array(); + $newEnabledPlugins = array(); + foreach ($formData as $key => $data) { + if (startsWith($key, 'order')) { + continue; + } + + // If there is no order, it means a disabled plugin has been enabled. + if (isset($formData['order_' . $key])) { + $plugins[(int) $formData['order_' . $key]] = $key; + } + else { + $newEnabledPlugins[] = $key; + } + } + + // New enabled plugins will be added at the end of order. + $plugins = array_merge($plugins, $newEnabledPlugins); - if (is_file($config['config']['DATADIR'].'/options.php') && $isLoggedIn) { - include $config['config']['DATADIR'].'/options.php'; + // Sort plugins by order. + if (!ksort($plugins)) { + throw new PluginConfigOrderException(); + } + + $finalPlugins = array(); + // Make plugins order continuous. + foreach ($plugins as $plugin) { + $finalPlugins[] = $plugin; + } - // Load GLOBALS into config - foreach ($GLOBALS as $key => $value) { - $config[$key] = $value; + return $finalPlugins; +} + +/** + * Validate plugin array submitted. + * Will fail if there is duplicate orders value. + * + * @param array $formData Data from submitted form. + * + * @return bool true if ok, false otherwise. + */ +function validate_plugin_order($formData) +{ + $orders = array(); + foreach ($formData as $key => $value) { + // No duplicate order allowed. + if (in_array($value, $orders)) { + return false; } - $config['config']['CONFIG_FILE'] = $config_file; - writeConfig($config, $isLoggedIn); - unlink($config['config']['DATADIR'].'/options.php'); + if (startsWith($key, 'order')) { + $orders[] = $value; + } } + + return true; +} + +/** + * Affect plugin parameters values into plugins array. + * + * @param mixed $plugins Plugins array ($plugins[]['parameters']['param_name'] = . + * @param mixed $config Plugins configuration. + * + * @return mixed Updated $plugins array. + */ +function load_plugin_parameter_values($plugins, $config) +{ + $out = $plugins; + foreach ($plugins as $name => $plugin) { + if (empty($plugin['parameters'])) { + continue; + } + + foreach ($plugin['parameters'] as $key => $param) { + if (!empty($config[$key])) { + $out[$name]['parameters'][$key] = $config[$key]; + } + } + } + + return $out; } /** @@ -132,3 +205,17 @@ class UnauthorizedConfigException extends Exception $this->message = 'You are not authorized to alter config.'; } } + +/** + * Exception used if an error occur while saving plugin configuration. + */ +class PluginConfigOrderException extends Exception +{ + /** + * Construct exception. + */ + public function __construct() + { + $this->message = 'An error occurred while trying to save plugins loading order.'; + } +}