X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FSpecialPreferences.php;h=50d92125f5b48635b5ce6665ec79b9345b08d467;hb=396524f67413c69576cd84b3c29cfc1045c05718;hp=ec1a957e4fe153724303c3f3d830b4b187e24a6c;hpb=36ed0cd96c478292bacb9a01be47a15cd2e50301;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/SpecialPreferences.php b/includes/SpecialPreferences.php index ec1a957e4f..50d92125f5 100644 --- a/includes/SpecialPreferences.php +++ b/includes/SpecialPreferences.php @@ -1,8 +1,7 @@ mQuickbar = $request->getVal( 'wpQuickbar' ); $this->mOldpass = $request->getVal( 'wpOldpass' ); @@ -54,6 +52,7 @@ class PreferencesForm { $this->mUserVariant = $request->getVal( 'wpUserVariant' ); $this->mSearch = $request->getVal( 'wpSearch' ); $this->mRecent = $request->getVal( 'wpRecent' ); + $this->mRecentDays = $request->getVal( 'wpRecentDays' ); $this->mHourDiff = $request->getVal( 'wpHourDiff' ); $this->mSearchLines = $request->getVal( 'wpSearchLines' ); $this->mSearchChars = $request->getVal( 'wpSearchChars' ); @@ -170,7 +169,7 @@ class PreferencesForm { /** * Used to validate the user inputed timezone before saving it as - * 'timeciorrection', will return '00:00' if fed bogus data. + * 'timecorrection', will return '00:00' if fed bogus data. * Note: It's not a 100% correct implementation timezone-wise, it will * accept stuff like '14:30', * @access private @@ -206,32 +205,32 @@ class PreferencesForm { function savePreferences() { global $wgUser, $wgOut, $wgParser; global $wgEnableUserEmail, $wgEnableEmail; - global $wgEmailAuthentication, $wgMinimalPasswordLength; + global $wgEmailAuthentication; global $wgAuth; if ( '' != $this->mNewpass && $wgAuth->allowPasswordChange() ) { if ( $this->mNewpass != $this->mRetypePass ) { + wfRunHooks( "PrefsPasswordAudit", array( $wgUser, $this->mNewpass, 'badretype' ) ); $this->mainPrefsForm( 'error', wfMsg( 'badretype' ) ); return; } - if ( strlen( $this->mNewpass ) < $wgMinimalPasswordLength ) { - $this->mainPrefsForm( 'error', wfMsg( 'passwordtooshort', $wgMinimalPasswordLength ) ); - return; - } - if (!$wgUser->checkPassword( $this->mOldpass )) { + wfRunHooks( "PrefsPasswordAudit", array( $wgUser, $this->mNewpass, 'wrongpassword' ) ); $this->mainPrefsForm( 'error', wfMsg( 'wrongpassword' ) ); return; } - if (!$wgAuth->setPassword( $wgUser, $this->mNewpass )) { - $this->mainPrefsForm( 'error', wfMsg( 'externaldberror' ) ); + + try { + $wgUser->setPassword( $this->mNewpass ); + wfRunHooks( "PrefsPasswordAudit", array( $wgUser, $this->mNewpass, 'success' ) ); + $this->mNewpass = $this->mOldpass = $this->mRetypePass = ''; + } catch( PasswordError $e ) { + wfRunHooks( "PrefsPasswordAudit", array( $wgUser, $this->mNewpass, 'error' ) ); + $this->mainPrefsForm( 'error', $e->getMessage() ); return; } - $wgUser->setPassword( $this->mNewpass ); - $this->mNewpass = $this->mOldpass = $this->mRetypePass = ''; - } $wgUser->setRealName( $this->mRealName ); @@ -242,11 +241,18 @@ class PreferencesForm { } # Validate the signature and clean it up as needed - if( $this->mToggles['fancysig'] ) { + global $wgMaxSigChars; + if( mb_strlen( $this->mNick ) > $wgMaxSigChars ) { + global $wgLang; + $this->mainPrefsForm( 'error', + wfMsg( 'badsiglength', $wgLang->formatNum( $wgMaxSigChars ) ) ); + return; + } elseif( $this->mToggles['fancysig'] ) { if( Parser::validateSig( $this->mNick ) !== false ) { $this->mNick = $wgParser->cleanSig( $this->mNick ); } else { $this->mainPrefsForm( 'error', wfMsg( 'badsig' ) ); + return; } } else { // When no fancy sig used, make sure ~{3,5} get removed. @@ -267,6 +273,7 @@ class PreferencesForm { $wgUser->setOption( 'contextlines', $this->validateIntOrNull( $this->mSearchLines ) ); $wgUser->setOption( 'contextchars', $this->validateIntOrNull( $this->mSearchChars ) ); $wgUser->setOption( 'rclimit', $this->validateIntOrNull( $this->mRecent ) ); + $wgUser->setOption( 'rcdays', $this->validateInt( $this->mRecentDays, 1, 7 ) ); $wgUser->setOption( 'wllimit', $this->validateIntOrNull( $this->mWatchlistEdits, 0, 1000 ) ); $wgUser->setOption( 'rows', $this->validateInt( $this->mRows, 4, 1000 ) ); $wgUser->setOption( 'cols', $this->validateInt( $this->mCols, 4, 1000 ) ); @@ -325,6 +332,9 @@ class PreferencesForm { $wgUser->setCookies(); $wgUser->saveSettings(); } + if( $oldadr != $newadr ) { + wfRunHooks( "PrefsEmailAudit", array( $wgUser, $oldadr, $newadr ) ); + } } if( $needRedirect && $error === false ) { @@ -334,7 +344,6 @@ class PreferencesForm { } $wgOut->setParserOptions( ParserOptions::newFromUser( $wgUser ) ); - $po = ParserOptions::newFromUser( $wgUser ); $this->mainPrefsForm( $error === false ? 'success' : 'error', $error); } @@ -342,18 +351,16 @@ class PreferencesForm { * @access private */ function resetPrefs() { - global $wgUser, $wgLang, $wgContLang, $wgAllowRealName; + global $wgUser, $wgLang, $wgContLang, $wgContLanguageCode, $wgAllowRealName; $this->mOldpass = $this->mNewpass = $this->mRetypePass = ''; $this->mUserEmail = $wgUser->getEmail(); $this->mUserEmailAuthenticationtimestamp = $wgUser->getEmailAuthenticationtimestamp(); $this->mRealName = ($wgAllowRealName) ? $wgUser->getRealName() : ''; - $this->mUserLanguage = $wgUser->getOption( 'language' ); - if( empty( $this->mUserLanguage ) ) { - # Quick hack for conversions, where this value is blank - global $wgContLanguageCode; - $this->mUserLanguage = $wgContLanguageCode; - } + + # language value might be blank, default to content language + $this->mUserLanguage = $wgUser->getOption( 'language', $wgContLanguageCode ); + $this->mUserVariant = $wgUser->getOption( 'variant'); $this->mEmailFlag = $wgUser->getOption( 'disablemail' ) == 1 ? 1 : 0; $this->mNick = $wgUser->getOption( 'nickname' ); @@ -372,13 +379,13 @@ class PreferencesForm { $this->mImageSize = $wgUser->getOption( 'imagesize' ); $this->mThumbSize = $wgUser->getOption( 'thumbsize' ); $this->mRecent = $wgUser->getOption( 'rclimit' ); + $this->mRecentDays = $wgUser->getOption( 'rcdays' ); $this->mWatchlistEdits = $wgUser->getOption( 'wllimit' ); $this->mUnderline = $wgUser->getOption( 'underline' ); $this->mWatchlistDays = $wgUser->getOption( 'watchlistdays' ); $togs = User::getToggles(); foreach ( $togs as $tname ) { - $ttext = wfMsg('tog-'.$tname); $this->mToggles[$tname] = $wgUser->getOption( $tname ); } @@ -448,6 +455,38 @@ class PreferencesForm { return "$td1$td2"; } + /** + * Helper function for user information panel + * @param $td1 label for an item + * @param $td2 item or null + * @param $td3 optional help or null + * @return xhtml block + */ + function tableRow( $td1, $td2 = null, $td3 = null ) { + global $wgContLang; + + $align['align'] = $wgContLang->isRtl() ? 'right' : 'left'; + + if ( is_null( $td3 ) ) { + $td3 = ''; + } else { + $td3 = Xml::tags( 'tr', null, + Xml::tags( 'td', array( 'colspan' => '2' ), $td3 ) + ); + } + + if ( is_null( $td2 ) ) { + $td1 = Xml::tags( 'td', $align + array( 'colspan' => '2' ), $td1 ); + $td2 = ''; + } else { + $td1 = Xml::tags( 'td', $align, $td1 ); + $td2 = Xml::tags( 'td', $align, $td2 ); + } + + return Xml::tags( 'tr', null, $td1 . $td2 ). $td3 . "\n"; + + } + /** * @access private */ @@ -464,6 +503,8 @@ class PreferencesForm { $wgOut->setArticleRelated( false ); $wgOut->setRobotpolicy( 'noindex,nofollow' ); + $wgOut->disallowUserJs(); # Prevent hijacked user scripts from sniffing passwords etc. + if ( $this->mSuccess || 'success' == $status ) { $wgOut->addWikitext( '
'. wfMsg( 'savedprefs' ) . '
' ); } else if ( 'error' == $status ) { @@ -488,14 +529,10 @@ class PreferencesForm { $this->mUsedToggles[ 'enotifusertalkpages' ] = true; $this->mUsedToggles[ 'enotifminoredits' ] = true; $this->mUsedToggles[ 'enotifrevealaddr' ] = true; + $this->mUsedToggles[ 'ccmeonemails' ] = true; $this->mUsedToggles[ 'uselivepreview' ] = true; - # Enotif - # - $this->mUserEmail = htmlspecialchars( $this->mUserEmail ); - $this->mRealName = htmlspecialchars( $this->mRealName ); - $rawNick = $this->mNick; - $this->mNick = htmlspecialchars( $this->mNick ); + if ( !$this->mEmailFlag ) { $emfc = 'checked="checked"'; } else { $emfc = ''; } @@ -526,8 +563,6 @@ class PreferencesForm { $enotifusertalkpages = ($wgEnotifUserTalk) ? $this->getToggle( 'enotifusertalkpages', false, $disableEmailPrefs ) : ''; $enotifminoredits = ($wgEnotifWatchlist && $wgEnotifMinorEdits) ? $this->getToggle( 'enotifminoredits', false, $disableEmailPrefs ) : ''; $enotifrevealaddr = (($wgEnotifWatchlist || $wgEnotifUserTalk) && $wgEnotifRevealEditorAddress) ? $this->getToggle( 'enotifrevealaddr', false, $disableEmailPrefs ) : ''; - $prefs_help_email_enotif = ( $wgEnotifWatchlist || $wgEnotifUserTalk) ? ' ' . wfMsg('prefs-help-email-enotif') : ''; - $prefs_help_realname = ''; # @@ -535,94 +570,81 @@ class PreferencesForm { $wgOut->addHTML( "
" ); # User data - # - - $wgOut->addHTML( "
\n" . wfMsg('prefs-personal') . "\n\n"); $wgOut->addHTML( - $this->addRow( - wfMsg( 'username'), - $wgUser->getName() - ) + Xml::openElement( 'fieldset ' ) . + Xml::element( 'legend', null, wfMsg('prefs-personal') ) . + Xml::openElement( 'table' ) . + $this->tableRow( Xml::element( 'h2', null, wfMsg( 'prefs-personal' ) ) ) ); - $wgOut->addHTML( - $this->addRow( - wfMsg( 'uid' ), - $wgUser->getID() - ) - ); + $userInformationHtml = + $this->tableRow( wfMsgHtml( 'username' ), htmlspecialchars( $wgUser->getName() ) ) . + $this->tableRow( wfMsgHtml( 'uid' ), htmlspecialchars( $wgUser->getID() ) ); + if( wfRunHooks( 'PreferencesUserInformationPanel', array( $this, &$userInformationHtml ) ) ) { + $wgOut->addHtml( $userInformationHtml ); + } - if ($wgAllowRealName) { + if ( $wgAllowRealName ) { $wgOut->addHTML( - $this->addRow( - '', - "mRealName}\" size='25' />" + $this->tableRow( + Xml::label( wfMsg('yourrealname'), 'wpRealName' ), + Xml::input( 'wpRealName', 25, $this->mRealName, array( 'id' => 'wpRealName' ) ), + Xml::tags('div', array( 'class' => 'prefsectiontip' ), + wfMsgExt( 'prefs-help-realname', 'parseinline' ) + ) ) ); } - if ($wgEnableEmail) { + if ( $wgEnableEmail ) { $wgOut->addHTML( - $this->addRow( - '', - "mUserEmail}\" size='25' />" + $this->tableRow( + Xml::label( wfMsg('youremail'), 'wpUserEmail' ), + Xml::input( 'wpUserEmail', 25, $this->mUserEmail, array( 'id' => 'wpUserEmail' ) ), + Xml::tags('div', array( 'class' => 'prefsectiontip' ), + wfMsgExt( 'prefs-help-email', 'parseinline' ) + ) ) ); } - global $wgParser; - if( !empty( $this->mToggles['fancysig'] ) && - false === $wgParser->validateSig( $rawNick ) ) { - $invalidSig = $this->addRow( + global $wgParser, $wgMaxSigChars; + if( mb_strlen( $this->mNick ) > $wgMaxSigChars ) { + $invalidSig = $this->tableRow( ' ', - '' . wfMsgHtml( 'badsig' ) . '' + Xml::element( 'span', array( 'class' => 'error' ), + wfMsg( 'badsiglength', $wgLang->formatNum( $wgMaxSigChars ) ) ) + ); + } elseif( !empty( $this->mToggles['fancysig'] ) && + false === $wgParser->validateSig( $this->mNick ) ) { + $invalidSig = $this->tableRow( + ' ', + Xml::element( 'span', array( 'class' => 'error' ), wfMsg( 'badsig' ) ) ); } else { $invalidSig = ''; } $wgOut->addHTML( - $this->addRow( - '', - "mNick}\" size='25' />" + $this->tableRow( + Xml::label( wfMsg( 'yournick' ), 'wpNick' ), + Xml::input( 'wpNick', 25, $this->mNick, + array( + 'id' => 'wpNick', + // Note: $wgMaxSigChars is enforced in Unicode characters, + // both on the backend and now in the browser. + // Badly-behaved requests may still try to submit + // an overlong string, however. + 'maxlength' => $wgMaxSigChars ) ) ) . $invalidSig . - # FIXME: The part should be where the   is, getToggle() needs - # to be changed to out return its output in two parts. -ævar - $this->addRow( - ' ', - $this->getToggle( 'fancysig' ) - ) + $this->tableRow( ' ', $this->getToggle( 'fancysig' ) ) ); - /** - * Make sure the site language is in the list; a custom language code - * might not have a defined name... - */ - $languages = $wgLang->getLanguageNames( true ); - if( !array_key_exists( $wgContLanguageCode, $languages ) ) { - $languages[$wgContLanguageCode] = $wgContLanguageCode; - } - ksort( $languages ); - - /** - * If a bogus value is set, default to the content language. - * Otherwise, no default is selected and the user ends up - * with an Afrikaans interface since it's first in the list. - */ - $selectedLang = isset( $languages[$this->mUserLanguage] ) ? $this->mUserLanguage : $wgContLanguageCode; - $selbox = null; - foreach($languages as $code => $name) { - global $IP; - $sel = ($code == $selectedLang)? ' selected="selected"' : ''; - $selbox .= "\n"; - } + list( $lsLabel, $lsSelect) = Xml::languageSelector( $this->mUserLanguage ); $wgOut->addHTML( - $this->addRow( - '', - "" - ) + $this->tableRow( $lsLabel, $lsSelect ) ); /* see if there are multiple language variants to choose from*/ @@ -630,6 +652,7 @@ class PreferencesForm { $variants = $wgContLang->getVariants(); $variantArray = array(); + $languages = Language::getLanguageNames( true ); foreach($variants as $v) { $v = str_replace( '_', '-', strtolower($v)); if( array_key_exists( $v, $languages ) ) { @@ -638,75 +661,82 @@ class PreferencesForm { } } - $selbox = null; - foreach($variantArray as $code => $name) { - $sel = $code == $this->mUserVariant ? 'selected="selected"' : ''; - $selbox .= ""; + $options = "\n"; + foreach( $variantArray as $code => $name ) { + $selected = ($code == $this->mUserVariant); + $options .= Xml::option( "$code - $name", $code, $selected ) . "\n"; } if(count($variantArray) > 1) { $wgOut->addHtml( - $this->addRow( wfMsg( 'yourvariant' ), "" ) + $this->tableRow( + Xml::label( wfMsg( 'yourvariant' ), 'wpUserVariant' ), + Xml::tags( 'select', + array( 'name' => 'wpUserVariant', 'id' => 'wpUserVariant' ), + $options + ) + ) ); } } - $wgOut->addHTML('
'); # Password - if( $wgAuth->allowPasswordChange() ) { - $this->mOldpass = htmlspecialchars( $this->mOldpass ); - $this->mNewpass = htmlspecialchars( $this->mNewpass ); - $this->mRetypePass = htmlspecialchars( $this->mRetypePass ); - - $wgOut->addHTML( '
' . wfMsg( 'changepassword' ) . ''); + if( $wgAuth->allowPasswordChange() ) { $wgOut->addHTML( - $this->addRow( - '', - "mOldpass}\" size='20' />" + $this->tableRow( Xml::element( 'h2', null, wfMsg( 'changepassword' ) ) ) . + $this->tableRow( + Xml::label( wfMsg( 'oldpassword' ), 'wpOldpass' ), + Xml::password( 'wpOldpass', 25, $this->mOldpass, array( 'id' => 'wpOldpass' ) ) ) . - $this->addRow( - '', - "mNewpass}\" size='20' />" + $this->tableRow( + Xml::label( wfMsg( 'newpassword' ), 'wpNewpass' ), + Xml::password( 'wpNewpass', 25, $this->mNewpass, array( 'id' => 'wpNewpass' ) ) ) . - $this->addRow( - '', - "mRetypePass}\" size='20' />" + $this->tableRow( + Xml::label( wfMsg( 'retypenew' ), 'wpRetypePass' ), + Xml::password( 'wpRetypePass', 25, $this->mRetypePass, array( 'id' => 'wpRetypePass' ) ) ) . - "
\n" . - $this->getToggle( "rememberpassword" ) . "
\n\n" ); + Xml::tags( 'tr', null, + Xml::tags( 'td', array( 'colspan' => '2' ), + $this->getToggle( "rememberpassword" ) + ) + ) + ); } # # Enotif - if ($wgEnableEmail) { - $wgOut->addHTML( '
' . wfMsg( 'email' ) . '' ); + if ( $wgEnableEmail ) { + + $moreEmail = ''; + if ($wgEnableUserEmail) { + $emf = wfMsg( 'allowemail' ); + $disabled = $disableEmailPrefs ? ' disabled="disabled"' : ''; + $moreEmail = + " "; + } + + $wgOut->addHTML( + $this->tableRow( Xml::element( 'h2', null, wfMsg( 'email' ) ) ) . + $this->tableRow( $emailauthenticated. $enotifrevealaddr. $enotifwatchlistpages. $enotifusertalkpages. - $enotifminoredits ); - if ($wgEnableUserEmail) { - $emf = wfMsg( 'allowemail' ); - $disabled = $disableEmailPrefs ? ' disabled="disabled"' : ''; - $wgOut->addHTML( - "
" ); - } - - $wgOut->addHTML( '
' ); + $enotifminoredits. + $moreEmail. + $this->getToggle( 'ccmeonemails' ) + ) + ); } #
- # Show little "help" tips for the real name and email address options - if( $wgAllowRealName || $wgEnableEmail ) { - if( $wgAllowRealName ) - $tips[] = wfMsg( 'prefs-help-realname' ); - if( $wgEnableEmail ) - $tips[] = wfMsg( 'prefs-help-email' ); - $wgOut->addHtml( '
' . implode( '
', $tips ) . '
' ); - } + $wgOut->addHTML( + Xml::closeElement( 'table' ) . + Xml::closeElement( 'fieldset' ) + ); - $wgOut->addHTML( '
' ); # Quickbar # @@ -760,32 +790,53 @@ class PreferencesForm { if( $wgUseTeX ) { $wgOut->addHTML( "
\n" . wfMsg('math') . '' ); foreach ( $mathopts as $k => $v ) { - $checked = $k == $this->mMath ? ' checked="checked"' : ''; - $wgOut->addHTML( "
\n" ); + $checked = ($k == $this->mMath); + $wgOut->addHTML( + Xml::openElement( 'div' ) . + Xml::radioLabel( wfMsg( $v ), 'wpMath', $k, "mw-sp-math-$k", $checked ) . + Xml::closeElement( 'div' ) . "\n" + ); } $wgOut->addHTML( "
\n\n" ); } # Files # - $wgOut->addHTML("
- " . wfMsg( 'files' ) . " -
-
\n\n"); + + $thumbSizeId = 'wpThumbSize'; + $wgOut->addHTML( + "
" . Xml::label( wfMsg('thumbsize'), $thumbSizeId ) . " " . + Xml::openElement( 'select', array( 'name' => $thumbSizeId, 'id' => $thumbSizeId ) ) . + $imageThumbOptions . + Xml::closeElement( 'select' ) . "
\n" + ); + + $wgOut->addHTML( "\n\n" ); # Date format # @@ -829,7 +880,7 @@ class PreferencesForm { # Editing # - global $wgLivePreview, $wgUseRCPatrol; + global $wgLivePreview; $wgOut->addHTML( '
' . wfMsg( 'textboxsize' ) . '
' . wfInputLabel( wfMsg( 'rows' ), 'wpRows', 'wpRows', 3, $this->mRows ) . @@ -844,39 +895,60 @@ class PreferencesForm { 'showtoolbar', 'previewonfirst', 'previewontop', - 'watchcreations', - 'watchdefault', 'minordefault', 'externaleditor', 'externaldiff', $wgLivePreview ? 'uselivepreview' : false, - $wgUser->isAllowed( 'patrol' ) && $wgUseRCPatrol ? 'autopatrol' : false, 'forceeditsummary', ) ) . '
' ); - $this->mUsedToggles['autopatrol'] = true; # Don't show this up for users who can't; the handler below is dumb and doesn't know it - $wgOut->addHTML( '
' . htmlspecialchars(wfMsg('prefs-rc')) . '' . - wfInputLabel( wfMsg( 'recentchangescount' ), - 'wpRecent', 'wpRecent', 3, $this->mRecent ) . - $this->getToggles( array( - 'hideminor', - $wgRCShowWatchingUsers ? 'shownumberswatching' : false, - 'usenewrc' ) - ) . '
' - ); + # Recent changes + $wgOut->addHtml( '
' . wfMsgHtml( 'prefs-rc' ) . '' ); + + $rc = ''; + $rc .= ''; + $rc .= ''; + $rc .= ''; + $rc .= ''; + $rc .= ''; + $rc .= '
' . Xml::label( wfMsg( 'recentchangesdays' ), 'wpRecentDays' ) . '' . Xml::input( 'wpRecentDays', 3, $this->mRecentDays, array( 'id' => 'wpRecentDays' ) ) . '
' . Xml::label( wfMsg( 'recentchangescount' ), 'wpRecent' ) . '' . Xml::input( 'wpRecent', 3, $this->mRecent, array( 'id' => 'wpRecent' ) ) . '
'; + $wgOut->addHtml( $rc ); + + $wgOut->addHtml( '
' ); + + $toggles[] = 'hideminor'; + if( $wgRCShowWatchingUsers ) + $toggles[] = 'shownumberswatching'; + $toggles[] = 'usenewrc'; + $wgOut->addHtml( $this->getToggles( $toggles ) ); + + $wgOut->addHtml( '
' ); # Watchlist - $wgOut->addHTML( '
' . wfMsgHtml( 'prefs-watchlist' ) . '' ); - - $wgOut->addHTML( wfInputLabel( wfMsg( 'prefs-watchlist-days' ), - 'wpWatchlistDays', 'wpWatchlistDays', 3, $this->mWatchlistDays ) ); - $wgOut->addHTML( '

' ); # Spacing - $wgOut->addHTML( $this->getToggles( array( 'watchlisthideown', 'watchlisthidebots', 'extendwatchlist' ) ) ); - $wgOut->addHTML( wfInputLabel( wfMsg( 'prefs-watchlist-edits' ), - 'wpWatchlistEdits', 'wpWatchlistEdits', 3, $this->mWatchlistEdits ) ); - - $wgOut->addHTML( '
' ); + $wgOut->addHtml( '
' . wfMsgHtml( 'prefs-watchlist' ) . '' ); + + $wgOut->addHtml( wfInputLabel( wfMsg( 'prefs-watchlist-days' ), 'wpWatchlistDays', 'wpWatchlistDays', 3, $this->mWatchlistDays ) ); + $wgOut->addHtml( '

' ); + + $wgOut->addHtml( $this->getToggle( 'extendwatchlist' ) ); + $wgOut->addHtml( wfInputLabel( wfMsg( 'prefs-watchlist-edits' ), 'wpWatchlistEdits', 'wpWatchlistEdits', 3, $this->mWatchlistEdits ) ); + $wgOut->addHtml( '

' ); + + $wgOut->addHtml( $this->getToggles( array( 'watchlisthideown', 'watchlisthidebots', 'watchlisthideminor' ) ) ); + + if( $wgUser->isAllowed( 'createpage' ) || $wgUser->isAllowed( 'createtalk' ) ) + $wgOut->addHtml( $this->getToggle( 'watchcreations' ) ); + foreach( array( 'edit' => 'watchdefault', 'move' => 'watchmoves', 'delete' => 'watchdeletion' ) as $action => $toggle ) { + if( $wgUser->isAllowed( $action ) ) + $wgOut->addHtml( $this->getToggle( $toggle ) ); + } + $this->mUsedToggles['watchcreations'] = true; + $this->mUsedToggles['watchdefault'] = true; + $this->mUsedToggles['watchmoves'] = true; + $this->mUsedToggles['watchdeletion'] = true; + + $wgOut->addHtml( '
' ); # Search $wgOut->addHTML( '
' . wfMsg( 'searchresultshead' ) . '' . @@ -897,8 +969,8 @@ class PreferencesForm { # Misc # $wgOut->addHTML('
' . wfMsg('prefs-misc') . ''); - $wgOut->addHTML( wfInputLabel( wfMsg( 'stubthreshold' ), - 'wpStubs', 'wpStubs', 6, $this->mStubs ) ); + $wgOut->addHtml( ' ' ); + $wgOut->addHtml( Xml::input( 'wpStubs', 6, $this->mStubs, array( 'id' => 'wpStubs' ) ) ); $msgUnderline = htmlspecialchars( wfMsg ( 'tog-underline' ) ); $msgUnderlinenever = htmlspecialchars( wfMsg ( 'underline-never' ) ); $msgUnderlinealways = htmlspecialchars( wfMsg ( 'underline-always' ) ); @@ -908,14 +980,13 @@ class PreferencesForm { $s1 = $uopt == 1 ? ' selected="selected"' : ''; $s2 = $uopt == 2 ? ' selected="selected"' : ''; $wgOut->addHTML(" -
+

-

-"); +

"); + foreach ( $togs as $tname ) { if( !array_key_exists( $tname, $this->mUsedToggles ) ) { $wgOut->addHTML( $this->getToggle( $tname ) ); @@ -923,22 +994,24 @@ class PreferencesForm { } $wgOut->addHTML( '
' ); - $token = $wgUser->editToken(); + $token = htmlspecialchars( $wgUser->editToken() ); + $skin = $wgUser->getSkin(); $wgOut->addHTML( "
- + tooltipAndAccesskey('save')." />
- + \n" ); - $wgOut->addWikiText( '
' . wfMsg('clearyourcache') . '
' ); + $wgOut->addHtml( Xml::tags( 'div', array( 'class' => "prefcache" ), + wfMsgExt( 'clearyourcache', 'parseinline' ) ) + ); } } -?> +