MediaWiki REL1_37
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->requireLogin( '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(
89 Html::rawElement(
90 'div',
91 [
92 'class' => 'mw-preferences-messagebox mw-notify-success successbox',
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 $context = new DerivativeContext( $this->getContext() );
144 $context->setTitle( $this->getPageTitle( 'reset' ) ); // Reset subpage
145 HTMLForm::factory( 'ooui', [], $context, 'prefs-restore' )
146 ->setSubmitTextMsg( 'restoreprefs' )
147 ->setSubmitDestructive()
148 ->setSubmitCallback( [ $this, 'submitReset' ] )
149 ->suppressReset()
150 ->show();
151 }
152
153 public function submitReset( $formData ) {
154 if ( !$this->getAuthority()->isAllowed( 'editmyoptions' ) ) {
155 throw new PermissionsError( 'editmyoptions' );
156 }
157
158 $user = $this->getUser()->getInstanceForUpdate();
159 $this->userOptionsManager->resetOptions( $user, $this->getContext(), 'all' );
160 $user->saveSettings();
161
162 // Set session data for the success message
163 $this->getRequest()->getSession()->set( 'specialPreferencesSaveSuccess', 1 );
164
165 $url = $this->getPageTitle()->getFullUrlForRedirect();
166 $this->getOutput()->redirect( $url );
167
168 return true;
169 }
170
171 protected function getGroupName() {
172 return 'users';
173 }
174}
An IContextSource implementation which will inherit context from another source but allow individual ...
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.
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.
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.
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 ...