X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=application%2FConfig.php;h=9af5a535a5b9181e0c02457fa206a49c7b26e60e;hb=fd50e14cbae78b36112560eab1af11fe095611de;hp=c71ef68cd9ade1d07eeb6ebaf5a60338f8336339;hpb=fd006c630b64146edc402b68d8503c716f8a55d6;p=github%2Fshaarli%2FShaarli.git diff --git a/application/Config.php b/application/Config.php index c71ef68c..9af5a535 100644 --- a/application/Config.php +++ b/application/Config.php @@ -73,6 +73,106 @@ function writeConfig($config, $isLoggedIn) } } +/** + * Process plugin administration form data and save it in an array. + * + * @param array $formData Data sent by the plugin admin form. + * + * @return array New list of enabled plugin, ordered. + * + * @throws PluginConfigOrderException Plugins can't be sorted because their order is invalid. + */ +function save_plugin_config($formData) +{ + // 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); + + // Sort plugins by order. + if (!ksort($plugins)) { + throw new PluginConfigOrderException(); + } + + $finalPlugins = array(); + // Make plugins order continuous. + foreach ($plugins as $plugin) { + $finalPlugins[] = $plugin; + } + + 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; + } + + 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; +} + /** * 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. @@ -132,3 +232,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.'; + } +}