}
$params = $this->extractRequestParams();
- $changes = 0;
+ $changed = false;
if ( isset( $params['optionvalue'] ) && !isset( $params['optionname'] ) ) {
$this->dieUsageMsg( array( 'missingparam', 'optionname' ) );
if ( $params['reset'] ) {
$user->resetOptions();
- $changes++;
+ $changed = true;
}
+
+ $changes = array();
if ( count( $params['change'] ) ) {
foreach ( $params['change'] as $entry ) {
$array = explode( '=', $entry, 2 );
- $user->setOption( $array[0], isset( $array[1] ) ? $array[1] : null );
- $changes++;
+ $changes[$array[0]] = isset( $array[1] ) ? $array[1] : null;
}
}
if ( isset( $params['optionname'] ) ) {
$newValue = isset( $params['optionvalue'] ) ? $params['optionvalue'] : null;
- $user->setOption( $params['optionname'], $newValue );
- $changes++;
+ $changes[$params['optionname']] = $newValue;
+ }
+ 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] );
+ }
}
- if ( $changes ) {
+ foreach ( $changes as $key => $value ) {
+ 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;
+ }
+ if ( $validation === true ) {
+ $user->setOption( $key, $value );
+ $changed = true;
+ } else {
+ $this->setWarning( "Validation error for '$key': $validation" );
+ }
+ }
+
+ if ( $changed ) {
// Commit changes
$user->saveSettings();
- } else {
- $this->dieUsage( 'No changes were requested', 'nochanges' );
}
$this->getResult()->addValue( null, $this->getModuleName(), 'success' );
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
- array( 'notloggedin' ),
- array( 'nochanges' ),
+ array( 'code' => 'notloggedin', 'info' => 'Anonymous users cannot change preferences' ),
+ array( 'code' => 'nochanges', 'info' => 'No changes were requested' ),
) );
}