2009-04-24 01:31:17 +00:00
|
|
|
|
<?php
|
2012-05-11 08:34:29 +00:00
|
|
|
|
/**
|
2013-03-13 07:42:41 +00:00
|
|
|
|
* Form to edit user preferences.
|
2012-05-11 08:34:29 +00:00
|
|
|
|
*
|
|
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
|
|
* (at your option) any later version.
|
|
|
|
|
|
*
|
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
|
*
|
|
|
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
|
|
* http://www.gnu.org/copyleft/gpl.html
|
|
|
|
|
|
*
|
|
|
|
|
|
* @file
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
2009-07-31 10:42:34 +00:00
|
|
|
|
/**
|
2009-08-23 20:09:59 +00:00
|
|
|
|
* We're now using the HTMLForm object with some customisation to generate the
|
|
|
|
|
|
* Preferences form. This object handles generic submission, CSRF protection,
|
|
|
|
|
|
* layout and other logic in a reusable manner. We subclass it as a PreferencesForm
|
|
|
|
|
|
* to make some minor customisations.
|
|
|
|
|
|
*
|
|
|
|
|
|
* In order to generate the form, the HTMLForm object needs an array structure
|
|
|
|
|
|
* detailing the form fields available, and that's what this class is for. Each
|
|
|
|
|
|
* element of the array is a basic property-list, including the type of field,
|
|
|
|
|
|
* the label it is to be given in the form, callbacks for validation and
|
|
|
|
|
|
* 'filtering', and other pertinent information. Note that the 'default' field
|
|
|
|
|
|
* is named for generic forms, and does not represent the preference's default
|
|
|
|
|
|
* (which is stored in $wgDefaultUserOptions), but the default for the form
|
|
|
|
|
|
* field, which should be whatever the user has set for that preference. There
|
|
|
|
|
|
* is no need to override it unless you have some special storage logic (for
|
|
|
|
|
|
* instance, those not presently stored as options, but which are best set from
|
|
|
|
|
|
* the user preferences view).
|
|
|
|
|
|
*
|
|
|
|
|
|
* Field types are implemented as subclasses of the generic HTMLFormField
|
|
|
|
|
|
* object, and typically implement at least getInputHTML, which generates the
|
|
|
|
|
|
* HTML for the input field to be placed in the table.
|
|
|
|
|
|
*
|
|
|
|
|
|
* Once fields have been retrieved and validated, submission logic is handed
|
|
|
|
|
|
* over to the tryUISubmit static method of this class.
|
|
|
|
|
|
*/
|
2009-04-24 01:31:17 +00:00
|
|
|
|
class Preferences {
|
|
|
|
|
|
static $defaultPreferences = null;
|
2010-04-15 18:36:12 +00:00
|
|
|
|
static $saveFilters = array(
|
2009-04-24 01:31:17 +00:00
|
|
|
|
'timecorrection' => array( 'Preferences', 'filterTimezoneInput' ),
|
2012-01-25 18:26:46 +00:00
|
|
|
|
'cols' => array( 'Preferences', 'filterIntval' ),
|
2010-12-12 15:38:54 +00:00
|
|
|
|
'rows' => array( 'Preferences', 'filterIntval' ),
|
|
|
|
|
|
'rclimit' => array( 'Preferences', 'filterIntval' ),
|
|
|
|
|
|
'wllimit' => array( 'Preferences', 'filterIntval' ),
|
|
|
|
|
|
'searchlimit' => array( 'Preferences', 'filterIntval' ),
|
2010-04-15 18:36:12 +00:00
|
|
|
|
);
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2013-06-10 19:30:43 +00:00
|
|
|
|
// Stuff that shouldn't be saved as a preference.
|
|
|
|
|
|
private static $saveBlacklist = array(
|
|
|
|
|
|
'realname',
|
|
|
|
|
|
'emailaddress',
|
|
|
|
|
|
);
|
|
|
|
|
|
|
2011-04-19 11:03:40 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @throws MWException
|
|
|
|
|
|
* @param $user User
|
2012-01-13 02:40:09 +00:00
|
|
|
|
* @param $context IContextSource
|
2011-04-19 11:03:40 +00:00
|
|
|
|
* @return array|null
|
|
|
|
|
|
*/
|
2012-01-13 02:40:09 +00:00
|
|
|
|
static function getPreferences( $user, IContextSource $context ) {
|
2011-04-19 11:03:40 +00:00
|
|
|
|
if ( self::$defaultPreferences ) {
|
2009-04-24 01:31:17 +00:00
|
|
|
|
return self::$defaultPreferences;
|
2011-04-19 11:03:40 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$defaultPreferences = array();
|
2009-04-27 02:52:33 +00:00
|
|
|
|
|
2011-10-09 11:43:06 +00:00
|
|
|
|
self::profilePreferences( $user, $context, $defaultPreferences );
|
|
|
|
|
|
self::skinPreferences( $user, $context, $defaultPreferences );
|
|
|
|
|
|
self::filesPreferences( $user, $context, $defaultPreferences );
|
|
|
|
|
|
self::datetimePreferences( $user, $context, $defaultPreferences );
|
|
|
|
|
|
self::renderingPreferences( $user, $context, $defaultPreferences );
|
|
|
|
|
|
self::editingPreferences( $user, $context, $defaultPreferences );
|
|
|
|
|
|
self::rcPreferences( $user, $context, $defaultPreferences );
|
|
|
|
|
|
self::watchlistPreferences( $user, $context, $defaultPreferences );
|
|
|
|
|
|
self::searchPreferences( $user, $context, $defaultPreferences );
|
|
|
|
|
|
self::miscPreferences( $user, $context, $defaultPreferences );
|
2009-05-17 00:09:30 +00:00
|
|
|
|
|
2009-04-27 02:52:33 +00:00
|
|
|
|
wfRunHooks( 'GetPreferences', array( $user, &$defaultPreferences ) );
|
2009-05-17 00:09:30 +00:00
|
|
|
|
|
2009-05-19 17:07:46 +00:00
|
|
|
|
## Remove preferences that wikis don't want to use
|
|
|
|
|
|
global $wgHiddenPrefs;
|
|
|
|
|
|
foreach ( $wgHiddenPrefs as $pref ) {
|
|
|
|
|
|
if ( isset( $defaultPreferences[$pref] ) ) {
|
2009-06-21 14:16:11 +00:00
|
|
|
|
unset( $defaultPreferences[$pref] );
|
2009-05-19 17:07:46 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2012-11-01 21:07:37 +00:00
|
|
|
|
## Make sure that form fields have their parent set. See bug 41337.
|
|
|
|
|
|
$dummyForm = new HTMLForm( array(), $context );
|
|
|
|
|
|
|
2013-06-10 19:30:43 +00:00
|
|
|
|
$disable = !$user->isAllowed( 'editmyoptions' );
|
|
|
|
|
|
|
2009-04-27 02:52:33 +00:00
|
|
|
|
## Prod in defaults from the user
|
2010-04-15 18:36:12 +00:00
|
|
|
|
foreach ( $defaultPreferences as $name => &$info ) {
|
2009-04-27 02:52:33 +00:00
|
|
|
|
$prefFromUser = self::getOptionFromUser( $name, $info, $user );
|
2013-06-10 19:30:43 +00:00
|
|
|
|
if ( $disable && !in_array( $name, self::$saveBlacklist ) ) {
|
|
|
|
|
|
$info['disabled'] = 'disabled';
|
|
|
|
|
|
}
|
2010-12-15 21:14:36 +00:00
|
|
|
|
$field = HTMLForm::loadInputFromParameters( $name, $info ); // For validation
|
2012-11-01 21:07:37 +00:00
|
|
|
|
$field->mParent = $dummyForm;
|
2009-06-09 17:32:33 +00:00
|
|
|
|
$defaultOptions = User::getDefaultOptions();
|
2009-06-21 14:16:11 +00:00
|
|
|
|
$globalDefault = isset( $defaultOptions[$name] )
|
2010-04-15 18:36:12 +00:00
|
|
|
|
? $defaultOptions[$name]
|
|
|
|
|
|
: null;
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-27 02:52:33 +00:00
|
|
|
|
// If it validates, set it as the default
|
2009-06-21 14:16:11 +00:00
|
|
|
|
if ( isset( $info['default'] ) ) {
|
2009-04-27 02:52:33 +00:00
|
|
|
|
// Already set, no problem
|
|
|
|
|
|
continue;
|
|
|
|
|
|
} elseif ( !is_null( $prefFromUser ) && // Make sure we're not just pulling nothing
|
2012-02-16 00:54:34 +00:00
|
|
|
|
$field->validate( $prefFromUser, $user->getOptions() ) === true ) {
|
2009-04-27 02:52:33 +00:00
|
|
|
|
$info['default'] = $prefFromUser;
|
2012-02-16 00:54:34 +00:00
|
|
|
|
} elseif ( $field->validate( $globalDefault, $user->getOptions() ) === true ) {
|
2009-04-27 02:52:33 +00:00
|
|
|
|
$info['default'] = $globalDefault;
|
2009-06-03 09:38:36 +00:00
|
|
|
|
} else {
|
2009-07-09 01:03:57 +00:00
|
|
|
|
throw new MWException( "Global default '$globalDefault' is invalid for field $name" );
|
2009-04-27 02:52:33 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-27 02:52:33 +00:00
|
|
|
|
self::$defaultPreferences = $defaultPreferences;
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-27 02:52:33 +00:00
|
|
|
|
return $defaultPreferences;
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-04-19 11:03:40 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Pull option from a user account. Handles stuff like array-type preferences.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param $name
|
|
|
|
|
|
* @param $info
|
|
|
|
|
|
* @param $user User
|
|
|
|
|
|
* @return array|String
|
|
|
|
|
|
*/
|
2009-04-27 02:52:33 +00:00
|
|
|
|
static function getOptionFromUser( $name, $info, $user ) {
|
|
|
|
|
|
$val = $user->getOption( $name );
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2013-02-14 02:05:13 +00:00
|
|
|
|
// Handling for multiselect preferences
|
2009-06-21 14:16:11 +00:00
|
|
|
|
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;
|
2009-04-27 02:52:33 +00:00
|
|
|
|
$val = array();
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2010-10-14 20:53:04 +00:00
|
|
|
|
foreach ( $options as $value ) {
|
2010-04-15 18:36:12 +00:00
|
|
|
|
if ( $user->getOption( "$prefix$value" ) ) {
|
2009-04-27 02:52:33 +00:00
|
|
|
|
$val[] = $value;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2013-02-14 02:05:13 +00:00
|
|
|
|
// Handling for checkmatrix preferences
|
|
|
|
|
|
if ( ( isset( $info['type'] ) && $info['type'] == 'checkmatrix' ) ||
|
|
|
|
|
|
( isset( $info['class'] ) && $info['class'] == 'HTMLCheckMatrix' ) ) {
|
|
|
|
|
|
$columns = HTMLFormField::flattenOptions( $info['columns'] );
|
|
|
|
|
|
$rows = HTMLFormField::flattenOptions( $info['rows'] );
|
|
|
|
|
|
$prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
|
|
|
|
|
|
$val = array();
|
|
|
|
|
|
|
|
|
|
|
|
foreach ( $columns as $column ) {
|
|
|
|
|
|
foreach ( $rows as $row ) {
|
2013-05-22 20:15:40 +00:00
|
|
|
|
if ( $user->getOption( "$prefix$column-$row" ) ) {
|
2013-02-14 02:05:13 +00:00
|
|
|
|
$val[] = "$column-$row";
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2009-04-27 02:52:33 +00:00
|
|
|
|
return $val;
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-04-19 11:03:40 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @param $user User
|
2012-01-13 02:40:09 +00:00
|
|
|
|
* @param $context IContextSource
|
2011-04-19 11:03:40 +00:00
|
|
|
|
* @param $defaultPreferences
|
2012-01-12 19:41:18 +00:00
|
|
|
|
* @return void
|
2011-04-19 11:03:40 +00:00
|
|
|
|
*/
|
2012-01-13 02:40:09 +00:00
|
|
|
|
static function profilePreferences( $user, IContextSource $context, &$defaultPreferences ) {
|
2011-10-09 11:43:06 +00:00
|
|
|
|
global $wgAuth, $wgContLang, $wgParser, $wgCookieExpiration, $wgLanguageCode,
|
|
|
|
|
|
$wgDisableTitleConversion, $wgDisableLangConversion, $wgMaxSigChars,
|
|
|
|
|
|
$wgEnableEmail, $wgEmailConfirmToEdit, $wgEnableUserEmail, $wgEmailAuthentication,
|
2013-02-01 17:25:53 +00:00
|
|
|
|
$wgEnotifWatchlist, $wgEnotifUserTalk, $wgEnotifRevealEditorAddress,
|
|
|
|
|
|
$wgSecureLogin;
|
2011-10-09 11:43:06 +00:00
|
|
|
|
|
2012-12-02 21:31:30 +00:00
|
|
|
|
// retrieving user name for GENDER and misc.
|
|
|
|
|
|
$userName = $user->getName();
|
|
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
## User info #####################################
|
|
|
|
|
|
// Information panel
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['username'] = array(
|
|
|
|
|
|
'type' => 'info',
|
2012-12-02 21:31:30 +00:00
|
|
|
|
'label-message' => array( 'username', $userName ),
|
|
|
|
|
|
'default' => $userName,
|
2010-04-15 18:36:12 +00:00
|
|
|
|
'section' => 'personal/info',
|
|
|
|
|
|
);
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['userid'] = array(
|
|
|
|
|
|
'type' => 'info',
|
2012-12-02 21:31:30 +00:00
|
|
|
|
'label-message' => array( 'uid', $userName ),
|
2010-04-15 18:36:12 +00:00
|
|
|
|
'default' => $user->getId(),
|
|
|
|
|
|
'section' => 'personal/info',
|
|
|
|
|
|
);
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
# Get groups to which the user belongs
|
|
|
|
|
|
$userEffectiveGroups = $user->getEffectiveGroups();
|
2009-07-28 15:10:42 +00:00
|
|
|
|
$userGroups = $userMembers = array();
|
2010-04-15 18:36:12 +00:00
|
|
|
|
foreach ( $userEffectiveGroups as $ueg ) {
|
|
|
|
|
|
if ( $ueg == '*' ) {
|
2009-04-24 01:31:17 +00:00
|
|
|
|
// Skip the default * group, seems useless here
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
2013-03-07 16:50:43 +00:00
|
|
|
|
$groupName = User::getGroupName( $ueg );
|
2009-07-28 15:10:42 +00:00
|
|
|
|
$userGroups[] = User::makeGroupLinkHTML( $ueg, $groupName );
|
|
|
|
|
|
|
2012-12-02 21:31:30 +00:00
|
|
|
|
$memberName = User::getGroupMember( $ueg, $userName );
|
2009-07-28 15:10:42 +00:00
|
|
|
|
$userMembers[] = User::makeGroupLinkHTML( $ueg, $memberName );
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
2009-07-28 15:10:42 +00:00
|
|
|
|
asort( $userGroups );
|
|
|
|
|
|
asort( $userMembers );
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-11-21 16:13:21 +00:00
|
|
|
|
$lang = $context->getLanguage();
|
2011-10-09 11:43:06 +00:00
|
|
|
|
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['usergroups'] = array(
|
|
|
|
|
|
'type' => 'info',
|
2011-10-09 11:43:06 +00:00
|
|
|
|
'label' => $context->msg( 'prefs-memberingroups' )->numParams(
|
2012-12-02 21:31:30 +00:00
|
|
|
|
count( $userGroups ) )->params( $userName )->parse(),
|
2011-10-09 11:43:06 +00:00
|
|
|
|
'default' => $context->msg( 'prefs-memberingroups-type',
|
|
|
|
|
|
$lang->commaList( $userGroups ),
|
|
|
|
|
|
$lang->commaList( $userMembers )
|
|
|
|
|
|
)->plain(),
|
2010-04-15 18:36:12 +00:00
|
|
|
|
'raw' => true,
|
|
|
|
|
|
'section' => 'personal/info',
|
|
|
|
|
|
);
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2013-05-24 19:04:52 +00:00
|
|
|
|
$editCount = Linker::link( SpecialPage::getTitleFor( "Contributions", $userName ),
|
|
|
|
|
|
$lang->formatNum( $user->getEditCount() ) );
|
|
|
|
|
|
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['editcount'] = array(
|
|
|
|
|
|
'type' => 'info',
|
2013-05-24 19:04:52 +00:00
|
|
|
|
'raw' => true,
|
2010-04-15 18:36:12 +00:00
|
|
|
|
'label-message' => 'prefs-edits',
|
2013-05-24 19:04:52 +00:00
|
|
|
|
'default' => $editCount,
|
2010-04-15 18:36:12 +00:00
|
|
|
|
'section' => 'personal/info',
|
|
|
|
|
|
);
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2010-04-15 18:36:12 +00:00
|
|
|
|
if ( $user->getRegistration() ) {
|
2011-12-19 18:19:03 +00:00
|
|
|
|
$displayUser = $context->getUser();
|
|
|
|
|
|
$userRegistration = $user->getRegistration();
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['registrationdate'] = array(
|
|
|
|
|
|
'type' => 'info',
|
|
|
|
|
|
'label-message' => 'prefs-registration',
|
2011-10-09 11:43:06 +00:00
|
|
|
|
'default' => $context->msg(
|
|
|
|
|
|
'prefs-registration-date-time',
|
2011-12-19 18:19:03 +00:00
|
|
|
|
$lang->userTimeAndDate( $userRegistration, $displayUser ),
|
|
|
|
|
|
$lang->userDate( $userRegistration, $displayUser ),
|
|
|
|
|
|
$lang->userTime( $userRegistration, $displayUser )
|
2011-10-09 11:43:06 +00:00
|
|
|
|
)->parse(),
|
2010-04-15 18:36:12 +00:00
|
|
|
|
'section' => 'personal/info',
|
|
|
|
|
|
);
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2013-06-10 19:30:43 +00:00
|
|
|
|
$canViewPrivateInfo = $user->isAllowed( 'viewmyprivateinfo' );
|
|
|
|
|
|
$canEditPrivateInfo = $user->isAllowed( 'editmyprivateinfo' );
|
|
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
// Actually changeable stuff
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['realname'] = array(
|
2013-06-10 19:30:43 +00:00
|
|
|
|
// (not really "private", but still shouldn't be edited without permission)
|
|
|
|
|
|
'type' => $canEditPrivateInfo && $wgAuth->allowPropChange( 'realname' ) ? 'text' : 'info',
|
2010-04-15 18:36:12 +00:00
|
|
|
|
'default' => $user->getRealName(),
|
|
|
|
|
|
'section' => 'personal/info',
|
|
|
|
|
|
'label-message' => 'yourrealname',
|
|
|
|
|
|
'help-message' => 'prefs-help-realname',
|
|
|
|
|
|
);
|
2009-05-19 17:07:46 +00:00
|
|
|
|
|
2013-06-10 19:30:43 +00:00
|
|
|
|
if ( $canEditPrivateInfo && $wgAuth->allowPasswordChange() ) {
|
2011-08-03 17:19:32 +00:00
|
|
|
|
$link = Linker::link( SpecialPage::getTitleFor( 'ChangePassword' ),
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$context->msg( 'prefs-resetpass' )->escaped(), array(),
|
2012-12-07 16:41:00 +00:00
|
|
|
|
array( 'returnto' => SpecialPage::getTitleFor( 'Preferences' )->getPrefixedText() ) );
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['password'] = array(
|
|
|
|
|
|
'type' => 'info',
|
|
|
|
|
|
'raw' => true,
|
|
|
|
|
|
'default' => $link,
|
|
|
|
|
|
'label-message' => 'yourpassword',
|
|
|
|
|
|
'section' => 'personal/info',
|
|
|
|
|
|
);
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
2010-06-14 18:28:39 +00:00
|
|
|
|
if ( $wgCookieExpiration > 0 ) {
|
|
|
|
|
|
$defaultPreferences['rememberpassword'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
2011-10-09 11:43:06 +00:00
|
|
|
|
'label' => $context->msg( 'tog-rememberpassword' )->numParams(
|
|
|
|
|
|
ceil( $wgCookieExpiration / ( 3600 * 24 ) ) )->text(),
|
2010-06-14 18:28:39 +00:00
|
|
|
|
'section' => 'personal/info',
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
2013-02-01 17:25:53 +00:00
|
|
|
|
// Only show preferhttps if secure login is turned on
|
2013-08-23 19:34:06 +00:00
|
|
|
|
if ( $wgSecureLogin && wfCanIPUseHTTPS( $context->getRequest()->getIP() ) ) {
|
2013-02-01 17:25:53 +00:00
|
|
|
|
$defaultPreferences['prefershttps'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'label-message' => 'tog-prefershttps',
|
2013-08-28 17:57:57 +00:00
|
|
|
|
'help-message' => 'prefs-help-prefershttps',
|
2013-02-01 17:25:53 +00:00
|
|
|
|
'section' => 'personal/info'
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
// Language
|
2012-02-27 11:59:24 +00:00
|
|
|
|
$languages = Language::fetchLanguageNames( null, 'mw' );
|
2010-09-07 22:37:55 +00:00
|
|
|
|
if ( !array_key_exists( $wgLanguageCode, $languages ) ) {
|
|
|
|
|
|
$languages[$wgLanguageCode] = $wgLanguageCode;
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
|
|
|
|
|
ksort( $languages );
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$options = array();
|
2010-04-15 18:36:12 +00:00
|
|
|
|
foreach ( $languages as $code => $name ) {
|
2009-07-24 17:41:01 +00:00
|
|
|
|
$display = wfBCP47( $code ) . ' - ' . $name;
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$options[$display] = $code;
|
|
|
|
|
|
}
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['language'] = array(
|
|
|
|
|
|
'type' => 'select',
|
|
|
|
|
|
'section' => 'personal/i18n',
|
|
|
|
|
|
'options' => $options,
|
|
|
|
|
|
'label-message' => 'yourlanguage',
|
|
|
|
|
|
);
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2012-10-30 05:53:44 +00:00
|
|
|
|
$defaultPreferences['gender'] = array(
|
|
|
|
|
|
'type' => 'radio',
|
|
|
|
|
|
'section' => 'personal/i18n',
|
|
|
|
|
|
'options' => array(
|
2013-09-06 11:16:01 +00:00
|
|
|
|
$context->msg( 'parentheses',
|
|
|
|
|
|
$context->msg( 'gender-unknown' )->text()
|
|
|
|
|
|
)->text() => 'unknown',
|
2012-10-30 05:53:44 +00:00
|
|
|
|
$context->msg( 'gender-female' )->text() => 'female',
|
2013-09-06 11:16:01 +00:00
|
|
|
|
$context->msg( 'gender-male' )->text() => 'male',
|
2012-10-30 05:53:44 +00:00
|
|
|
|
),
|
|
|
|
|
|
'label-message' => 'yourgender',
|
|
|
|
|
|
'help-message' => 'prefs-help-gender',
|
|
|
|
|
|
);
|
|
|
|
|
|
|
2013-04-22 09:20:42 +00:00
|
|
|
|
// see if there are multiple language variants to choose from
|
2010-04-15 18:36:12 +00:00
|
|
|
|
if ( !$wgDisableLangConversion ) {
|
2013-06-12 12:13:04 +00:00
|
|
|
|
foreach ( LanguageConverter::$languagesWithVariants as $langCode ) {
|
|
|
|
|
|
if ( $langCode == $wgContLang->getCode() ) {
|
|
|
|
|
|
$variants = $wgContLang->getVariants();
|
2009-04-24 01:31:17 +00:00
|
|
|
|
|
2013-06-12 12:13:04 +00:00
|
|
|
|
if ( count( $variants ) <= 1 ) {
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
2009-04-24 01:31:17 +00:00
|
|
|
|
|
2013-06-12 12:13:04 +00:00
|
|
|
|
$variantArray = array();
|
|
|
|
|
|
foreach ( $variants as $v ) {
|
|
|
|
|
|
$v = str_replace( '_', '-', strtolower( $v ) );
|
|
|
|
|
|
$variantArray[$v] = $lang->getVariantname( $v, false );
|
|
|
|
|
|
}
|
2009-04-24 01:31:17 +00:00
|
|
|
|
|
2013-06-12 12:13:04 +00:00
|
|
|
|
$options = array();
|
|
|
|
|
|
foreach ( $variantArray as $code => $name ) {
|
|
|
|
|
|
$display = wfBCP47( $code ) . ' - ' . $name;
|
|
|
|
|
|
$options[$display] = $code;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
$defaultPreferences['variant'] = array(
|
|
|
|
|
|
'label-message' => 'yourvariant',
|
|
|
|
|
|
'type' => 'select',
|
|
|
|
|
|
'options' => $options,
|
2013-04-22 09:20:42 +00:00
|
|
|
|
'section' => 'personal/i18n',
|
2013-06-12 12:13:04 +00:00
|
|
|
|
'help-message' => 'prefs-help-variant',
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if ( !$wgDisableTitleConversion ) {
|
|
|
|
|
|
$defaultPreferences['noconvertlink'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'personal/i18n',
|
|
|
|
|
|
'label-message' => 'tog-noconvertlink',
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$defaultPreferences["variant-$langCode"] = array(
|
|
|
|
|
|
'type' => 'api',
|
2013-04-22 09:20:42 +00:00
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2013-08-09 17:53:30 +00:00
|
|
|
|
// Stuff from Language::getExtraUserToggles()
|
|
|
|
|
|
// FIXME is this dead code? $extraUserToggles doesn't seem to be defined for any language
|
|
|
|
|
|
$toggles = $wgContLang->getExtraUserToggles();
|
|
|
|
|
|
|
|
|
|
|
|
foreach ( $toggles as $toggle ) {
|
|
|
|
|
|
$defaultPreferences[$toggle] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'personal/i18n',
|
|
|
|
|
|
'label-message' => "tog-$toggle",
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2009-08-05 14:45:21 +00:00
|
|
|
|
// show a preview of the old signature first
|
2011-10-19 14:16:01 +00:00
|
|
|
|
$oldsigWikiText = $wgParser->preSaveTransform( "~~~", $context->getTitle(), $user, ParserOptions::newFromContext( $context ) );
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$oldsigHTML = $context->getOutput()->parseInline( $oldsigWikiText, true, true );
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['oldsig'] = array(
|
|
|
|
|
|
'type' => 'info',
|
|
|
|
|
|
'raw' => true,
|
|
|
|
|
|
'label-message' => 'tog-oldsig',
|
|
|
|
|
|
'default' => $oldsigHTML,
|
|
|
|
|
|
'section' => 'personal/signature',
|
|
|
|
|
|
);
|
|
|
|
|
|
$defaultPreferences['nickname'] = array(
|
|
|
|
|
|
'type' => $wgAuth->allowPropChange( 'nickname' ) ? 'text' : 'info',
|
|
|
|
|
|
'maxlength' => $wgMaxSigChars,
|
|
|
|
|
|
'label-message' => 'yournick',
|
|
|
|
|
|
'validation-callback' => array( 'Preferences', 'validateSignature' ),
|
|
|
|
|
|
'section' => 'personal/signature',
|
|
|
|
|
|
'filter-callback' => array( 'Preferences', 'cleanSignature' ),
|
|
|
|
|
|
);
|
|
|
|
|
|
$defaultPreferences['fancysig'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'label-message' => 'tog-fancysig',
|
|
|
|
|
|
'help-message' => 'prefs-help-signature', // show general help about signature at the bottom of the section
|
|
|
|
|
|
'section' => 'personal/signature'
|
|
|
|
|
|
);
|
|
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
## Email stuff
|
2010-04-15 18:36:12 +00:00
|
|
|
|
|
|
|
|
|
|
if ( $wgEnableEmail ) {
|
2013-07-25 09:52:29 +00:00
|
|
|
|
if ( $canViewPrivateInfo ) {
|
|
|
|
|
|
$helpMessages[] = $wgEmailConfirmToEdit
|
|
|
|
|
|
? 'prefs-help-email-required'
|
|
|
|
|
|
: 'prefs-help-email';
|
2010-04-15 18:36:12 +00:00
|
|
|
|
|
2013-07-25 09:52:29 +00:00
|
|
|
|
if ( $wgEnableUserEmail ) {
|
|
|
|
|
|
// additional messages when users can send email to each other
|
|
|
|
|
|
$helpMessages[] = 'prefs-help-email-others';
|
|
|
|
|
|
}
|
2011-07-23 00:48:39 +00:00
|
|
|
|
|
2013-07-25 09:52:29 +00:00
|
|
|
|
$emailAddress = $user->getEmail() ? htmlspecialchars( $user->getEmail() ) : '';
|
|
|
|
|
|
if ( $canEditPrivateInfo && $wgAuth->allowPropChange( 'emailaddress' ) ) {
|
|
|
|
|
|
$link = Linker::link(
|
|
|
|
|
|
SpecialPage::getTitleFor( 'ChangeEmail' ),
|
|
|
|
|
|
$context->msg( $user->getEmail() ? 'prefs-changeemail' : 'prefs-setemail' )->escaped(),
|
|
|
|
|
|
array(),
|
|
|
|
|
|
array( 'returnto' => SpecialPage::getTitleFor( 'Preferences' )->getPrefixedText() ) );
|
|
|
|
|
|
|
|
|
|
|
|
$emailAddress .= $emailAddress == '' ? $link : (
|
|
|
|
|
|
$context->msg( 'word-separator' )->plain()
|
|
|
|
|
|
. $context->msg( 'parentheses' )->rawParams( $link )->plain()
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
2011-09-30 20:36:52 +00:00
|
|
|
|
|
2013-06-10 19:30:43 +00:00
|
|
|
|
$defaultPreferences['emailaddress'] = array(
|
|
|
|
|
|
'type' => 'info',
|
|
|
|
|
|
'raw' => true,
|
|
|
|
|
|
'default' => $emailAddress,
|
|
|
|
|
|
'label-message' => 'youremail',
|
|
|
|
|
|
'section' => 'personal/email',
|
|
|
|
|
|
'help-messages' => $helpMessages,
|
|
|
|
|
|
# 'cssclass' chosen below
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
2010-04-15 18:36:12 +00:00
|
|
|
|
|
2009-07-03 13:14:11 +00:00
|
|
|
|
$disableEmailPrefs = false;
|
2010-04-15 18:36:12 +00:00
|
|
|
|
|
2009-07-03 13:14:11 +00:00
|
|
|
|
if ( $wgEmailAuthentication ) {
|
2013-05-10 21:05:22 +00:00
|
|
|
|
$emailauthenticationclass = 'mw-email-not-authenticated';
|
2009-07-03 13:14:11 +00:00
|
|
|
|
if ( $user->getEmail() ) {
|
2010-04-15 18:36:12 +00:00
|
|
|
|
if ( $user->getEmailAuthenticationTimestamp() ) {
|
2009-07-03 13:14:11 +00:00
|
|
|
|
// date and time are separate parameters to facilitate localisation.
|
|
|
|
|
|
// $time is kept for backward compat reasons.
|
|
|
|
|
|
// 'emailauthenticated' is also used in SpecialConfirmemail.php
|
2011-12-19 18:19:03 +00:00
|
|
|
|
$displayUser = $context->getUser();
|
|
|
|
|
|
$emailTimestamp = $user->getEmailAuthenticationTimestamp();
|
|
|
|
|
|
$time = $lang->userTimeAndDate( $emailTimestamp, $displayUser );
|
|
|
|
|
|
$d = $lang->userDate( $emailTimestamp, $displayUser );
|
|
|
|
|
|
$t = $lang->userTime( $emailTimestamp, $displayUser );
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$emailauthenticated = $context->msg( 'emailauthenticated',
|
|
|
|
|
|
$time, $d, $t )->parse() . '<br />';
|
2009-07-03 13:14:11 +00:00
|
|
|
|
$disableEmailPrefs = false;
|
2012-03-07 09:56:24 +00:00
|
|
|
|
$emailauthenticationclass = 'mw-email-authenticated';
|
2009-07-03 13:14:11 +00:00
|
|
|
|
} else {
|
|
|
|
|
|
$disableEmailPrefs = true;
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$emailauthenticated = $context->msg( 'emailnotauthenticated' )->parse() . '<br />' .
|
2011-08-03 17:19:32 +00:00
|
|
|
|
Linker::linkKnown(
|
2009-07-03 13:14:11 +00:00
|
|
|
|
SpecialPage::getTitleFor( 'Confirmemail' ),
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$context->msg( 'emailconfirmlink' )->escaped()
|
2009-07-03 13:14:11 +00:00
|
|
|
|
) . '<br />';
|
2013-04-13 11:36:24 +00:00
|
|
|
|
$emailauthenticationclass = "mw-email-not-authenticated";
|
2009-07-03 13:14:11 +00:00
|
|
|
|
}
|
2009-04-27 01:38:29 +00:00
|
|
|
|
} else {
|
|
|
|
|
|
$disableEmailPrefs = true;
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$emailauthenticated = $context->msg( 'noemailprefs' )->escaped();
|
2012-03-07 09:56:24 +00:00
|
|
|
|
$emailauthenticationclass = 'mw-email-none';
|
2009-04-27 01:38:29 +00:00
|
|
|
|
}
|
2010-04-15 18:36:12 +00:00
|
|
|
|
|
2013-06-10 19:30:43 +00:00
|
|
|
|
if ( $canViewPrivateInfo ) {
|
|
|
|
|
|
$defaultPreferences['emailauthentication'] = array(
|
|
|
|
|
|
'type' => 'info',
|
|
|
|
|
|
'raw' => true,
|
|
|
|
|
|
'section' => 'personal/email',
|
|
|
|
|
|
'label-message' => 'prefs-emailconfirm-label',
|
|
|
|
|
|
'default' => $emailauthenticated,
|
|
|
|
|
|
# Apply the same CSS class used on the input to the message:
|
|
|
|
|
|
'cssclass' => $emailauthenticationclass,
|
|
|
|
|
|
);
|
|
|
|
|
|
$defaultPreferences['emailaddress']['cssclass'] = $emailauthenticationclass;
|
|
|
|
|
|
}
|
2009-04-27 01:38:29 +00:00
|
|
|
|
}
|
2010-04-15 18:36:12 +00:00
|
|
|
|
|
|
|
|
|
|
if ( $wgEnableUserEmail && $user->isAllowed( 'sendemail' ) ) {
|
|
|
|
|
|
$defaultPreferences['disablemail'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'invert' => true,
|
|
|
|
|
|
'section' => 'personal/email',
|
|
|
|
|
|
'label-message' => 'allowemail',
|
|
|
|
|
|
'disabled' => $disableEmailPrefs,
|
|
|
|
|
|
);
|
|
|
|
|
|
$defaultPreferences['ccmeonemails'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'personal/email',
|
|
|
|
|
|
'label-message' => 'tog-ccmeonemails',
|
|
|
|
|
|
'disabled' => $disableEmailPrefs,
|
|
|
|
|
|
);
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
2010-04-15 18:36:12 +00:00
|
|
|
|
|
2009-07-04 01:46:41 +00:00
|
|
|
|
if ( $wgEnotifWatchlist ) {
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['enotifwatchlistpages'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'personal/email',
|
|
|
|
|
|
'label-message' => 'tog-enotifwatchlistpages',
|
|
|
|
|
|
'disabled' => $disableEmailPrefs,
|
|
|
|
|
|
);
|
2009-07-04 01:46:41 +00:00
|
|
|
|
}
|
2010-04-15 18:36:12 +00:00
|
|
|
|
if ( $wgEnotifUserTalk ) {
|
|
|
|
|
|
$defaultPreferences['enotifusertalkpages'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'personal/email',
|
|
|
|
|
|
'label-message' => 'tog-enotifusertalkpages',
|
|
|
|
|
|
'disabled' => $disableEmailPrefs,
|
|
|
|
|
|
);
|
2009-07-04 01:46:41 +00:00
|
|
|
|
}
|
2010-04-15 18:36:12 +00:00
|
|
|
|
if ( $wgEnotifUserTalk || $wgEnotifWatchlist ) {
|
|
|
|
|
|
$defaultPreferences['enotifminoredits'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'personal/email',
|
|
|
|
|
|
'label-message' => 'tog-enotifminoredits',
|
|
|
|
|
|
'disabled' => $disableEmailPrefs,
|
|
|
|
|
|
);
|
|
|
|
|
|
|
2010-03-06 20:49:19 +00:00
|
|
|
|
if ( $wgEnotifRevealEditorAddress ) {
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['enotifrevealaddr'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'personal/email',
|
|
|
|
|
|
'label-message' => 'tog-enotifrevealaddr',
|
|
|
|
|
|
'disabled' => $disableEmailPrefs,
|
|
|
|
|
|
);
|
2010-03-06 20:49:19 +00:00
|
|
|
|
}
|
2009-07-04 01:46:41 +00:00
|
|
|
|
}
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
2009-04-27 02:52:33 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-04-19 11:03:40 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @param $user User
|
2012-01-13 02:40:09 +00:00
|
|
|
|
* @param $context IContextSource
|
2011-04-19 11:03:40 +00:00
|
|
|
|
* @param $defaultPreferences
|
2012-01-12 19:41:18 +00:00
|
|
|
|
* @return void
|
2011-04-19 11:03:40 +00:00
|
|
|
|
*/
|
2012-01-13 02:40:09 +00:00
|
|
|
|
static function skinPreferences( $user, IContextSource $context, &$defaultPreferences ) {
|
2009-04-24 01:31:17 +00:00
|
|
|
|
## Skin #####################################
|
2011-10-09 11:43:06 +00:00
|
|
|
|
global $wgAllowUserCss, $wgAllowUserJs;
|
2010-03-06 20:42:35 +00:00
|
|
|
|
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['skin'] = array(
|
|
|
|
|
|
'type' => 'radio',
|
2011-10-09 11:43:06 +00:00
|
|
|
|
'options' => self::generateSkinOptions( $user, $context ),
|
2010-05-30 17:33:59 +00:00
|
|
|
|
'label' => ' ',
|
2010-04-15 18:36:12 +00:00
|
|
|
|
'section' => 'rendering/skin',
|
|
|
|
|
|
);
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2010-03-06 20:42:35 +00:00
|
|
|
|
# Create links to user CSS/JS pages for all skins
|
|
|
|
|
|
# This code is basically copied from generateSkinOptions(). It'd
|
2010-04-15 18:36:12 +00:00
|
|
|
|
# be nice to somehow merge this back in there to avoid redundancy.
|
|
|
|
|
|
if ( $wgAllowUserCss || $wgAllowUserJs ) {
|
2010-03-06 20:42:35 +00:00
|
|
|
|
$linkTools = array();
|
2012-12-02 21:31:30 +00:00
|
|
|
|
$userName = $user->getName();
|
2010-04-15 18:36:12 +00:00
|
|
|
|
|
|
|
|
|
|
if ( $wgAllowUserCss ) {
|
2012-12-02 21:31:30 +00:00
|
|
|
|
$cssPage = Title::makeTitleSafe( NS_USER, $userName . '/common.css' );
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$linkTools[] = Linker::link( $cssPage, $context->msg( 'prefs-custom-css' )->escaped() );
|
2010-03-06 20:42:35 +00:00
|
|
|
|
}
|
2010-04-15 18:36:12 +00:00
|
|
|
|
|
|
|
|
|
|
if ( $wgAllowUserJs ) {
|
2012-12-02 21:31:30 +00:00
|
|
|
|
$jsPage = Title::makeTitleSafe( NS_USER, $userName . '/common.js' );
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$linkTools[] = Linker::link( $jsPage, $context->msg( 'prefs-custom-js' )->escaped() );
|
2010-03-06 20:42:35 +00:00
|
|
|
|
}
|
2010-04-15 18:36:12 +00:00
|
|
|
|
|
|
|
|
|
|
$defaultPreferences['commoncssjs'] = array(
|
|
|
|
|
|
'type' => 'info',
|
|
|
|
|
|
'raw' => true,
|
2011-11-21 16:13:21 +00:00
|
|
|
|
'default' => $context->getLanguage()->pipeList( $linkTools ),
|
2010-04-15 18:36:12 +00:00
|
|
|
|
'label-message' => 'prefs-common-css-js',
|
|
|
|
|
|
'section' => 'rendering/skin',
|
|
|
|
|
|
);
|
2010-03-06 20:42:35 +00:00
|
|
|
|
}
|
2009-04-27 02:52:33 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-05-28 16:32:09 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @param $user User
|
2012-01-13 02:40:09 +00:00
|
|
|
|
* @param $context IContextSource
|
2011-05-28 16:32:09 +00:00
|
|
|
|
* @param $defaultPreferences Array
|
|
|
|
|
|
*/
|
2012-01-13 02:40:09 +00:00
|
|
|
|
static function filesPreferences( $user, IContextSource $context, &$defaultPreferences ) {
|
2009-04-24 01:31:17 +00:00
|
|
|
|
## Files #####################################
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['imagesize'] = array(
|
|
|
|
|
|
'type' => 'select',
|
2011-10-09 11:43:06 +00:00
|
|
|
|
'options' => self::getImageSizes( $context ),
|
2010-04-15 18:36:12 +00:00
|
|
|
|
'label-message' => 'imagemaxsize',
|
|
|
|
|
|
'section' => 'rendering/files',
|
|
|
|
|
|
);
|
|
|
|
|
|
$defaultPreferences['thumbsize'] = array(
|
|
|
|
|
|
'type' => 'select',
|
2011-10-09 11:43:06 +00:00
|
|
|
|
'options' => self::getThumbSizes( $context ),
|
2010-04-15 18:36:12 +00:00
|
|
|
|
'label-message' => 'thumbsize',
|
|
|
|
|
|
'section' => 'rendering/files',
|
|
|
|
|
|
);
|
2009-04-27 02:52:33 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-04-19 11:03:40 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @param $user User
|
2012-01-13 02:40:09 +00:00
|
|
|
|
* @param $context IContextSource
|
2011-04-19 11:03:40 +00:00
|
|
|
|
* @param $defaultPreferences
|
2012-01-12 19:41:18 +00:00
|
|
|
|
* @return void
|
2011-04-19 11:03:40 +00:00
|
|
|
|
*/
|
2012-01-13 02:40:09 +00:00
|
|
|
|
static function datetimePreferences( $user, IContextSource $context, &$defaultPreferences ) {
|
2009-04-24 01:31:17 +00:00
|
|
|
|
## Date and time #####################################
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$dateOptions = self::getDateOptions( $context );
|
2010-04-15 18:36:12 +00:00
|
|
|
|
if ( $dateOptions ) {
|
|
|
|
|
|
$defaultPreferences['date'] = array(
|
|
|
|
|
|
'type' => 'radio',
|
|
|
|
|
|
'options' => $dateOptions,
|
2010-05-30 17:33:59 +00:00
|
|
|
|
'label' => ' ',
|
2010-04-15 18:36:12 +00:00
|
|
|
|
'section' => 'datetime/dateformat',
|
|
|
|
|
|
);
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
// Info
|
2011-04-04 11:48:38 +00:00
|
|
|
|
$now = wfTimestampNow();
|
2011-11-21 16:13:21 +00:00
|
|
|
|
$lang = $context->getLanguage();
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$nowlocal = Xml::element( 'span', array( 'id' => 'wpLocalTime' ),
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$lang->time( $now, true ) );
|
|
|
|
|
|
$nowserver = $lang->time( $now, false ) .
|
2011-04-04 11:48:38 +00:00
|
|
|
|
Html::hidden( 'wpServerTime', (int)substr( $now, 8, 2 ) * 60 + (int)substr( $now, 10, 2 ) );
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['nowserver'] = array(
|
|
|
|
|
|
'type' => 'info',
|
|
|
|
|
|
'raw' => 1,
|
|
|
|
|
|
'label-message' => 'servertime',
|
|
|
|
|
|
'default' => $nowserver,
|
|
|
|
|
|
'section' => 'datetime/timeoffset',
|
|
|
|
|
|
);
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['nowlocal'] = array(
|
|
|
|
|
|
'type' => 'info',
|
|
|
|
|
|
'raw' => 1,
|
|
|
|
|
|
'label-message' => 'localtime',
|
|
|
|
|
|
'default' => $nowlocal,
|
|
|
|
|
|
'section' => 'datetime/timeoffset',
|
|
|
|
|
|
);
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
// Grab existing pref.
|
|
|
|
|
|
$tzOffset = $user->getOption( 'timecorrection' );
|
2011-10-15 09:11:29 +00:00
|
|
|
|
$tz = explode( '|', $tzOffset, 3 );
|
|
|
|
|
|
|
|
|
|
|
|
$tzOptions = self::getTimezoneOptions( $context );
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$tzSetting = $tzOffset;
|
2010-04-15 18:36:12 +00:00
|
|
|
|
if ( count( $tz ) > 1 && $tz[0] == 'Offset' ) {
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$minDiff = $tz[1];
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$tzSetting = sprintf( '%+03d:%02d', floor( $minDiff / 60 ), abs( $minDiff ) % 60 );
|
2011-10-15 09:11:29 +00:00
|
|
|
|
} elseif ( count( $tz ) > 1 && $tz[0] == 'ZoneInfo' &&
|
|
|
|
|
|
!in_array( $tzOffset, HTMLFormField::flattenOptions( $tzOptions ) ) )
|
|
|
|
|
|
{
|
|
|
|
|
|
# Timezone offset can vary with DST
|
|
|
|
|
|
$userTZ = timezone_open( $tz[2] );
|
|
|
|
|
|
if ( $userTZ !== false ) {
|
|
|
|
|
|
$minDiff = floor( timezone_offset_get( $userTZ, date_create( 'now' ) ) / 60 );
|
|
|
|
|
|
$tzSetting = "ZoneInfo|$minDiff|{$tz[2]}";
|
|
|
|
|
|
}
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['timecorrection'] = array(
|
|
|
|
|
|
'class' => 'HTMLSelectOrOtherField',
|
|
|
|
|
|
'label-message' => 'timezonelegend',
|
2011-10-15 09:11:29 +00:00
|
|
|
|
'options' => $tzOptions,
|
2010-04-15 18:36:12 +00:00
|
|
|
|
'default' => $tzSetting,
|
|
|
|
|
|
'size' => 20,
|
|
|
|
|
|
'section' => 'datetime/timeoffset',
|
|
|
|
|
|
);
|
2009-04-27 02:52:33 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-05-28 16:32:09 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @param $user User
|
2012-01-13 02:40:09 +00:00
|
|
|
|
* @param $context IContextSource
|
2011-05-28 16:32:09 +00:00
|
|
|
|
* @param $defaultPreferences Array
|
|
|
|
|
|
*/
|
2012-01-13 02:40:09 +00:00
|
|
|
|
static function renderingPreferences( $user, IContextSource $context, &$defaultPreferences ) {
|
2013-08-09 17:53:30 +00:00
|
|
|
|
## Diffs ####################################
|
|
|
|
|
|
$defaultPreferences['diffonly'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'rendering/diffs',
|
|
|
|
|
|
'label-message' => 'tog-diffonly',
|
|
|
|
|
|
);
|
|
|
|
|
|
$defaultPreferences['norollbackdiff'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'rendering/diffs',
|
|
|
|
|
|
'label-message' => 'tog-norollbackdiff',
|
|
|
|
|
|
);
|
|
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
## Page Rendering ##############################
|
2010-03-13 20:46:22 +00:00
|
|
|
|
global $wgAllowUserCssPrefs;
|
2010-04-15 18:36:12 +00:00
|
|
|
|
if ( $wgAllowUserCssPrefs ) {
|
|
|
|
|
|
$defaultPreferences['underline'] = array(
|
|
|
|
|
|
'type' => 'select',
|
|
|
|
|
|
'options' => array(
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$context->msg( 'underline-never' )->text() => 0,
|
|
|
|
|
|
$context->msg( 'underline-always' )->text() => 1,
|
|
|
|
|
|
$context->msg( 'underline-default' )->text() => 2,
|
2010-04-15 18:36:12 +00:00
|
|
|
|
),
|
|
|
|
|
|
'label-message' => 'tog-underline',
|
|
|
|
|
|
'section' => 'rendering/advancedrendering',
|
|
|
|
|
|
);
|
2010-03-13 20:46:22 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2010-08-03 22:13:16 +00:00
|
|
|
|
$stubThresholdValues = array( 50, 100, 500, 1000, 2000, 5000, 10000 );
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$stubThresholdOptions = array( $context->msg( 'stub-threshold-disabled' )->text() => 0 );
|
2010-04-15 18:36:12 +00:00
|
|
|
|
foreach ( $stubThresholdValues as $value ) {
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$stubThresholdOptions[$context->msg( 'size-bytes', $value )->text()] = $value;
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['stubthreshold'] = array(
|
|
|
|
|
|
'type' => 'selectorother',
|
|
|
|
|
|
'section' => 'rendering/advancedrendering',
|
|
|
|
|
|
'options' => $stubThresholdOptions,
|
|
|
|
|
|
'size' => 20,
|
2013-04-16 18:05:50 +00:00
|
|
|
|
'label-raw' => $context->msg( 'stub-threshold' )->text(), // Raw HTML message. Yay?
|
2010-04-15 18:36:12 +00:00
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if ( $wgAllowUserCssPrefs ) {
|
|
|
|
|
|
$defaultPreferences['showtoc'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'rendering/advancedrendering',
|
|
|
|
|
|
'label-message' => 'tog-showtoc',
|
|
|
|
|
|
);
|
2010-03-13 20:46:22 +00:00
|
|
|
|
}
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['nocache'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'label-message' => 'tog-nocache',
|
|
|
|
|
|
'section' => 'rendering/advancedrendering',
|
|
|
|
|
|
);
|
|
|
|
|
|
$defaultPreferences['showhiddencats'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'rendering/advancedrendering',
|
|
|
|
|
|
'label-message' => 'tog-showhiddencats'
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if ( $wgAllowUserCssPrefs ) {
|
|
|
|
|
|
$defaultPreferences['justify'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'rendering/advancedrendering',
|
|
|
|
|
|
'label-message' => 'tog-justify',
|
|
|
|
|
|
);
|
2010-03-13 20:46:22 +00:00
|
|
|
|
}
|
2010-04-15 18:36:12 +00:00
|
|
|
|
|
|
|
|
|
|
$defaultPreferences['numberheadings'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'rendering/advancedrendering',
|
|
|
|
|
|
'label-message' => 'tog-numberheadings',
|
|
|
|
|
|
);
|
2009-04-27 02:52:33 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-05-28 16:32:09 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @param $user User
|
2012-01-13 02:40:09 +00:00
|
|
|
|
* @param $context IContextSource
|
2011-05-28 16:32:09 +00:00
|
|
|
|
* @param $defaultPreferences Array
|
|
|
|
|
|
*/
|
2012-01-13 02:40:09 +00:00
|
|
|
|
static function editingPreferences( $user, IContextSource $context, &$defaultPreferences ) {
|
2013-04-11 13:20:36 +00:00
|
|
|
|
global $wgAllowUserCssPrefs;
|
2009-06-11 10:49:33 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
## Editing #####################################
|
2013-05-25 15:01:27 +00:00
|
|
|
|
if ( $wgAllowUserCssPrefs ) {
|
|
|
|
|
|
$defaultPreferences['editsection'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'editing/advancedediting',
|
|
|
|
|
|
'label-message' => 'tog-editsection',
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
$defaultPreferences['editsectiononrightclick'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'editing/advancedediting',
|
|
|
|
|
|
'label-message' => 'tog-editsectiononrightclick',
|
2012-01-25 18:26:46 +00:00
|
|
|
|
);
|
2013-05-25 15:01:27 +00:00
|
|
|
|
$defaultPreferences['editondblclick'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'editing/advancedediting',
|
|
|
|
|
|
'label-message' => 'tog-editondblclick',
|
2010-04-15 18:36:12 +00:00
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if ( $wgAllowUserCssPrefs ) {
|
|
|
|
|
|
$defaultPreferences['editfont'] = array(
|
|
|
|
|
|
'type' => 'select',
|
2013-05-25 15:01:27 +00:00
|
|
|
|
'section' => 'editing/editor',
|
2010-04-15 18:36:12 +00:00
|
|
|
|
'label-message' => 'editfont-style',
|
|
|
|
|
|
'options' => array(
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$context->msg( 'editfont-default' )->text() => 'default',
|
|
|
|
|
|
$context->msg( 'editfont-monospace' )->text() => 'monospace',
|
|
|
|
|
|
$context->msg( 'editfont-sansserif' )->text() => 'sans-serif',
|
|
|
|
|
|
$context->msg( 'editfont-serif' )->text() => 'serif',
|
2010-04-15 18:36:12 +00:00
|
|
|
|
)
|
|
|
|
|
|
);
|
2010-03-13 20:46:22 +00:00
|
|
|
|
}
|
2013-05-25 15:01:27 +00:00
|
|
|
|
$defaultPreferences['cols'] = array(
|
|
|
|
|
|
'type' => 'int',
|
|
|
|
|
|
'label-message' => 'columns',
|
|
|
|
|
|
'section' => 'editing/editor',
|
|
|
|
|
|
'min' => 4,
|
|
|
|
|
|
'max' => 1000,
|
2010-04-15 18:36:12 +00:00
|
|
|
|
);
|
2013-05-25 15:01:27 +00:00
|
|
|
|
$defaultPreferences['rows'] = array(
|
|
|
|
|
|
'type' => 'int',
|
|
|
|
|
|
'label-message' => 'rows',
|
|
|
|
|
|
'section' => 'editing/editor',
|
|
|
|
|
|
'min' => 4,
|
|
|
|
|
|
'max' => 1000,
|
2010-04-15 18:36:12 +00:00
|
|
|
|
);
|
2013-05-25 15:01:27 +00:00
|
|
|
|
if ( $user->isAllowed( 'minoredit' ) ) {
|
|
|
|
|
|
$defaultPreferences['minordefault'] = array(
|
2010-04-15 18:36:12 +00:00
|
|
|
|
'type' => 'toggle',
|
2013-05-25 15:01:27 +00:00
|
|
|
|
'section' => 'editing/editor',
|
|
|
|
|
|
'label-message' => 'tog-minordefault',
|
2010-04-15 18:36:12 +00:00
|
|
|
|
);
|
2010-03-13 20:46:22 +00:00
|
|
|
|
}
|
2013-05-25 15:01:27 +00:00
|
|
|
|
$defaultPreferences['forceeditsummary'] = array(
|
2010-04-15 18:36:12 +00:00
|
|
|
|
'type' => 'toggle',
|
2013-05-25 15:01:27 +00:00
|
|
|
|
'section' => 'editing/editor',
|
|
|
|
|
|
'label-message' => 'tog-forceeditsummary',
|
2010-04-15 18:36:12 +00:00
|
|
|
|
);
|
2013-05-25 15:01:27 +00:00
|
|
|
|
$defaultPreferences['useeditwarning'] = array(
|
2010-04-15 18:36:12 +00:00
|
|
|
|
'type' => 'toggle',
|
2013-05-25 15:01:27 +00:00
|
|
|
|
'section' => 'editing/editor',
|
|
|
|
|
|
'label-message' => 'tog-useeditwarning',
|
2010-04-15 18:36:12 +00:00
|
|
|
|
);
|
|
|
|
|
|
$defaultPreferences['showtoolbar'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
2013-05-25 15:01:27 +00:00
|
|
|
|
'section' => 'editing/editor',
|
2010-04-15 18:36:12 +00:00
|
|
|
|
'label-message' => 'tog-showtoolbar',
|
|
|
|
|
|
);
|
2011-06-19 18:07:13 +00:00
|
|
|
|
|
2013-05-25 15:01:27 +00:00
|
|
|
|
$defaultPreferences['previewonfirst'] = array(
|
2010-04-15 18:36:12 +00:00
|
|
|
|
'type' => 'toggle',
|
2013-05-25 15:01:27 +00:00
|
|
|
|
'section' => 'editing/preview',
|
|
|
|
|
|
'label-message' => 'tog-previewonfirst',
|
2010-04-15 18:36:12 +00:00
|
|
|
|
);
|
2013-05-25 15:01:27 +00:00
|
|
|
|
$defaultPreferences['previewontop'] = array(
|
2010-04-21 14:19:04 +00:00
|
|
|
|
'type' => 'toggle',
|
2013-05-25 15:01:27 +00:00
|
|
|
|
'section' => 'editing/preview',
|
|
|
|
|
|
'label-message' => 'tog-previewontop',
|
2010-04-21 14:19:04 +00:00
|
|
|
|
);
|
2013-05-25 15:01:27 +00:00
|
|
|
|
$defaultPreferences['uselivepreview'] = array(
|
2013-03-31 21:55:52 +00:00
|
|
|
|
'type' => 'toggle',
|
2013-05-25 15:01:27 +00:00
|
|
|
|
'section' => 'editing/preview',
|
|
|
|
|
|
'label-message' => 'tog-uselivepreview',
|
2013-03-31 21:55:52 +00:00
|
|
|
|
);
|
|
|
|
|
|
|
2009-04-27 02:52:33 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-05-28 16:32:09 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @param $user User
|
2012-01-13 02:40:09 +00:00
|
|
|
|
* @param $context IContextSource
|
2011-05-28 16:32:09 +00:00
|
|
|
|
* @param $defaultPreferences Array
|
|
|
|
|
|
*/
|
2012-01-13 02:40:09 +00:00
|
|
|
|
static function rcPreferences( $user, IContextSource $context, &$defaultPreferences ) {
|
2011-10-09 11:43:06 +00:00
|
|
|
|
global $wgRCMaxAge, $wgRCShowWatchingUsers;
|
2010-04-15 18:36:12 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
## RecentChanges #####################################
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['rcdays'] = array(
|
|
|
|
|
|
'type' => 'float',
|
|
|
|
|
|
'label-message' => 'recentchangesdays',
|
2010-07-04 11:39:32 +00:00
|
|
|
|
'section' => 'rc/displayrc',
|
2010-04-15 18:36:12 +00:00
|
|
|
|
'min' => 1,
|
|
|
|
|
|
'max' => ceil( $wgRCMaxAge / ( 3600 * 24 ) ),
|
2011-10-09 11:43:06 +00:00
|
|
|
|
'help' => $context->msg( 'recentchangesdays-max' )->numParams(
|
|
|
|
|
|
ceil( $wgRCMaxAge / ( 3600 * 24 ) ) )->text()
|
2010-04-15 18:36:12 +00:00
|
|
|
|
);
|
|
|
|
|
|
$defaultPreferences['rclimit'] = array(
|
|
|
|
|
|
'type' => 'int',
|
|
|
|
|
|
'label-message' => 'recentchangescount',
|
|
|
|
|
|
'help-message' => 'prefs-help-recentchangescount',
|
2010-07-04 11:39:32 +00:00
|
|
|
|
'section' => 'rc/displayrc',
|
2010-04-15 18:36:12 +00:00
|
|
|
|
);
|
|
|
|
|
|
$defaultPreferences['usenewrc'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'label-message' => 'tog-usenewrc',
|
|
|
|
|
|
'section' => 'rc/advancedrc',
|
|
|
|
|
|
);
|
|
|
|
|
|
$defaultPreferences['hideminor'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'label-message' => 'tog-hideminor',
|
|
|
|
|
|
'section' => 'rc/advancedrc',
|
|
|
|
|
|
);
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-06-25 10:04:14 +00:00
|
|
|
|
if ( $user->useRCPatrol() ) {
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['hidepatrolled'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'rc/advancedrc',
|
|
|
|
|
|
'label-message' => 'tog-hidepatrolled',
|
|
|
|
|
|
);
|
|
|
|
|
|
$defaultPreferences['newpageshidepatrolled'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'rc/advancedrc',
|
|
|
|
|
|
'label-message' => 'tog-newpageshidepatrolled',
|
|
|
|
|
|
);
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2010-04-15 18:36:12 +00:00
|
|
|
|
if ( $wgRCShowWatchingUsers ) {
|
|
|
|
|
|
$defaultPreferences['shownumberswatching'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'rc/advancedrc',
|
|
|
|
|
|
'label-message' => 'tog-shownumberswatching',
|
|
|
|
|
|
);
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
2009-04-27 02:52:33 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-04-19 11:03:40 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @param $user User
|
2012-01-13 02:40:09 +00:00
|
|
|
|
* @param $context IContextSource
|
2011-04-19 11:03:40 +00:00
|
|
|
|
* @param $defaultPreferences
|
|
|
|
|
|
*/
|
2012-01-13 02:40:09 +00:00
|
|
|
|
static function watchlistPreferences( $user, IContextSource $context, &$defaultPreferences ) {
|
2011-12-23 18:55:04 +00:00
|
|
|
|
global $wgUseRCPatrol, $wgEnableAPI, $wgRCMaxAge;
|
2010-04-15 18:36:12 +00:00
|
|
|
|
|
2011-12-23 18:55:04 +00:00
|
|
|
|
$watchlistdaysMax = ceil( $wgRCMaxAge / ( 3600 * 24 ) );
|
2012-10-10 18:13:40 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
## Watchlist #####################################
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['watchlistdays'] = array(
|
|
|
|
|
|
'type' => 'float',
|
|
|
|
|
|
'min' => 0,
|
2011-12-23 18:55:04 +00:00
|
|
|
|
'max' => $watchlistdaysMax,
|
2010-07-04 11:39:32 +00:00
|
|
|
|
'section' => 'watchlist/displaywatchlist',
|
2011-12-23 18:55:04 +00:00
|
|
|
|
'help' => $context->msg( 'prefs-watchlist-days-max' )->numParams(
|
2013-02-03 20:05:24 +00:00
|
|
|
|
$watchlistdaysMax )->text(),
|
2010-04-15 18:36:12 +00:00
|
|
|
|
'label-message' => 'prefs-watchlist-days',
|
|
|
|
|
|
);
|
|
|
|
|
|
$defaultPreferences['wllimit'] = array(
|
|
|
|
|
|
'type' => 'int',
|
|
|
|
|
|
'min' => 0,
|
|
|
|
|
|
'max' => 1000,
|
|
|
|
|
|
'label-message' => 'prefs-watchlist-edits',
|
2011-10-09 11:43:06 +00:00
|
|
|
|
'help' => $context->msg( 'prefs-watchlist-edits-max' )->escaped(),
|
2010-07-04 11:39:32 +00:00
|
|
|
|
'section' => 'watchlist/displaywatchlist',
|
2010-04-15 18:36:12 +00:00
|
|
|
|
);
|
|
|
|
|
|
$defaultPreferences['extendwatchlist'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'watchlist/advancedwatchlist',
|
|
|
|
|
|
'label-message' => 'tog-extendwatchlist',
|
|
|
|
|
|
);
|
|
|
|
|
|
$defaultPreferences['watchlisthideminor'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'watchlist/advancedwatchlist',
|
|
|
|
|
|
'label-message' => 'tog-watchlisthideminor',
|
|
|
|
|
|
);
|
|
|
|
|
|
$defaultPreferences['watchlisthidebots'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'watchlist/advancedwatchlist',
|
|
|
|
|
|
'label-message' => 'tog-watchlisthidebots',
|
|
|
|
|
|
);
|
|
|
|
|
|
$defaultPreferences['watchlisthideown'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'watchlist/advancedwatchlist',
|
|
|
|
|
|
'label-message' => 'tog-watchlisthideown',
|
|
|
|
|
|
);
|
|
|
|
|
|
$defaultPreferences['watchlisthideanons'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'watchlist/advancedwatchlist',
|
|
|
|
|
|
'label-message' => 'tog-watchlisthideanons',
|
|
|
|
|
|
);
|
|
|
|
|
|
$defaultPreferences['watchlisthideliu'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'watchlist/advancedwatchlist',
|
|
|
|
|
|
'label-message' => 'tog-watchlisthideliu',
|
|
|
|
|
|
);
|
|
|
|
|
|
|
2010-04-25 23:11:12 +00:00
|
|
|
|
if ( $wgUseRCPatrol ) {
|
|
|
|
|
|
$defaultPreferences['watchlisthidepatrolled'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'section' => 'watchlist/advancedwatchlist',
|
|
|
|
|
|
'label-message' => 'tog-watchlisthidepatrolled',
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2009-06-21 14:16:11 +00:00
|
|
|
|
$watchTypes = array(
|
|
|
|
|
|
'edit' => 'watchdefault',
|
|
|
|
|
|
'move' => 'watchmoves',
|
|
|
|
|
|
'delete' => 'watchdeletion'
|
|
|
|
|
|
);
|
|
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
// Kinda hacky
|
2010-04-15 18:36:12 +00:00
|
|
|
|
if ( $user->isAllowed( 'createpage' ) || $user->isAllowed( 'createtalk' ) ) {
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$watchTypes['read'] = 'watchcreations';
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2010-04-15 18:36:12 +00:00
|
|
|
|
foreach ( $watchTypes as $action => $pref ) {
|
2009-04-24 01:31:17 +00:00
|
|
|
|
if ( $user->isAllowed( $action ) ) {
|
2013-08-28 00:38:27 +00:00
|
|
|
|
// Messages:
|
2013-08-16 12:58:07 +00:00
|
|
|
|
// tog-watchdefault, tog-watchmoves, tog-watchdeletion, tog-watchcreations
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$defaultPreferences[$pref] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
2009-05-21 21:56:02 +00:00
|
|
|
|
'section' => 'watchlist/advancedwatchlist',
|
2009-04-24 01:31:17 +00:00
|
|
|
|
'label-message' => "tog-$pref",
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
Refactor watchlist token handling
Do not allow the user to change it directly; instead create a form
where they can reset it. (The token can still be changed via the API.)
The token is autogenerated whenever it is shown or otherwise used.
This really should have never used the preferences; however, trying to
change that now would be lots of work for very little gain, so this
keeps using that mechanism, adding a little abstraction over it.
It's not unconceivable that similar tokens could be used for other
pieces of data, like Echo's notifications; this enables that with one
new hook.
----
Things done here:
* Add getTokenFromOption() and resetTokenFromOption() methods to User,
abstracting out the get-and-generate-if-empty process of handling
tokens. Respect $wgHiddenPrefs (Watchlist didn't do that
previously).
* Create Special:ResetTokens, inspired by Special:Preferences and
Special:ChangeEmail, presenting the token resetting interface
(HTMLForm-based with CSRF protection).
* Create a new hook, SpecialResetTokensTokens, allowing extensions to
register tokens to be shown in the resetting form. Each token needs
information about the preference it corresponds to and a short
description (used for checkbox label).
* Hide the preference on Special:Preferences (use type=api to achieve
this), display a link to aforementioned special page instead. Move
info blurb to its own section at the bottom.
Bug: 21912
Change-Id: I0bdd2469972c4af81bfb480e9dde58cdd14c67a8
2013-06-14 16:59:59 +00:00
|
|
|
|
|
|
|
|
|
|
if ( $wgEnableAPI ) {
|
|
|
|
|
|
$defaultPreferences['watchlisttoken'] = array(
|
|
|
|
|
|
'type' => 'api',
|
|
|
|
|
|
);
|
|
|
|
|
|
$defaultPreferences['watchlisttoken-info'] = array(
|
|
|
|
|
|
'type' => 'info',
|
|
|
|
|
|
'section' => 'watchlist/tokenwatchlist',
|
|
|
|
|
|
'label-message' => 'prefs-watchlist-token',
|
|
|
|
|
|
'default' => $user->getTokenFromOption( 'watchlisttoken' ),
|
|
|
|
|
|
'help-message' => 'prefs-help-watchlist-token2',
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
2009-04-27 02:52:33 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-05-28 16:32:09 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @param $user User
|
2012-01-13 02:40:09 +00:00
|
|
|
|
* @param $context IContextSource
|
2011-05-28 16:32:09 +00:00
|
|
|
|
* @param $defaultPreferences Array
|
|
|
|
|
|
*/
|
2012-01-13 02:40:09 +00:00
|
|
|
|
static function searchPreferences( $user, IContextSource $context, &$defaultPreferences ) {
|
(bug 40448) Replace legacy mwsuggest with mediawiki.searchSuggest
The module has been broken for a while now, but nobody noticed
because in plain core it is disabled by default, and in the
bundle we ship with Extension:Vector (and its SimpleSearch).
This commit removed the mediawiki.legacy.mwsuggest module (and
related components that become obsolete with its deletion) and
replaces it with the new mediawiki.searchSuggest module, which is
based on SimpleSearch from Extension:Vector (where it will be
removed soon).
The following and all references to it in core have been removed,
I also made sure that they weren't used in any of extensions/*.
Only matches in extensions/Settings and some file that dumped the startup module, and in extensions/Vector which are addressed in
I1d5bf81a8a0266c51c99d41eefacc0f4b3ae4b76.
Had to make a few updates to jquery.suggestions to make it work
in other skins. So far it was only used in Vector, but now that
it is used in mediawiki.searchSuggest, I noticed several issues
in other skins. Most importantly the fact that it assumed the
default offset was from the right corner, which isn't the case in
Monobook where the search bar is on the left (in the sidebar).
It now detects the appropiate origin corner automatically, and
also takes directionality of the page into account.
It also uses the correct font-size automatically. Previously it
used font-size: 0.8; but that only works in Vector. Every skin
seems to have its own way of making a sane font-size. In Monobook
the <body> has an extra small font-size which is then fixed in
div#globalWrapper, and in Vector it is extra large, which is then
fixed as well deeper in the document. Either way, the size on
<body> can't be used, and since this suggestions box is appended
to the <body> (it is a generic jQuery plugin without knowledge of
the document, and even if we could give it knowledge inside
the configuration, it'd have to be per-skin). So I removed the
Vector specific font-size and let it handle it automatically.
This was needed because it is now used in all skins.
Removed modules:
* mediawiki.legacy.mwsuggest:
> Replaced with mediawiki.searchSuggest.
Removed messages:
* search-mwsuggest-enabled
* search-mwsuggest-disabled
> No longer used.
Removed mw.config.values:
* wgMWSuggestTemplate
> Obsolete.
* wgSearchNamespaces
> Obsolete.
Removed server-side settings:
* $wgEnableMWSuggest
> Suggestions are now enabled by default and can be disabled
through the user preference `disablesuggest` still.
They can be disabled by default site-wide or hidden from
prefs through the standard mechanisms for that.
* $wgMWSuggestTemplate
> Obsolete.
Removed methods
* SearchEngine::getMWSuggestTemplate()
> Obsolete.
Filters:
$ ack mwsuggest -i -Q --ignore-dir=languages/messages
$ ack wgSearchNamespaces -Q
Message changes:
* vector-simplesearch-preference
> It was wrong, it didn't activate search suggestions, that
was handled by the Vector extension. This preference in
MediaWiki core controls whether the SimpleSearch bar HTML
and CSS will be used (e.g. the rectangle search box with
the magnifying class instead of the browser-default input
field with the plain submit buttons).
* searchsuggest-search
* searchsuggest-containing
These come from Extension:Vector message and should be imported
by translatewiki:
- vector-simplesearch-search
- vector-simplesearch-containing
Change-Id: Icd721011b40bb8d2c20aefa8b359a3e45413a07f
2012-09-23 01:06:53 +00:00
|
|
|
|
global $wgContLang, $wgVectorUseSimpleSearch;
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
## Search #####################################
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['searchlimit'] = array(
|
|
|
|
|
|
'type' => 'int',
|
|
|
|
|
|
'label-message' => 'resultsperpage',
|
2010-07-04 11:39:32 +00:00
|
|
|
|
'section' => 'searchoptions/displaysearchoptions',
|
2010-04-15 18:36:12 +00:00
|
|
|
|
'min' => 0,
|
|
|
|
|
|
);
|
|
|
|
|
|
|
2010-06-18 17:36:54 +00:00
|
|
|
|
if ( $wgVectorUseSimpleSearch ) {
|
|
|
|
|
|
$defaultPreferences['vector-simplesearch'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'label-message' => 'vector-simplesearch-preference',
|
(bug 40448) Replace legacy mwsuggest with mediawiki.searchSuggest
The module has been broken for a while now, but nobody noticed
because in plain core it is disabled by default, and in the
bundle we ship with Extension:Vector (and its SimpleSearch).
This commit removed the mediawiki.legacy.mwsuggest module (and
related components that become obsolete with its deletion) and
replaces it with the new mediawiki.searchSuggest module, which is
based on SimpleSearch from Extension:Vector (where it will be
removed soon).
The following and all references to it in core have been removed,
I also made sure that they weren't used in any of extensions/*.
Only matches in extensions/Settings and some file that dumped the startup module, and in extensions/Vector which are addressed in
I1d5bf81a8a0266c51c99d41eefacc0f4b3ae4b76.
Had to make a few updates to jquery.suggestions to make it work
in other skins. So far it was only used in Vector, but now that
it is used in mediawiki.searchSuggest, I noticed several issues
in other skins. Most importantly the fact that it assumed the
default offset was from the right corner, which isn't the case in
Monobook where the search bar is on the left (in the sidebar).
It now detects the appropiate origin corner automatically, and
also takes directionality of the page into account.
It also uses the correct font-size automatically. Previously it
used font-size: 0.8; but that only works in Vector. Every skin
seems to have its own way of making a sane font-size. In Monobook
the <body> has an extra small font-size which is then fixed in
div#globalWrapper, and in Vector it is extra large, which is then
fixed as well deeper in the document. Either way, the size on
<body> can't be used, and since this suggestions box is appended
to the <body> (it is a generic jQuery plugin without knowledge of
the document, and even if we could give it knowledge inside
the configuration, it'd have to be per-skin). So I removed the
Vector specific font-size and let it handle it automatically.
This was needed because it is now used in all skins.
Removed modules:
* mediawiki.legacy.mwsuggest:
> Replaced with mediawiki.searchSuggest.
Removed messages:
* search-mwsuggest-enabled
* search-mwsuggest-disabled
> No longer used.
Removed mw.config.values:
* wgMWSuggestTemplate
> Obsolete.
* wgSearchNamespaces
> Obsolete.
Removed server-side settings:
* $wgEnableMWSuggest
> Suggestions are now enabled by default and can be disabled
through the user preference `disablesuggest` still.
They can be disabled by default site-wide or hidden from
prefs through the standard mechanisms for that.
* $wgMWSuggestTemplate
> Obsolete.
Removed methods
* SearchEngine::getMWSuggestTemplate()
> Obsolete.
Filters:
$ ack mwsuggest -i -Q --ignore-dir=languages/messages
$ ack wgSearchNamespaces -Q
Message changes:
* vector-simplesearch-preference
> It was wrong, it didn't activate search suggestions, that
was handled by the Vector extension. This preference in
MediaWiki core controls whether the SimpleSearch bar HTML
and CSS will be used (e.g. the rectangle search box with
the magnifying class instead of the browser-default input
field with the plain submit buttons).
* searchsuggest-search
* searchsuggest-containing
These come from Extension:Vector message and should be imported
by translatewiki:
- vector-simplesearch-search
- vector-simplesearch-containing
Change-Id: Icd721011b40bb8d2c20aefa8b359a3e45413a07f
2012-09-23 01:06:53 +00:00
|
|
|
|
'section' => 'searchoptions/displaysearchoptions',
|
2010-06-18 17:36:54 +00:00
|
|
|
|
);
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
(bug 40448) Replace legacy mwsuggest with mediawiki.searchSuggest
The module has been broken for a while now, but nobody noticed
because in plain core it is disabled by default, and in the
bundle we ship with Extension:Vector (and its SimpleSearch).
This commit removed the mediawiki.legacy.mwsuggest module (and
related components that become obsolete with its deletion) and
replaces it with the new mediawiki.searchSuggest module, which is
based on SimpleSearch from Extension:Vector (where it will be
removed soon).
The following and all references to it in core have been removed,
I also made sure that they weren't used in any of extensions/*.
Only matches in extensions/Settings and some file that dumped the startup module, and in extensions/Vector which are addressed in
I1d5bf81a8a0266c51c99d41eefacc0f4b3ae4b76.
Had to make a few updates to jquery.suggestions to make it work
in other skins. So far it was only used in Vector, but now that
it is used in mediawiki.searchSuggest, I noticed several issues
in other skins. Most importantly the fact that it assumed the
default offset was from the right corner, which isn't the case in
Monobook where the search bar is on the left (in the sidebar).
It now detects the appropiate origin corner automatically, and
also takes directionality of the page into account.
It also uses the correct font-size automatically. Previously it
used font-size: 0.8; but that only works in Vector. Every skin
seems to have its own way of making a sane font-size. In Monobook
the <body> has an extra small font-size which is then fixed in
div#globalWrapper, and in Vector it is extra large, which is then
fixed as well deeper in the document. Either way, the size on
<body> can't be used, and since this suggestions box is appended
to the <body> (it is a generic jQuery plugin without knowledge of
the document, and even if we could give it knowledge inside
the configuration, it'd have to be per-skin). So I removed the
Vector specific font-size and let it handle it automatically.
This was needed because it is now used in all skins.
Removed modules:
* mediawiki.legacy.mwsuggest:
> Replaced with mediawiki.searchSuggest.
Removed messages:
* search-mwsuggest-enabled
* search-mwsuggest-disabled
> No longer used.
Removed mw.config.values:
* wgMWSuggestTemplate
> Obsolete.
* wgSearchNamespaces
> Obsolete.
Removed server-side settings:
* $wgEnableMWSuggest
> Suggestions are now enabled by default and can be disabled
through the user preference `disablesuggest` still.
They can be disabled by default site-wide or hidden from
prefs through the standard mechanisms for that.
* $wgMWSuggestTemplate
> Obsolete.
Removed methods
* SearchEngine::getMWSuggestTemplate()
> Obsolete.
Filters:
$ ack mwsuggest -i -Q --ignore-dir=languages/messages
$ ack wgSearchNamespaces -Q
Message changes:
* vector-simplesearch-preference
> It was wrong, it didn't activate search suggestions, that
was handled by the Vector extension. This preference in
MediaWiki core controls whether the SimpleSearch bar HTML
and CSS will be used (e.g. the rectangle search box with
the magnifying class instead of the browser-default input
field with the plain submit buttons).
* searchsuggest-search
* searchsuggest-containing
These come from Extension:Vector message and should be imported
by translatewiki:
- vector-simplesearch-search
- vector-simplesearch-containing
Change-Id: Icd721011b40bb8d2c20aefa8b359a3e45413a07f
2012-09-23 01:06:53 +00:00
|
|
|
|
$defaultPreferences['disablesuggest'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'label-message' => 'mwsuggest-disable',
|
|
|
|
|
|
'section' => 'searchoptions/displaysearchoptions',
|
|
|
|
|
|
);
|
|
|
|
|
|
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['searcheverything'] = array(
|
|
|
|
|
|
'type' => 'toggle',
|
|
|
|
|
|
'label-message' => 'searcheverything-enable',
|
|
|
|
|
|
'section' => 'searchoptions/advancedsearchoptions',
|
|
|
|
|
|
);
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2012-12-02 21:31:30 +00:00
|
|
|
|
$nsOptions = $wgContLang->getFormattedNamespaces();
|
|
|
|
|
|
$nsOptions[0] = $context->msg( 'blanknamespace' )->text();
|
|
|
|
|
|
foreach ( $nsOptions as $ns => $name ) {
|
2013-04-20 22:49:30 +00:00
|
|
|
|
if ( $ns < 0 ) {
|
2012-12-02 21:31:30 +00:00
|
|
|
|
unset( $nsOptions[$ns] );
|
2013-04-20 22:49:30 +00:00
|
|
|
|
}
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$defaultPreferences['searchnamespaces'] = array(
|
|
|
|
|
|
'type' => 'multiselect',
|
|
|
|
|
|
'label-message' => 'defaultns',
|
2012-12-02 21:31:30 +00:00
|
|
|
|
'options' => array_flip( $nsOptions ),
|
2010-04-15 18:36:12 +00:00
|
|
|
|
'section' => 'searchoptions/advancedsearchoptions',
|
|
|
|
|
|
'prefix' => 'searchNs',
|
|
|
|
|
|
);
|
2009-04-27 02:52:33 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-05-28 16:32:09 +00:00
|
|
|
|
/**
|
2013-08-09 17:53:30 +00:00
|
|
|
|
* Dummy, kept for backwards-compatibility.
|
2011-05-28 16:32:09 +00:00
|
|
|
|
*/
|
2012-01-13 02:40:09 +00:00
|
|
|
|
static function miscPreferences( $user, IContextSource $context, &$defaultPreferences ) {
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-10-08 19:35:24 +00:00
|
|
|
|
/**
|
2011-04-19 11:03:40 +00:00
|
|
|
|
* @param $user User The User object
|
2012-01-13 02:40:09 +00:00
|
|
|
|
* @param $context IContextSource
|
2010-07-01 20:45:21 +00:00
|
|
|
|
* @return Array: text/links to display as key; $skinkey as value
|
2009-10-08 19:35:24 +00:00
|
|
|
|
*/
|
2012-01-13 02:40:09 +00:00
|
|
|
|
static function generateSkinOptions( $user, IContextSource $context ) {
|
2011-10-09 11:43:06 +00:00
|
|
|
|
global $wgDefaultSkin, $wgAllowUserCss, $wgAllowUserJs;
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$ret = array();
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$mptitle = Title::newMainPage();
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$previewtext = $context->msg( 'skin-preview' )->text();
|
2010-04-15 18:36:12 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
# Only show members of Skin::getSkinNames() rather than
|
|
|
|
|
|
# $skinNames (skins is all skin names from Language.php)
|
|
|
|
|
|
$validSkinNames = Skin::getUsableSkins();
|
2010-04-15 18:36:12 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
# Sort by UI skin name. First though need to update validSkinNames as sometimes
|
|
|
|
|
|
# the skinkey & UI skinname differ (e.g. "standard" skinkey is "Classic" in the UI).
|
|
|
|
|
|
foreach ( $validSkinNames as $skinkey => &$skinname ) {
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$msg = $context->msg( "skinname-{$skinkey}" );
|
2011-01-14 10:51:05 +00:00
|
|
|
|
if ( $msg->exists() ) {
|
|
|
|
|
|
$skinname = htmlspecialchars( $msg->text() );
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
asort( $validSkinNames );
|
2009-04-24 01:31:17 +00:00
|
|
|
|
|
2010-04-15 18:36:12 +00:00
|
|
|
|
foreach ( $validSkinNames as $skinkey => $sn ) {
|
2009-10-08 19:35:24 +00:00
|
|
|
|
$linkTools = array();
|
|
|
|
|
|
|
|
|
|
|
|
# Mark the default skin
|
2010-04-15 18:36:12 +00:00
|
|
|
|
if ( $skinkey == $wgDefaultSkin ) {
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$linkTools[] = $context->msg( 'default' )->escaped();
|
2009-10-08 19:35:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Create preview link
|
2013-04-19 12:53:20 +00:00
|
|
|
|
$mplink = htmlspecialchars( $mptitle->getLocalURL( array( 'useskin' => $skinkey ) ) );
|
2009-10-08 19:35:24 +00:00
|
|
|
|
$linkTools[] = "<a target='_blank' href=\"$mplink\">$previewtext</a>";
|
|
|
|
|
|
|
|
|
|
|
|
# Create links to user CSS/JS pages
|
2010-04-15 18:36:12 +00:00
|
|
|
|
if ( $wgAllowUserCss ) {
|
2009-06-21 14:16:11 +00:00
|
|
|
|
$cssPage = Title::makeTitleSafe( NS_USER, $user->getName() . '/' . $skinkey . '.css' );
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$linkTools[] = Linker::link( $cssPage, $context->msg( 'prefs-custom-css' )->escaped() );
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
2010-04-15 18:36:12 +00:00
|
|
|
|
|
|
|
|
|
|
if ( $wgAllowUserJs ) {
|
2009-06-21 14:16:11 +00:00
|
|
|
|
$jsPage = Title::makeTitleSafe( NS_USER, $user->getName() . '/' . $skinkey . '.js' );
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$linkTools[] = Linker::link( $jsPage, $context->msg( 'prefs-custom-js' )->escaped() );
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
2009-10-08 19:35:24 +00:00
|
|
|
|
|
2011-11-21 16:13:21 +00:00
|
|
|
|
$display = $sn . ' ' . $context->msg( 'parentheses', $context->getLanguage()->pipeList( $linkTools ) )->text();
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$ret[$display] = $skinkey;
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
return $ret;
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-05-28 16:32:09 +00:00
|
|
|
|
/**
|
2012-01-13 02:40:09 +00:00
|
|
|
|
* @param $context IContextSource
|
2011-05-28 16:32:09 +00:00
|
|
|
|
* @return array
|
|
|
|
|
|
*/
|
2012-01-13 02:40:09 +00:00
|
|
|
|
static function getDateOptions( IContextSource $context ) {
|
2011-12-19 18:19:03 +00:00
|
|
|
|
$lang = $context->getLanguage();
|
|
|
|
|
|
$dateopts = $lang->getDatePreferences();
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$ret = array();
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2010-04-15 18:36:12 +00:00
|
|
|
|
if ( $dateopts ) {
|
2009-06-16 20:53:59 +00:00
|
|
|
|
if ( !in_array( 'default', $dateopts ) ) {
|
|
|
|
|
|
$dateopts[] = 'default'; // Make sure default is always valid
|
2009-06-21 14:16:11 +00:00
|
|
|
|
// Bug 19237
|
2009-06-16 20:53:59 +00:00
|
|
|
|
}
|
2010-04-15 18:36:12 +00:00
|
|
|
|
|
2010-04-10 23:46:58 +00:00
|
|
|
|
// KLUGE: site default might not be valid for user language
|
|
|
|
|
|
global $wgDefaultUserOptions;
|
|
|
|
|
|
if ( !in_array( $wgDefaultUserOptions['date'], $dateopts ) ) {
|
|
|
|
|
|
$wgDefaultUserOptions['date'] = 'default';
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2010-02-12 01:12:52 +00:00
|
|
|
|
$epoch = wfTimestampNow();
|
2010-04-15 18:36:12 +00:00
|
|
|
|
foreach ( $dateopts as $key ) {
|
|
|
|
|
|
if ( $key == 'default' ) {
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$formatted = $context->msg( 'datedefault' )->escaped();
|
2009-04-24 01:31:17 +00:00
|
|
|
|
} else {
|
2011-12-19 18:19:03 +00:00
|
|
|
|
$formatted = htmlspecialchars( $lang->timeanddate( $epoch, false, $key ) );
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
|
|
|
|
|
$ret[$formatted] = $key;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return $ret;
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-05-28 16:32:09 +00:00
|
|
|
|
/**
|
2012-01-13 02:40:09 +00:00
|
|
|
|
* @param $context IContextSource
|
2011-05-28 16:32:09 +00:00
|
|
|
|
* @return array
|
|
|
|
|
|
*/
|
2012-01-13 02:40:09 +00:00
|
|
|
|
static function getImageSizes( IContextSource $context ) {
|
2009-04-24 01:31:17 +00:00
|
|
|
|
global $wgImageLimits;
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$ret = array();
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$pixels = $context->msg( 'unit-pixel' )->text();
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
foreach ( $wgImageLimits as $index => $limits ) {
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$display = "{$limits[0]}×{$limits[1]}" . $pixels;
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$ret[$display] = $index;
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
return $ret;
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-05-28 16:32:09 +00:00
|
|
|
|
/**
|
2012-01-13 02:40:09 +00:00
|
|
|
|
* @param $context IContextSource
|
2011-05-28 16:32:09 +00:00
|
|
|
|
* @return array
|
|
|
|
|
|
*/
|
2012-01-13 02:40:09 +00:00
|
|
|
|
static function getThumbSizes( IContextSource $context ) {
|
2009-04-24 01:31:17 +00:00
|
|
|
|
global $wgThumbLimits;
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$ret = array();
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$pixels = $context->msg( 'unit-pixel' )->text();
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
foreach ( $wgThumbLimits as $index => $size ) {
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$display = $size . $pixels;
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$ret[$display] = $index;
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
return $ret;
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-05-28 16:32:09 +00:00
|
|
|
|
/**
|
2011-11-17 10:06:56 +00:00
|
|
|
|
* @param $signature string
|
|
|
|
|
|
* @param $alldata array
|
|
|
|
|
|
* @param $form HTMLForm
|
2011-05-28 16:32:09 +00:00
|
|
|
|
* @return bool|string
|
|
|
|
|
|
*/
|
2011-11-17 10:06:56 +00:00
|
|
|
|
static function validateSignature( $signature, $alldata, $form ) {
|
2011-10-09 11:43:06 +00:00
|
|
|
|
global $wgParser, $wgMaxSigChars;
|
2010-04-15 18:36:12 +00:00
|
|
|
|
if ( mb_strlen( $signature ) > $wgMaxSigChars ) {
|
|
|
|
|
|
return Xml::element( 'span', array( 'class' => 'error' ),
|
2011-11-17 10:06:56 +00:00
|
|
|
|
$form->msg( 'badsiglength' )->numParams( $wgMaxSigChars )->text() );
|
2010-10-02 21:35:00 +00:00
|
|
|
|
} elseif ( isset( $alldata['fancysig'] ) &&
|
|
|
|
|
|
$alldata['fancysig'] &&
|
2009-04-24 01:31:17 +00:00
|
|
|
|
false === $wgParser->validateSig( $signature ) ) {
|
2011-11-17 10:06:56 +00:00
|
|
|
|
return Xml::element( 'span', array( 'class' => 'error' ), $form->msg( 'badsig' )->text() );
|
2009-04-24 01:31:17 +00:00
|
|
|
|
} else {
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-05-28 16:32:09 +00:00
|
|
|
|
/**
|
2011-05-29 14:01:47 +00:00
|
|
|
|
* @param $signature string
|
|
|
|
|
|
* @param $alldata array
|
2011-11-17 10:06:56 +00:00
|
|
|
|
* @param $form HTMLForm
|
2011-05-29 14:01:47 +00:00
|
|
|
|
* @return string
|
2011-05-28 16:32:09 +00:00
|
|
|
|
*/
|
2011-11-17 10:06:56 +00:00
|
|
|
|
static function cleanSignature( $signature, $alldata, $form ) {
|
2010-10-02 21:35:00 +00:00
|
|
|
|
if ( isset( $alldata['fancysig'] ) && $alldata['fancysig'] ) {
|
2011-12-06 23:07:13 +00:00
|
|
|
|
global $wgParser;
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$signature = $wgParser->cleanSig( $signature );
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// When no fancy sig used, make sure ~{3,5} get removed.
|
2011-12-06 23:07:13 +00:00
|
|
|
|
$signature = Parser::cleanSigInSig( $signature );
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
return $signature;
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-05-28 16:32:09 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @param $user User
|
2012-01-13 02:40:09 +00:00
|
|
|
|
* @param $context IContextSource
|
2011-05-28 16:32:09 +00:00
|
|
|
|
* @param $formClass string
|
2013-03-11 17:15:01 +00:00
|
|
|
|
* @param array $remove array of items to remove
|
2011-05-28 16:32:09 +00:00
|
|
|
|
* @return HtmlForm
|
|
|
|
|
|
*/
|
2012-01-13 02:40:09 +00:00
|
|
|
|
static function getFormObject( $user, IContextSource $context, $formClass = 'PreferencesForm', array $remove = array() ) {
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$formDescriptor = Preferences::getPreferences( $user, $context );
|
|
|
|
|
|
if ( count( $remove ) ) {
|
|
|
|
|
|
$removeKeys = array_flip( $remove );
|
|
|
|
|
|
$formDescriptor = array_diff_key( $formDescriptor, $removeKeys );
|
|
|
|
|
|
}
|
2012-01-13 02:27:44 +00:00
|
|
|
|
|
2012-12-07 07:22:10 +00:00
|
|
|
|
// Remove type=api preferences. They are not intended for rendering in the form.
|
|
|
|
|
|
foreach ( $formDescriptor as $name => $info ) {
|
|
|
|
|
|
if ( isset( $info['type'] ) && $info['type'] === 'api' ) {
|
|
|
|
|
|
unset( $formDescriptor[$name] );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2012-01-13 02:27:44 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @var $htmlForm PreferencesForm
|
|
|
|
|
|
*/
|
2011-08-22 18:32:48 +00:00
|
|
|
|
$htmlForm = new $formClass( $formDescriptor, $context, 'prefs' );
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$htmlForm->setModifiedUser( $user );
|
2011-01-09 18:36:05 +00:00
|
|
|
|
$htmlForm->setId( 'mw-prefs-form' );
|
2011-11-17 10:06:56 +00:00
|
|
|
|
$htmlForm->setSubmitText( $context->msg( 'saveprefs' )->text() );
|
2010-04-24 20:07:13 +00:00
|
|
|
|
# Used message keys: 'accesskey-preferences-save', 'tooltip-preferences-save'
|
|
|
|
|
|
$htmlForm->setSubmitTooltip( 'preferences-save' );
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$htmlForm->setSubmitID( 'prefsubmit' );
|
|
|
|
|
|
$htmlForm->setSubmitCallback( array( 'Preferences', 'tryFormSubmit' ) );
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
return $htmlForm;
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-05-28 16:32:09 +00:00
|
|
|
|
/**
|
2013-04-12 21:01:30 +00:00
|
|
|
|
* @param $context IContextSource
|
2011-05-28 16:32:09 +00:00
|
|
|
|
* @return array
|
|
|
|
|
|
*/
|
2012-01-13 02:40:09 +00:00
|
|
|
|
static function getTimezoneOptions( IContextSource $context ) {
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$opt = array();
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2013-07-06 19:59:35 +00:00
|
|
|
|
global $wgLocalTZoffset;
|
|
|
|
|
|
$timestamp = MWTimestamp::getLocalInstance();
|
|
|
|
|
|
// Check that $wgLocalTZoffset is the same as the local time zone offset
|
|
|
|
|
|
if ( $wgLocalTZoffset == $timestamp->format( 'Z' ) / 60 ) {
|
|
|
|
|
|
$server_tz_msg = $context->msg( 'timezoneuseserverdefault', $timestamp->getTimezone()->getName() )->text();
|
2011-05-16 09:59:23 +00:00
|
|
|
|
} else {
|
2011-08-01 16:01:13 +00:00
|
|
|
|
$tzstring = sprintf( '%+03d:%02d', floor( $wgLocalTZoffset / 60 ), abs( $wgLocalTZoffset ) % 60 );
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$server_tz_msg = $context->msg( 'timezoneuseserverdefault', $tzstring )->text();
|
2011-05-15 14:51:01 +00:00
|
|
|
|
}
|
|
|
|
|
|
$opt[$server_tz_msg] = "System|$wgLocalTZoffset";
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$opt[$context->msg( 'timezoneuseoffset' )->text()] = 'other';
|
|
|
|
|
|
$opt[$context->msg( 'guesstimezone' )->text()] = 'guess';
|
2009-04-24 01:31:17 +00:00
|
|
|
|
|
|
|
|
|
|
if ( function_exists( 'timezone_identifiers_list' ) ) {
|
|
|
|
|
|
# Read timezone list
|
|
|
|
|
|
$tzs = timezone_identifiers_list();
|
|
|
|
|
|
sort( $tzs );
|
|
|
|
|
|
|
|
|
|
|
|
$tzRegions = array();
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$tzRegions['Africa'] = $context->msg( 'timezoneregion-africa' )->text();
|
|
|
|
|
|
$tzRegions['America'] = $context->msg( 'timezoneregion-america' )->text();
|
|
|
|
|
|
$tzRegions['Antarctica'] = $context->msg( 'timezoneregion-antarctica' )->text();
|
|
|
|
|
|
$tzRegions['Arctic'] = $context->msg( 'timezoneregion-arctic' )->text();
|
|
|
|
|
|
$tzRegions['Asia'] = $context->msg( 'timezoneregion-asia' )->text();
|
|
|
|
|
|
$tzRegions['Atlantic'] = $context->msg( 'timezoneregion-atlantic' )->text();
|
|
|
|
|
|
$tzRegions['Australia'] = $context->msg( 'timezoneregion-australia' )->text();
|
|
|
|
|
|
$tzRegions['Europe'] = $context->msg( 'timezoneregion-europe' )->text();
|
|
|
|
|
|
$tzRegions['Indian'] = $context->msg( 'timezoneregion-indian' )->text();
|
|
|
|
|
|
$tzRegions['Pacific'] = $context->msg( 'timezoneregion-pacific' )->text();
|
2009-04-24 01:31:17 +00:00
|
|
|
|
asort( $tzRegions );
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
|
|
|
|
|
$prefill = array_fill_keys( array_values( $tzRegions ), array() );
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$opt = array_merge( $opt, $prefill );
|
|
|
|
|
|
|
2011-04-04 18:47:28 +00:00
|
|
|
|
$now = date_create( 'now' );
|
2009-04-24 01:31:17 +00:00
|
|
|
|
|
|
|
|
|
|
foreach ( $tzs as $tz ) {
|
|
|
|
|
|
$z = explode( '/', $tz, 2 );
|
|
|
|
|
|
|
|
|
|
|
|
# timezone_identifiers_list() returns a number of
|
2010-04-15 18:36:12 +00:00
|
|
|
|
# backwards-compatibility entries. This filters them out of the
|
2009-04-24 01:31:17 +00:00
|
|
|
|
# list presented to the user.
|
2010-04-15 18:36:12 +00:00
|
|
|
|
if ( count( $z ) != 2 || !array_key_exists( $z[0], $tzRegions ) ) {
|
2009-04-24 01:31:17 +00:00
|
|
|
|
continue;
|
2010-04-15 18:36:12 +00:00
|
|
|
|
}
|
2009-04-24 01:31:17 +00:00
|
|
|
|
|
|
|
|
|
|
# Localize region
|
|
|
|
|
|
$z[0] = $tzRegions[$z[0]];
|
|
|
|
|
|
|
|
|
|
|
|
$minDiff = floor( timezone_offset_get( timezone_open( $tz ), $now ) / 60 );
|
2010-04-15 18:36:12 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$display = str_replace( '_', ' ', $z[0] . '/' . $z[1] );
|
|
|
|
|
|
$value = "ZoneInfo|$minDiff|$tz";
|
2010-04-15 18:36:12 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$opt[$z[0]][$display] = $value;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return $opt;
|
|
|
|
|
|
}
|
2011-04-04 18:45:03 +00:00
|
|
|
|
|
2011-05-28 16:32:09 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @param $value
|
|
|
|
|
|
* @param $alldata
|
|
|
|
|
|
* @return int
|
|
|
|
|
|
*/
|
2012-12-20 15:09:25 +00:00
|
|
|
|
static function filterIntval( $value, $alldata ) {
|
2010-12-12 15:38:54 +00:00
|
|
|
|
return intval( $value );
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-05-28 16:32:09 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @param $tz
|
|
|
|
|
|
* @param $alldata
|
|
|
|
|
|
* @return string
|
|
|
|
|
|
*/
|
2009-04-24 01:31:17 +00:00
|
|
|
|
static function filterTimezoneInput( $tz, $alldata ) {
|
|
|
|
|
|
$data = explode( '|', $tz, 3 );
|
|
|
|
|
|
switch ( $data[0] ) {
|
|
|
|
|
|
case 'ZoneInfo':
|
|
|
|
|
|
case 'System':
|
|
|
|
|
|
return $tz;
|
|
|
|
|
|
default:
|
|
|
|
|
|
$data = explode( ':', $tz, 2 );
|
2010-04-15 18:36:12 +00:00
|
|
|
|
if ( count( $data ) == 2 ) {
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$data[0] = intval( $data[0] );
|
|
|
|
|
|
$data[1] = intval( $data[1] );
|
|
|
|
|
|
$minDiff = abs( $data[0] ) * 60 + $data[1];
|
2013-04-20 22:49:30 +00:00
|
|
|
|
if ( $data[0] < 0 ) {
|
|
|
|
|
|
$minDiff = - $minDiff;
|
|
|
|
|
|
}
|
2009-04-24 01:31:17 +00:00
|
|
|
|
} else {
|
|
|
|
|
|
$minDiff = intval( $data[0] ) * 60;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Max is +14:00 and min is -12:00, see:
|
|
|
|
|
|
# http://en.wikipedia.org/wiki/Timezone
|
|
|
|
|
|
$minDiff = min( $minDiff, 840 ); # 14:00
|
2010-04-15 18:36:12 +00:00
|
|
|
|
$minDiff = max( $minDiff, - 720 ); # -12:00
|
|
|
|
|
|
return 'Offset|' . $minDiff;
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2010-04-15 18:36:12 +00:00
|
|
|
|
|
2011-05-28 16:32:09 +00:00
|
|
|
|
/**
|
2013-04-12 21:01:30 +00:00
|
|
|
|
* Handle the form submission if everything validated properly
|
|
|
|
|
|
*
|
2011-05-28 16:32:09 +00:00
|
|
|
|
* @param $formData
|
2012-01-13 02:27:44 +00:00
|
|
|
|
* @param $form PreferencesForm
|
2011-05-28 16:32:09 +00:00
|
|
|
|
* @param $entryPoint string
|
|
|
|
|
|
* @return bool|Status|string
|
|
|
|
|
|
*/
|
2011-10-09 11:43:06 +00:00
|
|
|
|
static function tryFormSubmit( $formData, $form, $entryPoint = 'internal' ) {
|
2012-11-21 01:39:19 +00:00
|
|
|
|
global $wgHiddenPrefs, $wgAuth;
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$user = $form->getModifiedUser();
|
2009-04-27 14:07:13 +00:00
|
|
|
|
$result = true;
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2013-06-10 19:30:43 +00:00
|
|
|
|
if ( !$user->isAllowedAny( 'editmyprivateinfo', 'editmyoptions' ) ) {
|
|
|
|
|
|
return Status::newFatal( 'mypreferencesprotected' );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
// Filter input
|
2010-04-15 18:36:12 +00:00
|
|
|
|
foreach ( array_keys( $formData ) as $name ) {
|
2009-06-21 14:16:11 +00:00
|
|
|
|
if ( isset( self::$saveFilters[$name] ) ) {
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$formData[$name] =
|
|
|
|
|
|
call_user_func( self::$saveFilters[$name], $formData[$name], $formData );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
// Fortunately, the realname field is MUCH simpler
|
2013-06-10 19:30:43 +00:00
|
|
|
|
// (not really "private", but still shouldn't be edited without permission)
|
|
|
|
|
|
if ( !in_array( 'realname', $wgHiddenPrefs ) && $user->isAllowed( 'editmyprivateinfo' ) ) {
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$realName = $formData['realname'];
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$user->setRealName( $realName );
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2013-06-10 19:30:43 +00:00
|
|
|
|
if ( $user->isAllowed( 'editmyoptions' ) ) {
|
|
|
|
|
|
foreach ( self::$saveBlacklist as $b ) {
|
|
|
|
|
|
unset( $formData[$b] );
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2013-06-10 19:30:43 +00:00
|
|
|
|
# If users have saved a value for a preference which has subsequently been disabled
|
|
|
|
|
|
# via $wgHiddenPrefs, we don't want to destroy that setting in case the preference
|
|
|
|
|
|
# is subsequently re-enabled
|
|
|
|
|
|
# TODO: maintenance script to actually delete these
|
|
|
|
|
|
foreach ( $wgHiddenPrefs as $pref ) {
|
|
|
|
|
|
# If the user has not set a non-default value here, the default will be returned
|
|
|
|
|
|
# and subsequently discarded
|
|
|
|
|
|
$formData[$pref] = $user->getOption( $pref, null, true );
|
|
|
|
|
|
}
|
2011-03-18 13:03:26 +00:00
|
|
|
|
|
2013-06-10 19:30:43 +00:00
|
|
|
|
// Keep old preferences from interfering due to back-compat code, etc.
|
|
|
|
|
|
$user->resetOptions( 'unused', $form->getContext() );
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2013-06-10 19:30:43 +00:00
|
|
|
|
foreach ( $formData as $key => $value ) {
|
|
|
|
|
|
$user->setOption( $key, $value );
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2013-06-10 19:30:43 +00:00
|
|
|
|
$user->saveSettings();
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2012-11-21 01:39:19 +00:00
|
|
|
|
$wgAuth->updateExternalDB( $user );
|
|
|
|
|
|
|
2009-04-27 14:07:13 +00:00
|
|
|
|
return $result;
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-05-28 16:32:09 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @param $formData
|
2012-01-13 02:27:44 +00:00
|
|
|
|
* @param $form PreferencesForm
|
2011-05-28 16:32:09 +00:00
|
|
|
|
* @return Status
|
|
|
|
|
|
*/
|
2011-10-09 11:43:06 +00:00
|
|
|
|
public static function tryUISubmit( $formData, $form ) {
|
|
|
|
|
|
$res = self::tryFormSubmit( $formData, $form, 'ui' );
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2010-04-15 18:36:12 +00:00
|
|
|
|
if ( $res ) {
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$urlOptions = array( 'success' => 1 );
|
2010-04-15 18:36:12 +00:00
|
|
|
|
|
|
|
|
|
|
if ( $res === 'eauth' ) {
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$urlOptions['eauth'] = 1;
|
2010-04-15 18:36:12 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$urlOptions += $form->getExtraSuccessRedirectParameters();
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$url = $form->getTitle()->getFullURL( $urlOptions );
|
2010-04-15 18:36:12 +00:00
|
|
|
|
|
2011-10-09 11:43:06 +00:00
|
|
|
|
$form->getContext()->getOutput()->redirect( $url );
|
2009-04-27 14:07:13 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2010-12-03 11:29:55 +00:00
|
|
|
|
return Status::newGood();
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-10-26 03:44:47 +00:00
|
|
|
|
/**
|
2011-07-23 00:48:39 +00:00
|
|
|
|
* Try to set a user's email address.
|
|
|
|
|
|
* This does *not* try to validate the address.
|
2013-06-10 19:30:43 +00:00
|
|
|
|
* Caller is responsible for checking $wgAuth and 'editmyprivateinfo'
|
|
|
|
|
|
* right.
|
2012-04-03 16:44:06 +00:00
|
|
|
|
*
|
|
|
|
|
|
* @deprecated in 1.20; use User::setEmailWithConfirmation() instead.
|
2011-07-23 00:48:39 +00:00
|
|
|
|
* @param $user User
|
2013-03-11 17:15:01 +00:00
|
|
|
|
* @param string $newaddr New email address
|
2011-07-23 00:48:39 +00:00
|
|
|
|
* @return Array (true on success or Status on failure, info string)
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static function trySetUserEmail( User $user, $newaddr ) {
|
2012-04-02 15:57:00 +00:00
|
|
|
|
wfDeprecated( __METHOD__, '1.20' );
|
2011-07-23 00:48:39 +00:00
|
|
|
|
|
2012-04-02 15:57:00 +00:00
|
|
|
|
$result = $user->setEmailWithConfirmation( $newaddr );
|
|
|
|
|
|
if ( $result->isGood() ) {
|
|
|
|
|
|
return array( true, $result->value );
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return array( $result, 'mailerror' );
|
2011-07-23 00:48:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2012-02-12 19:25:28 +00:00
|
|
|
|
|
|
|
|
|
|
/**
|
2013-05-11 20:04:21 +00:00
|
|
|
|
* @deprecated in 1.19
|
2012-02-12 19:25:28 +00:00
|
|
|
|
* @param $user User
|
|
|
|
|
|
* @return array
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static function loadOldSearchNs( $user ) {
|
|
|
|
|
|
wfDeprecated( __METHOD__, '1.19' );
|
|
|
|
|
|
|
|
|
|
|
|
$searchableNamespaces = SearchEngine::searchableNamespaces();
|
|
|
|
|
|
// Back compat with old format
|
|
|
|
|
|
$arr = array();
|
|
|
|
|
|
|
|
|
|
|
|
foreach ( $searchableNamespaces as $ns => $name ) {
|
|
|
|
|
|
if ( $user->getOption( 'searchNs' . $ns ) ) {
|
|
|
|
|
|
$arr[] = $ns;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return $arr;
|
|
|
|
|
|
}
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** Some tweaks to allow js prefs to work */
|
|
|
|
|
|
class PreferencesForm extends HTMLForm {
|
2011-10-31 14:41:02 +00:00
|
|
|
|
// Override default value from HTMLForm
|
|
|
|
|
|
protected $mSubSectionBeforeFields = false;
|
2011-12-11 15:31:17 +00:00
|
|
|
|
|
2011-10-09 11:43:06 +00:00
|
|
|
|
private $modifiedUser;
|
|
|
|
|
|
|
2012-01-13 02:27:44 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @param $user User
|
|
|
|
|
|
*/
|
2011-10-09 11:43:06 +00:00
|
|
|
|
public function setModifiedUser( $user ) {
|
|
|
|
|
|
$this->modifiedUser = $user;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2012-01-13 02:27:44 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @return User
|
|
|
|
|
|
*/
|
2011-10-09 11:43:06 +00:00
|
|
|
|
public function getModifiedUser() {
|
|
|
|
|
|
if ( $this->modifiedUser === null ) {
|
|
|
|
|
|
return $this->getUser();
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return $this->modifiedUser;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Get extra parameters for the query string when redirecting after
|
|
|
|
|
|
* successful save.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return array()
|
|
|
|
|
|
*/
|
|
|
|
|
|
public function getExtraSuccessRedirectParameters() {
|
|
|
|
|
|
return array();
|
|
|
|
|
|
}
|
2011-05-28 16:32:09 +00:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @param $html string
|
|
|
|
|
|
* @return String
|
|
|
|
|
|
*/
|
2009-04-24 01:31:17 +00:00
|
|
|
|
function wrapForm( $html ) {
|
|
|
|
|
|
$html = Xml::tags( 'div', array( 'id' => 'preferences' ), $html );
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
return parent::wrapForm( $html );
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-05-28 16:32:09 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @return String
|
|
|
|
|
|
*/
|
2009-04-24 01:31:17 +00:00
|
|
|
|
function getButtons() {
|
2013-06-10 19:30:43 +00:00
|
|
|
|
if ( !$this->getModifiedUser()->isAllowedAny( 'editmyprivateinfo', 'editmyoptions' ) ) {
|
|
|
|
|
|
return '';
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
$html = parent::getButtons();
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2013-06-10 19:30:43 +00:00
|
|
|
|
if ( $this->getModifiedUser()->isAllowed( 'editmyoptions' ) ) {
|
|
|
|
|
|
$t = SpecialPage::getTitleFor( 'Preferences', 'reset' );
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2013-06-10 19:30:43 +00:00
|
|
|
|
$html .= "\n" . Linker::link( $t, $this->msg( 'restoreprefs' )->escaped() );
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2013-06-10 19:30:43 +00:00
|
|
|
|
$html = Xml::tags( 'div', array( 'class' => 'mw-prefs-buttons' ), $html );
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
return $html;
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2011-05-28 16:32:09 +00:00
|
|
|
|
/**
|
2013-04-27 01:49:02 +00:00
|
|
|
|
* Separate multi-option preferences into multiple preferences, since we
|
|
|
|
|
|
* have to store them separately
|
2011-05-28 16:32:09 +00:00
|
|
|
|
* @param $data array
|
|
|
|
|
|
* @return array
|
|
|
|
|
|
*/
|
2009-04-24 01:31:17 +00:00
|
|
|
|
function filterDataForSubmit( $data ) {
|
2010-04-15 18:36:12 +00:00
|
|
|
|
foreach ( $this->mFlatFields as $fieldname => $field ) {
|
2013-04-27 01:49:02 +00:00
|
|
|
|
if ( $field instanceof HTMLNestedFilterable ) {
|
|
|
|
|
|
$info = $field->mParams;
|
2013-05-22 20:15:40 +00:00
|
|
|
|
$prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
|
2013-04-27 01:49:02 +00:00
|
|
|
|
foreach ( $field->filterDataForSubmit( $data[$fieldname] ) as $key => $value ) {
|
2013-05-22 16:58:53 +00:00
|
|
|
|
$data["$prefix$key"] = $value;
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|
|
|
|
|
|
unset( $data[$fieldname] );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2009-06-21 14:16:11 +00:00
|
|
|
|
|
2009-04-24 01:31:17 +00:00
|
|
|
|
return $data;
|
|
|
|
|
|
}
|
2012-01-13 02:27:44 +00:00
|
|
|
|
|
2011-07-08 21:12:10 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Get the whole body of the form.
|
2012-01-13 02:27:44 +00:00
|
|
|
|
* @return string
|
2011-07-08 21:12:10 +00:00
|
|
|
|
*/
|
|
|
|
|
|
function getBody() {
|
2011-08-25 09:44:20 +00:00
|
|
|
|
return $this->displaySection( $this->mFieldTree, '', 'mw-prefsection-' );
|
2011-07-08 21:12:10 +00:00
|
|
|
|
}
|
2011-12-11 15:31:17 +00:00
|
|
|
|
|
2011-10-31 12:36:51 +00:00
|
|
|
|
/**
|
2012-07-10 12:48:06 +00:00
|
|
|
|
* Get the "<legend>" for a given section key. Normally this is the
|
2011-10-31 12:36:51 +00:00
|
|
|
|
* prefs-$key message but we'll allow extensions to override it.
|
2012-01-13 02:27:44 +00:00
|
|
|
|
* @param $key string
|
|
|
|
|
|
* @return string
|
2011-10-31 12:36:51 +00:00
|
|
|
|
*/
|
|
|
|
|
|
function getLegend( $key ) {
|
|
|
|
|
|
$legend = parent::getLegend( $key );
|
2011-10-31 13:19:38 +00:00
|
|
|
|
wfRunHooks( 'PreferencesGetLegend', array( $this, $key, &$legend ) );
|
2011-10-31 12:36:51 +00:00
|
|
|
|
return $legend;
|
|
|
|
|
|
}
|
2009-04-24 01:31:17 +00:00
|
|
|
|
}
|