Cleaned up and optimized wfBaseConvert();
[lhc/web/wiklou.git] / includes / api / ApiOptions.php
index f21bbc0..01a3760 100644 (file)
@@ -69,18 +69,41 @@ class ApiOptions extends ApiBase {
                        $newValue = isset( $params['optionvalue'] ) ? $params['optionvalue'] : null;
                        $changes[$params['optionname']] = $newValue;
                }
-               if ( !count( $changes ) ) {
+               if ( !$changed && !count( $changes ) ) {
                        $this->dieUsage( 'No changes were requested', 'nochanges' );
                }
 
                $prefs = Preferences::getPreferences( $user, $this->getContext() );
+
+               // Multiselect options are stored in the database with one key per
+               // option, each having a boolean value. Extract those keys.
+               $multiselectOptions = array();
+               foreach ( $prefs as $name => $info ) {
+                       if ( ( isset( $info['type'] ) && $info['type'] == 'multiselect' ) ||
+                                       ( isset( $info['class'] ) && $info['class'] == 'HTMLMultiSelectField' ) ) {
+                               $options = HTMLFormField::flattenOptions( $info['options'] );
+                               $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
+
+                               foreach ( $options as $value ) {
+                                       $multiselectOptions["$prefix$value"] = true;
+                               }
+
+                               unset( $prefs[$name] );
+                       }
+               }
+
                foreach ( $changes as $key => $value ) {
-                       if ( !isset( $prefs[$key] ) ) {
+                       if ( isset( $prefs[$key] ) ) {
+                               $field = HTMLForm::loadInputFromParameters( $key, $prefs[$key] );
+                               $validation = $field->validate( $value, $user->getOptions() );
+                       } elseif( isset( $multiselectOptions[$key] ) ) {
+                               // A key for a multiselect option.
+                               $validation = true;
+                               $value = (bool)$value;
+                       } else {
                                $this->setWarning( "Not a valid preference: $key" );
                                continue;
                        }
-                       $field = HTMLForm::loadInputFromParameters( $key, $prefs[$key] );
-                       $validation = $field->validate( $value, $user->getOptions() );
                        if ( $validation === true ) {
                                $user->setOption( $key, $value );
                                $changed = true;