* replace hard coded namespace numbers by the php define
[lhc/web/wiklou.git] / includes / Preferences.php
index 73e982b..e076b3f 100644 (file)
@@ -11,10 +11,74 @@ class Preferences {
                if (self::$defaultPreferences)
                        return self::$defaultPreferences;
        
-               global $wgLang, $wgRCMaxAge;
-               
+               global $wgRCMaxAge;
+
                $defaultPreferences = array();
+
+               self::profilePreferences( $user, $defaultPreferences );
+               self::skinPreferences( $user, $defaultPreferences );
+               self::filesPreferences( $user, $defaultPreferences );
+               self::mathPreferences( $user, $defaultPreferences );
+               self::datetimePreferences( $user, $defaultPreferences );
+               self::renderingPreferences( $user, $defaultPreferences );
+               self::editingPreferences( $user, $defaultPreferences );
+               self::rcPreferences( $user, $defaultPreferences );
+               self::watchlistPreferences( $user, $defaultPreferences );
+               self::searchPreferences( $user, $defaultPreferences );
+               self::miscPreferences( $user, $defaultPreferences );
+
+               wfRunHooks( 'GetPreferences', array( $user, &$defaultPreferences ) );
+
+               ## Prod in defaults from the user
+               global $wgDefaultUserOptions;
+               foreach( $defaultPreferences as $name => &$info ) {
+                       $prefFromUser = self::getOptionFromUser( $name, $info, $user );
+                       $field = HTMLForm::loadInputFromParameters( $info ); // For validation
+                       $globalDefault = isset($wgDefaultUserOptions[$name])
+                                                               ? $wgDefaultUserOptions[$name]
+                                                               : null;
+                       
+                       // If it validates, set it as the default
+                       if ( isset($info['default']) ) {
+                               // Already set, no problem
+                               continue;
+                       } elseif ( !is_null( $prefFromUser ) && // Make sure we're not just pulling nothing
+                                       $field->validate( $prefFromUser, $user->mOptions ) ) {
+                               $info['default'] = $prefFromUser;
+                       } elseif( $field->validate( $globalDefault, $user->mOptions ) ) {
+                               $info['default'] = $globalDefault;
+                       }
+               }
+               
+               self::$defaultPreferences = $defaultPreferences;
                
+               return $defaultPreferences;
+       }
+       
+       // Pull option from a user account. Handles stuff like array-type preferences.
+       static function getOptionFromUser( $name, $info, $user ) {
+               $val = $user->getOption( $name );
+               
+               // Handling for array-type preferences
+               if ( ( isset($info['type']) && $info['type'] == 'multiselect' ) ||
+                               ( isset($info['class']) && $info['class'] == 'HTMLMultiSelectField' ) ) {
+
+                       $options = HTMLFormField::flattenOptions($info['options']);
+                       $prefix = isset($info['prefix']) ? $info['prefix'] : $name;
+                       $val = array();
+                       
+                       foreach( $options as $label => $value ) {
+                               if ($user->getOption( "$prefix$value" ) ) {
+                                       $val[] = $value;
+                               }
+                       }
+               }
+       
+               return $val;
+       }
+       
+       static function profilePreferences( $user, &$defaultPreferences ) {
+               global $wgLang;
                ## User info #####################################
                // Information panel
                $defaultPreferences['username'] =
@@ -22,7 +86,7 @@ class Preferences {
                                        'type' => 'info',
                                        'label-message' => 'username',
                                        'default' => $user->getName(),
-                                       'section' => 'personal',
+                                       'section' => 'personal/info',
                                );
                
                $defaultPreferences['userid'] =
@@ -30,7 +94,7 @@ class Preferences {
                                        'type' => 'info',
                                        'label-message' => 'uid',
                                        'default' => $user->getId(),
-                                       'section' => 'personal',
+                                       'section' => 'personal/info',
                                );
                
                # Get groups to which the user belongs
@@ -52,7 +116,7 @@ class Preferences {
                                                                count($userEffectiveGroupsArray) ),
                                        'default' => $wgLang->commaList( $userEffectiveGroupsArray ),
                                        'raw' => true,
-                                       'section' => 'personal',
+                                       'section' => 'personal/info',
                                );
                
                $defaultPreferences['editcount'] =
