MediaWiki  master
SpecialPreferences.php
Go to the documentation of this file.
1 <?php
25 
32  function __construct() {
33  parent::__construct( 'Preferences' );
34  }
35 
36  public function doesWrites() {
37  return true;
38  }
39 
40  public function execute( $par ) {
41  $this->setHeaders();
42  $this->outputHeader();
43  $out = $this->getOutput();
44  $out->disallowUserJs(); # Prevent hijacked user scripts from sniffing passwords etc.
45 
46  $this->requireLogin( 'prefsnologintext2' );
47  $this->checkReadOnly();
48 
49  if ( $par == 'reset' ) {
50  $this->showResetForm();
51 
52  return;
53  }
54 
55  $out->addModules( 'mediawiki.special.preferences.ooui' );
56  $out->addModuleStyles( [
57  'mediawiki.special.preferences.styles.ooui',
58  'mediawiki.widgets.TagMultiselectWidget.styles',
59  ] );
60  $out->addModuleStyles( 'oojs-ui-widgets.styles' );
61 
62  $session = $this->getRequest()->getSession();
63  if ( $session->get( 'specialPreferencesSaveSuccess' ) ) {
64  // Remove session data for the success message
65  $session->remove( 'specialPreferencesSaveSuccess' );
66  $out->addModuleStyles( 'mediawiki.notification.convertmessagebox.styles' );
67 
68  $out->addHTML(
70  'div',
71  [
72  'class' => 'mw-preferences-messagebox mw-notify-success successbox',
73  'id' => 'mw-preferences-success',
74  'data-mw-autohide' => 'false',
75  ],
76  Html::element( 'p', [], $this->msg( 'savedprefs' )->text() )
77  )
78  );
79  }
80 
81  $this->addHelpLink( 'Help:Preferences' );
82 
83  // Load the user from the master to reduce CAS errors on double post (T95839)
84  if ( $this->getRequest()->wasPosted() ) {
85  $user = $this->getUser()->getInstanceForUpdate() ?: $this->getUser();
86  } else {
87  $user = $this->getUser();
88  }
89 
90  $htmlForm = $this->getFormObject( $user, $this->getContext() );
91  $sectionTitles = $htmlForm->getPreferenceSections();
92 
93  $prefTabs = [];
94  foreach ( $sectionTitles as $key ) {
95  $prefTabs[] = [
96  'name' => $key,
97  'label' => $htmlForm->getLegend( $key ),
98  ];
99  }
100  $out->addJsConfigVars( 'wgPreferencesTabs', $prefTabs );
101 
102  $htmlForm->show();
103  }
104 
111  protected function getFormObject( $user, IContextSource $context ) {
112  $preferencesFactory = MediaWikiServices::getInstance()->getPreferencesFactory();
113  $form = $preferencesFactory->getForm( $user, $context, PreferencesFormOOUI::class );
114  return $form;
115  }
116 
117  protected function showResetForm() {
118  if ( !MediaWikiServices::getInstance()
120  ->userHasRight( $this->getUser(), 'editmyoptions' )
121  ) {
122  throw new PermissionsError( 'editmyoptions' );
123  }
124 
125  $this->getOutput()->addWikiMsg( 'prefs-reset-intro' );
126 
127  $context = new DerivativeContext( $this->getContext() );
128  $context->setTitle( $this->getPageTitle( 'reset' ) ); // Reset subpage
129  $htmlForm = HTMLForm::factory( 'ooui', [], $context, 'prefs-restore' );
130 
131  $htmlForm->setSubmitTextMsg( 'restoreprefs' );
132  $htmlForm->setSubmitDestructive();
133  $htmlForm->setSubmitCallback( [ $this, 'submitReset' ] );
134  $htmlForm->suppressReset();
135 
136  $htmlForm->show();
137  }
138 
139  public function submitReset( $formData ) {
140  if ( !MediaWikiServices::getInstance()
142  ->userHasRight( $this->getUser(), 'editmyoptions' )
143  ) {
144  throw new PermissionsError( 'editmyoptions' );
145  }
146 
147  $user = $this->getUser()->getInstanceForUpdate();
148  $user->resetOptions( 'all', $this->getContext() );
149  $user->saveSettings();
150 
151  // Set session data for the success message
152  $this->getRequest()->getSession()->set( 'specialPreferencesSaveSuccess', 1 );
153 
154  $url = $this->getPageTitle()->getFullUrlForRedirect();
155  $this->getOutput()->redirect( $url );
156 
157  return true;
158  }
159 
160  protected function getGroupName() {
161  return 'users';
162  }
163 }
static element( $element, $attribs=[], $contents='')
Identical to rawElement(), but HTML-escapes $contents (like Xml::element()).
Definition: Html.php:231
$context
Definition: load.php:45
getContext()
Gets the context this SpecialPage is executed in.
static rawElement( $element, $attribs=[], $contents='')
Returns an HTML element in a string.
Definition: Html.php:209
An IContextSource implementation which will inherit context from another source but allow individual ...
addHelpLink( $to, $overrideBaseUrl=false)
Adds help link with an icon via page indicators.
getFormObject( $user, IContextSource $context)
Get the preferences form to use.
getOutput()
Get the OutputPage being used for this instance.
A special page that allows users to change their preferences.
getPermissionManager()
msg( $key,... $params)
Wrapper around wfMessage that sets the current context.
static factory( $displayFormat,... $arguments)
Construct a HTMLForm object for given display type.
Definition: HTMLForm.php:307
setHeaders()
Sets headers - this should be called from the execute() method of all derived classes! ...
requireLogin( $reasonMsg='exception-nologin-text', $titleMsg='exception-nologin')
If the user is not logged in, throws UserNotLoggedIn error.
getUser()
Shortcut to get the User executing this instance.
Show an error when a user tries to do something they do not have the necessary permissions for...
getRequest()
Get the WebRequest being used for this instance.
checkReadOnly()
If the wiki is currently in readonly mode, throws a ReadOnlyError.
outputHeader( $summaryMessageKey='')
Outputs a summary message on top of special pages Per default the message key is the canonical name o...
getPageTitle( $subpage=false)
Get a self-referential title object.