setHeaders(); $this->outputHeader(); $out = $this->getOutput(); $out->disallowUserJs(); # Prevent hijacked user scripts from sniffing passwords etc. $this->requireLogin( 'prefsnologintext2' ); $this->checkReadOnly(); if ( $par == 'reset' ) { $this->showResetForm(); return; } $out->addModules( 'mediawiki.special.preferences.ooui' ); $out->addModuleStyles( [ 'mediawiki.special.preferences.styles.ooui', 'mediawiki.widgets.TagMultiselectWidget.styles', ] ); $out->addModuleStyles( 'oojs-ui-widgets.styles' ); $session = $this->getRequest()->getSession(); if ( $session->get( 'specialPreferencesSaveSuccess' ) ) { // Remove session data for the success message $session->remove( 'specialPreferencesSaveSuccess' ); $out->addModuleStyles( 'mediawiki.notification.convertmessagebox.styles' ); $out->addHTML( Html::rawElement( 'div', [ 'class' => 'mw-preferences-messagebox mw-notify-success successbox', 'id' => 'mw-preferences-success', 'data-mw-autohide' => 'false', ], Html::element( 'p', [], $this->msg( 'savedprefs' )->text() ) ) ); } $this->addHelpLink( 'Help:Preferences' ); // Load the user from the master to reduce CAS errors on double post (T95839) if ( $this->getRequest()->wasPosted() ) { $user = $this->getUser()->getInstanceForUpdate() ?: $this->getUser(); } else { $user = $this->getUser(); } $htmlForm = $this->getFormObject( $user, $this->getContext() ); $sectionTitles = $htmlForm->getPreferenceSections(); $prefTabs = []; foreach ( $sectionTitles as $key ) { $prefTabs[] = [ 'name' => $key, 'label' => $htmlForm->getLegend( $key ), ]; } $out->addJsConfigVars( 'wgPreferencesTabs', $prefTabs ); $htmlForm->show(); } /** * Get the preferences form to use. * @param User $user The user. * @param IContextSource $context The context. * @return PreferencesFormOOUI|HTMLForm */ protected function getFormObject( $user, IContextSource $context ) { $preferencesFactory = MediaWikiServices::getInstance()->getPreferencesFactory(); $form = $preferencesFactory->getForm( $user, $context, PreferencesFormOOUI::class ); return $form; } protected function showResetForm() { if ( !$this->getUser()->isAllowed( 'editmyoptions' ) ) { throw new PermissionsError( 'editmyoptions' ); } $this->getOutput()->addWikiMsg( 'prefs-reset-intro' ); $context = new DerivativeContext( $this->getContext() ); $context->setTitle( $this->getPageTitle( 'reset' ) ); // Reset subpage $htmlForm = HTMLForm::factory( 'ooui', [], $context, 'prefs-restore' ); $htmlForm->setSubmitTextMsg( 'restoreprefs' ); $htmlForm->setSubmitDestructive(); $htmlForm->setSubmitCallback( [ $this, 'submitReset' ] ); $htmlForm->suppressReset(); $htmlForm->show(); } public function submitReset( $formData ) { if ( !$this->getUser()->isAllowed( 'editmyoptions' ) ) { throw new PermissionsError( 'editmyoptions' ); } $user = $this->getUser()->getInstanceForUpdate(); $user->resetOptions( 'all', $this->getContext() ); $user->saveSettings(); // Set session data for the success message $this->getRequest()->getSession()->set( 'specialPreferencesSaveSuccess', 1 ); $url = $this->getPageTitle()->getFullUrlForRedirect(); $this->getOutput()->redirect( $url ); return true; } protected function getGroupName() { return 'users'; } }