@@ -60,7 +124,7 @@ class Preferences {
                                        'type' => 'info',
                                        'label-message' => 'prefs-edits',
                                        'default' => $user->getEditCount(),
-                                       'section' => 'personal',
+                                       'section' => 'personal/info',
                                );
                
                if ($user->getRegistration()) {
@@ -69,38 +133,37 @@ class Preferences {
                                                'type' => 'info',
                                                'label-message' => 'prefs-registration',
                                                'default' => $wgLang->timeanddate( $user->getRegistration() ),
-                                               'section' => 'personal',
+                                               'section' => 'personal/info',
                                        );
                }
                                
                // Actually changeable stuff
-               global $wgAllowRealName;
+               global $wgAllowRealName, $wgAuth;
                if ($wgAllowRealName) {
                        $defaultPreferences['realname'] =
                                        array(
-                                               'type' => 'text',
+                                               'type' => $wgAuth->allowRealNameChange() ? 'text' : 'info',
                                                'default' => $user->getRealName(),
-                                               'section' => 'personal',
+                                               'section' => 'personal/info',
                                                'label-message' => 'yourrealname',
                                                'help-message' => 'prefs-help-realname',
                                        );
                }
-                               
-               global $wgEmailConfirmToEdit;
                
-               $defaultPreferences['emailaddress'] =
+               
+               $defaultPreferences['gender'] =
                                array(
-                                       'type' => 'text',
-                                       'default' => $user->getEmail(),
-                                       'section' => 'personal',
-                                       'label-message' => 'youremail',
-                                       'help-message' => $wgEmailConfirmToEdit
-                                                                               ? 'prefs-help-email-required'
-                                                                               : 'prefs-help-email',
-                                       'validation-callback' => array( 'Preferences', 'validateEmail' ),
+                                       'type' => 'select',
+                                       'section' => 'personal/info',
+                                       'options' => array(
+                                               wfMsg('gender-male') => 'male',
+                                               wfMsg('gender-female') => 'female',
+                                               wfMsg('gender-unknown') => 'unknown',
+                                       ),
+                                       'label-message' => 'yourgender',
+                                       'help-message' => 'prefs-help-gender',
                                );
-               
-               global $wgAuth;
+
                if ($wgAuth->allowPasswordChange()) {
                        global $wgUser; // For skin.
                        $link = $wgUser->getSkin()->link( SpecialPage::getTitleFor( 'ResetPass' ),
@@ -113,21 +176,15 @@ class Preferences {
                                                'raw' => true,
                                                'default' => $link,
                                                'label-message' => 'yourpassword',
-                                               'section' => 'personal',
+                                               'section' => 'personal/info',
                                        );
                }
                
-               $defaultPreferences['gender'] =
+               $defaultPreferences['rememberpassword'] =
                                array(
-                                       'type' => 'select',
-                                       'section' => 'personal',
-                                       'options' => array(
-                                               wfMsg('gender-male') => 'male',
-                                               wfMsg('gender-female') => 'female',
-                                               wfMsg('gender-unknown') => 'unknown',
-                                       ),
-                                       'label-message' => 'yourgender',
-                                       'help-message' => 'prefs-help-gender',
+                                       'type' => 'toggle',
+                                       'label-message' => 'tog-rememberpassword',
+                                       'section' => 'personal/info',
                                );
                                
                // Language
@@ -146,7 +203,7 @@ class Preferences {
                $defaultPreferences['language'] =
                                array(
                                        'type' => 'select',
-                                       'section' => 'personal',
+                                       'section' => 'personal/i18n',
                                        'options' => $options,
                                        'label-message' => 'yourlanguage',
                                );
@@ -178,7 +235,7 @@ class Preferences {
                                                'label-message' => 'yourvariant',
                                                'type' => 'select',
                                                'options' => $options,
-                                               'section' => 'personal',
+                                               'section' => 'personal/i18n',
                                        );
                        }
                }
@@ -187,7 +244,7 @@ class Preferences {
                        $defaultPreferences['noconvertlink'] =
                                        array(
                                                'type' => 'toggle',
-                                               'section' => 'misc',
+                                               'section' => 'personal/i18n',
                                                'label-message' => 'tog-noconvertlink',
                                        );
                }
