getUser(); if ( $user->isAnon() ) { $this->dieUsage( 'Anonymous users cannot change preferences', 'notloggedin' ); } $params = $this->extractRequestParams(); $changed = false; if ( isset( $params['optionvalue'] ) && !isset( $params['optionname'] ) ) { $this->dieUsageMsg( array( 'missingparam', 'optionname' ) ); } if ( $params['reset'] ) { $user->resetOptions(); $changed = true; } $changes = array(); if ( count( $params['change'] ) ) { foreach ( $params['change'] as $entry ) { $array = explode( '=', $entry, 2 ); $changes[$array[0]] = isset( $array[1] ) ? $array[1] : null; } } if ( isset( $params['optionname'] ) ) { $newValue = isset( $params['optionvalue'] ) ? $params['optionvalue'] : null; $changes[$params['optionname']] = $newValue; } if ( !$changed && !count( $changes ) ) { $this->dieUsage( 'No changes were requested', 'nochanges' ); } $prefs = Preferences::getPreferences( $user, $this->getContext() ); foreach ( $changes as $key => $value ) { if ( !isset( $prefs[$key] ) ) { $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; } else { $this->setWarning( "Validation error for '$key': $validation" ); } } if ( $changed ) { // Commit changes $user->saveSettings(); } $this->getResult()->addValue( null, $this->getModuleName(), 'success' ); } public function mustBePosted() { return true; } public function isWriteMode() { return true; } public function getAllowedParams() { return array( 'token' => array( ApiBase::PARAM_TYPE => 'string', ApiBase::PARAM_REQUIRED => true ), 'reset' => false, 'change' => array( ApiBase::PARAM_ISMULTI => true, ), 'optionname' => array( ApiBase::PARAM_TYPE => 'string', ), 'optionvalue' => array( ApiBase::PARAM_TYPE => 'string', ), ); } public function getResultProperties() { return array( '' => array( '*' => array( ApiBase::PROP_TYPE => array( 'success' ) ) ) ); } public function getParamDescription() { return array( 'token' => 'An options token previously obtained through the action=tokens', 'reset' => 'Resets all preferences to the site defaults', 'change' => 'List of changes, formatted name=value (e.g. skin=vector), value cannot contain pipe characters', 'optionname' => 'A name of a option which should have an optionvalue set', 'optionvalue' => 'A value of the option specified by the optionname, can contain pipe characters', ); } public function getDescription() { return 'Change preferences of the current user'; } public function getPossibleErrors() { return array_merge( parent::getPossibleErrors(), array( array( 'code' => 'notloggedin', 'info' => 'Anonymous users cannot change preferences' ), array( 'code' => 'nochanges', 'info' => 'No changes were requested' ), ) ); } public function needsToken() { return true; } public function getTokenSalt() { return ''; } public function getHelpUrls() { return 'https://www.mediawiki.org/wiki/API:Options'; } public function getExamples() { return array( 'api.php?action=options&reset=&token=123ABC', 'api.php?action=options&change=skin=vector|hideminor=1&token=123ABC', 'api.php?action=options&reset=&change=skin=monobook&optionname=nickname&optionvalue=[[User:Beau|Beau]]%20([[User_talk:Beau|talk]])&token=123ABC', ); } public function getVersion() { return __CLASS__ . ': $Id$'; } }