MediaWiki  master
SpecialPreferences.php
Go to the documentation of this file.
1 <?php
27 
34 
37 
40 
45  public function __construct(
48  ) {
49  parent::__construct( 'Preferences' );
50  // This class is extended and therefore falls back to global state - T265924
51  $services = MediaWikiServices::getInstance();
52  $this->preferencesFactory = $preferencesFactory ?? $services->getPreferencesFactory();
53  $this->userOptionsManager = $userOptionsManager ?? $services->getUserOptionsManager();
54  }
55 
56  public function doesWrites() {
57  return true;
58  }
59 
60  public function execute( $par ) {
61  $this->setHeaders();
62  $this->outputHeader();
63  $out = $this->getOutput();
64  $out->disallowUserJs(); # Prevent hijacked user scripts from sniffing passwords etc.
65 
66  $this->requireNamedUser( 'prefsnologintext2' );
67  $this->checkReadOnly();
68 
69  if ( $par == 'reset' ) {
70  $this->showResetForm();
71 
72  return;
73  }
74 
75  $out->addModules( 'mediawiki.special.preferences.ooui' );
76  $out->addModuleStyles( [
77  'mediawiki.special.preferences.styles.ooui',
78  'mediawiki.widgets.TagMultiselectWidget.styles',
79  ] );
80  $out->addModuleStyles( 'oojs-ui-widgets.styles' );
81 
82  $session = $this->getRequest()->getSession();
83  if ( $session->get( 'specialPreferencesSaveSuccess' ) ) {
84  // Remove session data for the success message
85  $session->remove( 'specialPreferencesSaveSuccess' );
86  $out->addModuleStyles( 'mediawiki.notification.convertmessagebox.styles' );
87 
88  $out->addHTML(
90  'div',
91  [
92  'class' => 'mw-preferences-messagebox mw-notify-success mw-message-box-success mw-message-box',
93  'id' => 'mw-preferences-success',
94  'data-mw-autohide' => 'false',
95  ],
96  Html::element( 'p', [], $this->msg( 'savedprefs' )->text() )
97  )
98  );
99  }
100 
101  $this->addHelpLink( 'Help:Preferences' );
102 
103  // Load the user from the primary DB to reduce CAS errors on double post (T95839)
104  if ( $this->getRequest()->wasPosted() ) {
105  $user = $this->getUser()->getInstanceForUpdate() ?: $this->getUser();
106  } else {
107  $user = $this->getUser();
108  }
109 
110  $htmlForm = $this->getFormObject( $user, $this->getContext() );
111  $sectionTitles = $htmlForm->getPreferenceSections();
112 
113  $prefTabs = [];
114  foreach ( $sectionTitles as $key ) {
115  $prefTabs[] = [
116  'name' => $key,
117  'label' => $htmlForm->getLegend( $key ),
118  ];
119  }
120  $out->addJsConfigVars( 'wgPreferencesTabs', $prefTabs );
121 
122  $htmlForm->show();
123  }
124 
131  protected function getFormObject( $user, IContextSource $context ) {
132  $form = $this->preferencesFactory->getForm( $user, $context, PreferencesFormOOUI::class );
133  return $form;
134  }
135 
136  protected function showResetForm() {
137  if ( !$this->getAuthority()->isAllowed( 'editmyoptions' ) ) {
138  throw new PermissionsError( 'editmyoptions' );
139  }
140 
141  $this->getOutput()->addWikiMsg( 'prefs-reset-intro' );
142 
143  $desc = [
144  'confirm' => [
145  'type' => 'check',
146  'label-message' => 'prefs-reset-confirm',
147  'required' => true,
148  ],
149  ];
150  // TODO: disable the submit button if the checkbox is not checked
151  HTMLForm::factory( 'ooui', $desc, $this->getContext(), 'prefs-restore' )
152  ->setTitle( $this->getPageTitle( 'reset' ) ) // Reset subpage
153  ->setSubmitTextMsg( 'restoreprefs' )
154  ->setSubmitDestructive()
155  ->setSubmitCallback( [ $this, 'submitReset' ] )
156  ->suppressReset()
157  ->showCancel()
158  ->setCancelTarget( $this->getPageTitle() )
159  ->show();
160  }
161 
162  public function submitReset( $formData ) {
163  if ( !$this->getAuthority()->isAllowed( 'editmyoptions' ) ) {
164  throw new PermissionsError( 'editmyoptions' );
165  }
166 
167  $user = $this->getUser()->getInstanceForUpdate();
168  $this->userOptionsManager->resetOptions( $user, $this->getContext(), 'all' );
169  $user->saveSettings();
170 
171  // Set session data for the success message
172  $this->getRequest()->getSession()->set( 'specialPreferencesSaveSuccess', 1 );
173 
174  $url = $this->getPageTitle()->getFullUrlForRedirect();
175  $this->getOutput()->redirect( $url );
176 
177  return true;
178  }
179 
180  protected function getGroupName() {
181  return 'users';
182  }
183 }
static factory( $displayFormat, $descriptor, $context=null, $messagePrefix='')
Construct a HTMLForm object for given display type.
Definition: HTMLForm.php:336
static element( $element, $attribs=[], $contents='')
Identical to rawElement(), but HTML-escapes $contents (like Xml::element()).
Definition: Html.php:236
static rawElement( $element, $attribs=[], $contents='')
Returns an HTML element in a string.
Definition: Html.php:214
MediaWikiServices is the service locator for the application scope of MediaWiki.
A service class to control user options.
Show an error when a user tries to do something they do not have the necessary permissions for.
Parent class for all special pages.
Definition: SpecialPage.php:44
outputHeader( $summaryMessageKey='')
Outputs a summary message on top of special pages Per default the message key is the canonical name o...
setHeaders()
Sets headers - this should be called from the execute() method of all derived classes!
getOutput()
Get the OutputPage being used for this instance.
getUser()
Shortcut to get the User executing this instance.
requireNamedUser( $reasonMsg='exception-nologin-text', $titleMsg='exception-nologin')
If the user is not logged in or is a temporary user, throws UserNotLoggedIn.
getContext()
Gets the context this SpecialPage is executed in.
msg( $key,... $params)
Wrapper around wfMessage that sets the current context.
getAuthority()
Shortcut to get the Authority executing this instance.
getRequest()
Get the WebRequest being used for this instance.
checkReadOnly()
If the wiki is currently in readonly mode, throws a ReadOnlyError.
getPageTitle( $subpage=false)
Get a self-referential title object.
addHelpLink( $to, $overrideBaseUrl=false)
Adds help link with an icon via page indicators.
A special page that allows users to change their preferences.
execute( $par)
Default execute method Checks user permissions.
PreferencesFactory $preferencesFactory
doesWrites()
Indicates whether this special page may perform database writes.
getGroupName()
Under which header this special page is listed in Special:SpecialPages See messages 'specialpages-gro...
__construct(PreferencesFactory $preferencesFactory=null, UserOptionsManager $userOptionsManager=null)
getFormObject( $user, IContextSource $context)
Get the preferences form to use.
UserOptionsManager $userOptionsManager
Interface for objects which can provide a MediaWiki context on request.
A PreferencesFactory is a MediaWiki service that provides the definitions of preferences for a given ...