@@ -195,33 +252,41 @@ class Preferences {
                global $wgMaxSigChars;
                $defaultPreferences['nickname'] =
                                array(
-                                       'type' => 'text',
+                                       'type' => $wgAuth->allowNickChange() ? 'text' : 'info',
                                        'maxlength' => $wgMaxSigChars,
                                        'label-message' => 'yournick',
                                        'validation-callback' =>
                                                array( 'Preferences', 'validateSignature' ),
-                                       'section' => 'personal',
+                                       'section' => 'personal/signature',
                                        'filter-callback' => array( 'Preferences', 'cleanSignature' ),
                                );
                $defaultPreferences['fancysig'] =
                                array(
                                        'type' => 'toggle',
                                        'label-message' => 'tog-fancysig',
-                                       'section' => 'personal'
+                                       'section' => 'personal/signature'
                                );
                                
-               $defaultPreferences['rememberpassword'] =
+               ## Email stuff
+               
+               global $wgEmailConfirmToEdit;
+               
+               $defaultPreferences['emailaddress'] =
                                array(
-                                       'type' => 'toggle',
-                                       'label-message' => 'tog-rememberpassword',
-                                       'section' => 'personal',
+                                       'type' => $wgAuth->allowEmailChange() ? 'text' : 'info',
+                                       'default' => $user->getEmail(),
+                                       'section' => 'personal/email',
+                                       'label-message' => 'youremail',
+                                       'help-message' => $wgEmailConfirmToEdit
+                                                                               ? 'prefs-help-email-required'
+                                                                               : 'prefs-help-email',
+                                       'validation-callback' => array( 'Preferences', 'validateEmail' ),
                                );
-
-
-               ## Email #######################################
-               ## Email stuff
+                               
                global $wgEnableEmail, $wgEnableUserEmail, $wgEmailAuthentication;
                
+               $disableEmailPrefs = false;
+               
                if ( $wgEmailAuthentication ) {
                        if ( $user->getEmail() ) {
                                if( $user->getEmailAuthenticationTimestamp() ) {
@@ -235,12 +300,14 @@ class Preferences {
                                        $disableEmailPrefs = false;
                                } else {
                                        $disableEmailPrefs = true;
+                                       global $wgUser; // wgUser is okay here, it's for display
                                        $skin = $wgUser->getSkin();
                                        $emailauthenticated = wfMsg('emailnotauthenticated').'<br />' .
                                                $skin->makeKnownLinkObj( SpecialPage::getTitleFor( 'Confirmemail' ),
                                                        wfMsg( 'emailconfirmlink' ) ) . '<br />';
                                }
                        } else {
+                               $disableEmailPrefs = true;
                                $emailauthenticated = wfMsg( 'noemailprefs' );
                        }
                        
@@ -248,7 +315,7 @@ class Preferences {
                                        array(
                                                'type' => 'info',
                                                'raw' => true,
-                                               'section' => 'email',
+                                               'section' => 'personal/email',
                                                'label-message' => 'prefs-emailconfirm-label',
                                                'default' => $emailauthenticated,
                                        );
@@ -261,45 +328,53 @@ class Preferences {
                                                array(
                                                        'type' => 'toggle',
                                                        'invert' => true,
-                                                       'section' => 'email',
+                                                       'section' => 'personal/email',
                                                        'label-message' => 'allowemail',
+                                                       'disabled' => $disableEmailPrefs,
                                                );
                                $defaultPreferences['ccmeonemails'] =
                                                array(
                                                        'type' => 'toggle',
-                                                       'section' => 'email',
+                                                       'section' => 'personal/email',
                                                        'label-message' => 'tog-ccmeonemails',
+                                                       'disabled' => $disableEmailPrefs,
                                                );
                        }
                        
                        $defaultPreferences['enotifwatchlistpages'] =
                                        array(
                                                'type' => 'toggle',
-                                               'section' => 'email',
+                                               'section' => 'personal/email',
                                                'label-message' => 'tog-enotifwatchlistpages',
+                                               'disabled' => $disableEmailPrefs,
                                        );
                        $defaultPreferences['enotifusertalkpages'] =
                                        array(
                                                'type' => 'toggle',
-                                               'section' => 'email',
+                                               'section' => 'personal/email',
                                                'label-message' => 'tog-enotifusertalkpages',
+                                               'disabled' => $disableEmailPrefs,
                                        );
                        $defaultPreferences['enotifminoredits'] =
                                        array(
                                                'type' => 'toggle',
-                                               'section' => 'email',
+                                               'section' => 'personal/email',
                                                'label-message' => 'tog-enotifminoredits',
+                                               'disabled' => $disableEmailPrefs,
                                        );
                        $defaultPreferences['enotifrevealaddr'] =
                                        array(
                                                'type' => 'toggle',
-                                               'section' => 'email',
-                                               'label-message' => 'tog-enotifrevealaddr'
+                                               'section' => 'personal/email',
+                                               'label-message' => 'tog-enotifrevealaddr',
+                                               'disabled' => $disableEmailPrefs,
                                        );
                }
-               
+       }
+       
+       static function skinPreferences( $user, &$defaultPreferences ) {
                ## Skin #####################################
-               global $wgAllowUserSkin;
+               global $wgAllowUserSkin, $wgLang;
                
                if ($wgAllowUserSkin) {
                        $defaultPreferences['skin'] =
@@ -307,14 +382,27 @@ class Preferences {
                                                'type' => 'radio',
                                                'options' => self::generateSkinOptions( $user ),
                                                'label' => '&nbsp;',
-                                               'section' => 'skin',
+                                               'section' => 'rendering/skin',
                                        );
                }
                
-               ## TODO QUICKBAR
-                               
+               $selectedSkin = $user->getOption( 'skin' );
+               if ( in_array( $selectedSkin, array( 'cologneblue', 'standard' ) ) ) {
+                       $settings = array_flip($wgLang->getQuickbarSettings());
+                       
+                       $defaultPreferences['quickbar'] =
+                               array(
+                                       'type' => 'radio',
+                                       'options' => $settings,
+                                       'section' => 'skin',
+                                       'label-message' => 'qbsettings',
+                               );
+               }
+       }
+       
+       static function mathPreferences( $user, &$defaultPreferences ) {
                ## Math #####################################
-               global $wgUseTeX;
+               global $wgUseTeX, $wgLang;
                if ($wgUseTeX) {
                        $defaultPreferences['math'] =
                                        array(
@@ -322,25 +410,31 @@ class Preferences {
                                                'options' =>
                                                        array_flip( array_map( 'wfMsg', $wgLang->getMathNames() ) ),
                                                'label' => '&nbsp;',
-                                               'section' => 'math',
+                                               'section' => 'rendering/math',
                                        );
                }
-               
+       }
+       
+       static function filesPreferences( $user, &$defaultPreferences ) {
                ## Files #####################################
                $defaultPreferences['imagesize'] =
                                array(
                                        'type' => 'select',
                                        'options' => self::getImageSizes(),
                                        'label-message' => 'imagemaxsize',
-                                       'section' => 'files',
+                                       'section' => 'rendering/files',
                                );
                $defaultPreferences['thumbsize'] =
                                array(
                                        'type' => 'select',
                                        'options' => self::getThumbSizes(),
                                        'label-message' => 'thumbsize',
-                                       'section' => 'files',
+                                       'section' => 'rendering/files',
                                );
+       }
+       
+       static function datetimePreferences( $user, &$defaultPreferences ) {
+               global $wgLang;
                
                ## Date and time #####################################
                $dateOptions = self::getDateOptions();
@@ -396,7 +490,9 @@ class Preferences {
                                        'default' => $tzSetting,
                                        'section' => 'datetime',
                                );
-                               
+       }
+       
+       static function renderingPreferences( $user, &$defaultPreferences ) {
                ## Page Rendering ##############################
                $defaultPreferences['underline'] =
                                array(
@@ -465,13 +561,15 @@ class Preferences {
                                        'section' => 'rendering',
                                        'label-message' => 'tog-numberheadings',
                                );
-               
+       }
+       
+       static function editingPreferences( $user, &$defaultPreferences ) {
                ## Editing #####################################
                $defaultPreferences['cols'] =
                                array(
                                        'type' => 'int',
                                        'label-message' => 'columns',
-                                       'section' => 'editing',
+                                       'section' => 'editing/textboxsize',
                                        'min' => 4,
                                        'max' => 1000,
                                );
@@ -479,7 +577,7 @@ class Preferences {
                                array(
                                        'type' => 'int',
                                        'label-message' => 'rows',
-                                       'section' => 'editing',
+                                       'section' => 'editing/textboxsize',
                                        'min' => 4,
                                        'max' => 1000,
                                );
@@ -555,7 +653,10 @@ class Preferences {
                                        'section' => 'editing',
                                        'label-message' => 'tog-uselivepreview',
                                );
-                               
+       }
+       
+       static function rcPreferences( $user, &$defaultPreferences ) {
+               global $wgRCMaxAge, $wgUseRCPatrol;
                ## RecentChanges #####################################
                $defaultPreferences['rcdays'] =
                                array(
@@ -609,7 +710,10 @@ class Preferences {
                                                'label-message' => 'tog-shownumberswatching',
                                        );
                }
-                               
+       }
+       
+       static function watchlistPreferences( $user, &$defaultPreferences ) {
+               global $wgUseRCPatrol;
                ## Watchlist #####################################
                $defaultPreferences['wllimit'] =
                                array(
@@ -691,6 +795,10 @@ class Preferences {
                                );
                        }
                }
+       }
+       
+       static function searchPreferences( $user, &$defaultPreferences ) {
+               global $wgContLang;
                
                ## Search #####################################
                $defaultPreferences['searchlimit'] =
@@ -713,7 +821,16 @@ class Preferences {
                                        'label-message' => 'contextchars',
                                        'section' => 'searchoptions',
                                        'min' => 0,
-                               );
+                               );              
+               global $wgEnableMWSuggest;
+               if ($wgEnableMWSuggest) {
+                       $defaultPreferences['disablesuggest'] =
+                                       array(
+                                               'type' => 'toggle',
+                                               'label-message' => 'mwsuggest-disable',
+                                               'section' => 'searchoptions',
+                                       );
+               }               
                
                // Searchable namespaces back-compat with old format
                $searchableNamespaces = SearchEngine::searchableNamespaces();
@@ -736,17 +853,9 @@ class Preferences {
                                        'section' => 'searchoptions',
                                        'prefix' => 'searchNs',
                                );
-                               
-               global $wgEnableMWSuggest;
-               if ($wgEnableMWSuggest) {
-                       $defaultPreferences['disablesuggest'] =
-                                       array(
-                                               'type' => 'toggle',
-                                               'label-message' => 'mwsuggest-disable',
-                                               'section' => 'searchoptions',
-                                       );
-               }
-               
+       }
+       
+       static function miscPreferences( $user, &$defaultPreferences ) {
                ## Misc #####################################
                $defaultPreferences['diffonly'] =
                                array(
@@ -760,55 +869,6 @@ class Preferences {
                                        'section' => 'misc',
                                        'label-message' => 'tog-norollbackdiff',
                                );
-                               
-               wfRunHooks( 'GetPreferences', array( $user, &$defaultPreferences ) );
-                               
-               ## Prod in defaults from the user
-               global $wgDefaultUserOptions;
-               foreach( $defaultPreferences as $name => &$info ) {
-                       $prefFromUser = self::getOptionFromUser( $name, $info, $user );
-                       $field = HTMLForm::loadInputFromParameters( $info ); // For validation
-                       $globalDefault = isset($wgDefaultUserOptions[$name])
-                                                               ? $wgDefaultUserOptions[$name]
-                                                               : null;
-                       
-                       // If it validates, set it as the default
-                       if ( isset($info['default']) ) {
-                               // Already set, no problem
-                               continue;
-                       } elseif ( !is_null( $prefFromUser ) && // Make sure we're not just pulling nothing
-                                       $field->validate( $prefFromUser, $user->mOptions ) ) {
-                               $info['default'] = $prefFromUser;
-                       } elseif( $field->validate( $globalDefault, $user->mOptions ) ) {
-                               $info['default'] = $globalDefault;
-                       }
-               }
-               
-               self::$defaultPreferences = $defaultPreferences;
-               
-               return $defaultPreferences;
-       }
-       
-       // Pull option from a user account. Handles stuff like array-type preferences.
-       static function getOptionFromUser( $name, $info, $user ) {
-               $val = $user->getOption( $name );
-               
-               // Handling for array-type preferences
-               if ( ( isset($info['type']) && $info['type'] == 'multiselect' ) ||
-                               ( isset($info['class']) && $info['class'] == 'HTMLMultiSelectField' ) ) {
-
-                       $options = HTMLFormField::flattenOptions($info['options']);
-                       $prefix = isset($info['prefix']) ? $info['prefix'] : $name;
-                       $val = array();
-                       
-                       foreach( $options as $label => $value ) {
-                               if ($user->getOption( "$prefix$value" ) ) {
-                                       $val[] = $value;
-                               }
-                       }
-               }
-       
-               return $val;
        }
        
        static function generateSkinOptions( $user ) {
@@ -839,12 +899,12 @@ class Preferences {
                        global $wgAllowUserCss, $wgAllowUserJs;
                        if( $wgAllowUserCss ) {
                                $cssPage = Title::makeTitleSafe( NS_USER, $user->getName().'/'.$skinkey.'.css' );
-                               $customCSS = $sk->makeLinkObj( $cssPage, wfMsgExt('prefs-custom-css', array() ) );
+                               $customCSS = $sk->link( $cssPage, wfMsgExt( 'prefs-custom-css', array() ) );
                                $extraLinks .= " ($customCSS)";
                        }
                        if( $wgAllowUserJs ) {
                                $jsPage = Title::makeTitleSafe( NS_USER, $user->getName().'/'.$skinkey.'.js' );
-                               $customJS = $sk->makeLinkObj( $jsPage, wfMsgHtml('prefs-custom-js') );
+                               $customJS = $sk->link( $jsPage, wfMsgHtml( 'prefs-custom-js' ) );
                                $extraLinks .= " ($customJS)";
                        }
                        if( $skinkey == $wgDefaultSkin )
@@ -933,9 +993,7 @@ class Preferences {
        }
        
        static function validateEmail( $email, $alldata ) {
-               global $wgUser; // To check
-               
-               if ( $email && !$wgUser->isValidEmailAddr( $email ) ) {
+               if ( $email && !User::isValidEmailAddr( $email ) ) {
                        return wfMsgExt( 'invalidemailaddress', 'parseinline' );
                }
                
@@ -1039,9 +1097,11 @@ class Preferences {
                }
        }
        
-       static function tryFormSubmit( $formData ) {
+       static function tryFormSubmit( $formData, $entryPoint = 'internal' ) {
                global $wgUser, $wgEmailAuthentication, $wgEnableEmail;
                
+               $result = true;
+               
                // Filter input
                foreach( array_keys($formData) as $name ) {
                        if ( isset(self::$saveFilters[$name]) ) {
@@ -1071,9 +1131,8 @@ class Preferences {
                                        $result = $wgUser->sendConfirmationMail();
                                        if( WikiError::isError( $result ) ) {
                                                return wfMsg( 'mailerror', htmlspecialchars( $result->getMessage() ) );
-                                       } else {
-                                               // TODO return this somehow
-#                                              wfMsg( 'eauthentsent', $wgUser->getName() );
+                                       } elseif ($entryPoint == 'ui') {
+                                               $result = 'eauth';
                                        }
                                }
                        } else {
@@ -1104,9 +1163,23 @@ class Preferences {
                
                $wgUser->saveSettings();
                
-               // Done
-               global $wgOut;
-               $wgOut->redirect( SpecialPage::getTitleFor( 'Preferences' )->getFullURL( 'success' ) );
+               return $result;
+       }
+       
+       public static function tryUISubmit( $formData ) {
+               $res = self::tryFormSubmit( $formData, 'ui' );
+               
+               if ($res) {
+                       $urlOptions = array( 'success' );
+                       if ($res === 'eauth')
+                               $urlOptions[] = 'eauth';
+                       
+                       $queryString = implode( '&', $urlOptions );
+                       
+                       $url = SpecialPage::getTitleFor( 'Preferences' )->getFullURL( $queryString );
+                       global $wgOut;
+                       $wgOut->redirect( $url );
+               }
                
                return true;
        }
@@ -1145,6 +1218,8 @@ class PreferencesForm extends HTMLForm {
                
                $html .= "\n" . $sk->link( $t, wfMsg( 'restoreprefs' ) );
                
+               $html = Xml::tags( 'div', array( 'class' => 'mw-prefs-buttons' ), $html );
+               
                return $html;
        }