*/
class UsersPager extends AlphabeticPager {
+ /**
+ * @var array A array with user ids as key and a array of groups as value
+ */
+ protected $userGroupCache;
+
/**
* @param IContextSource $context
* @param array $par (Default null)
'user_name' => $this->creationSort ? 'MAX(user_name)' : 'user_name',
'user_id' => $this->creationSort ? 'user_id' : 'MAX(user_id)',
'edits' => 'MAX(user_editcount)',
- 'numgroups' => 'COUNT(ug_group)',
- 'singlegroup' => 'MAX(ug_group)', // the usergroup if there is only one
'creation' => 'MIN(user_registration)',
'ipb_deleted' => 'MAX(ipb_deleted)' // block/hide status
),
'conds' => $conds
);
- wfRunHooks( 'SpecialListusersQueryInfo', array( $this, &$query ) );
+ Hooks::run( 'SpecialListusersQueryInfo', array( $this, &$query ) );
return $query;
}
* @return string
*/
function formatRow( $row ) {
- if ( $row->user_id == 0 ) { #Bug 16487
+ if ( $row->user_id == 0 ) { # Bug 16487
return '';
}
$lang = $this->getLanguage();
$groups = '';
- $groups_list = self::getGroups( $row->user_id );
+ $groups_list = self::getGroups( intval( $row->user_id ), $this->userGroupCache );
if ( !$this->including && count( $groups_list ) > 0 ) {
$list = array();
' ' . $this->msg( 'listusers-blocked', $userName )->escaped() :
'';
- wfRunHooks( 'SpecialListusersFormatRow', array( &$item, $row ) );
+ Hooks::run( 'SpecialListusersFormatRow', array( &$item, $row ) );
return Html::rawElement( 'li', array(), "{$item}{$edits}{$created}{$blocked}" );
}
function doBatchLookups() {
$batch = new LinkBatch();
+ $userIds = array();
# Give some pointers to make user links
foreach ( $this->mResult as $row ) {
$batch->add( NS_USER, $row->user_name );
$batch->add( NS_USER_TALK, $row->user_name );
+ $userIds[] = $row->user_id;
+ }
+
+ // Lookup groups for all the users
+ $dbr = wfGetDB( DB_SLAVE );
+ $groupRes = $dbr->select(
+ 'user_groups',
+ array( 'ug_user', 'ug_group' ),
+ array( 'ug_user' => $userIds ),
+ __METHOD__
+ );
+ $cache = array();
+ $groups = array();
+ foreach ( $groupRes as $row ) {
+ $cache[intval( $row->ug_user )][] = $row->ug_group;
+ $groups[$row->ug_group] = true;
}
+ $this->userGroupCache = $cache;
+
+ // Add page of groups to link batch
+ foreach ( $groups as $group => $unused ) {
+ $groupPage = User::getGroupPage( $group );
+ if ( $groupPage ) {
+ $batch->addObj( $groupPage );
+ }
+ }
+
$batch->execute();
$this->mResult->rewind();
}
function getPageHeader() {
list( $self ) = explode( '/', $this->getTitle()->getPrefixedDBkey() );
+ $this->getOutput()->addModules( 'mediawiki.userSuggest' );
+
# Form tag
$out = Xml::openElement(
'form',
Xml::fieldset( $this->msg( 'listusers' )->text() ) .
Html::hidden( 'title', $self );
- # Username field
+ # Username field (with autocompletion support)
$out .= Xml::label( $this->msg( 'listusersfrom' )->text(), 'offset' ) . ' ' .
Html::input(
'username',
$this->requestedUser,
'text',
array(
+ 'class' => 'mw-autocomplete-user',
'id' => 'offset',
'size' => 20,
'autofocus' => $this->requestedUser === ''
) . ' ';
# Group drop-down list
- $out .= Xml::label( $this->msg( 'group' )->text(), 'group' ) . ' ' .
- Xml::openElement( 'select', array( 'name' => 'group', 'id' => 'group' ) ) .
- Xml::option( $this->msg( 'group-all' )->text(), '' );
+ $sel = new XmlSelect( 'group', 'group', $this->requestedGroup );
+ $sel->addOption( $this->msg( 'group-all' )->text(), '' );
foreach ( $this->getAllGroups() as $group => $groupText ) {
- $out .= Xml::option( $groupText, $group, $group == $this->requestedGroup );
+ $sel->addOption( $groupText, $group );
}
- $out .= Xml::closeElement( 'select' ) . '<br />';
+
+ $out .= Xml::label( $this->msg( 'group' )->text(), 'group' ) . ' ';
+ $out .= $sel->getHTML() . '<br />';
$out .= Xml::checkLabel(
$this->msg( 'listusers-editsonly' )->text(),
'editsOnly',
);
$out .= '<br />';
- wfRunHooks( 'SpecialListusersHeaderForm', array( $this, &$out ) );
+ Hooks::run( 'SpecialListusersHeaderForm', array( $this, &$out ) );
# Submit button and form bottom
$out .= Html::hidden( 'limit', $this->mLimit );
- $out .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() );
- wfRunHooks( 'SpecialListusersHeader', array( $this, &$out ) );
+ $out .= Xml::submitButton( $this->msg( 'listusers-submit' )->text() );
+ Hooks::run( 'SpecialListusersHeader', array( $this, &$out ) );
$out .= Xml::closeElement( 'fieldset' ) .
Xml::closeElement( 'form' );
if ( $this->requestedUser != '' ) {
$query['username'] = $this->requestedUser;
}
- wfRunHooks( 'SpecialListusersDefaultQuery', array( $this, &$query ) );
+ Hooks::run( 'SpecialListusersDefaultQuery', array( $this, &$query ) );
return $query;
}
* Get a list of groups the specified user belongs to
*
* @param int $uid User id
+ * @param array|null $cache
* @return array
*/
- protected static function getGroups( $uid ) {
- $user = User::newFromId( $uid );
- $groups = array_diff( $user->getEffectiveGroups(), User::getImplicitGroups() );
+ protected static function getGroups( $uid, $cache = null ) {
+ if ( $cache === null ) {
+ $user = User::newFromId( $uid );
+ $effectiveGroups = $user->getEffectiveGroups();
+ } else {
+ $effectiveGroups = isset( $cache[$uid] ) ? $cache[$uid] : array();
+ }
+ $groups = array_diff( $effectiveGroups, User::getImplicitGroups() );
return $groups;
}
protected static function buildGroupLink( $group, $username ) {
return User::makeGroupLinkHtml(
$group,
- htmlspecialchars( User::getGroupMember( $group, $username ) )
+ User::getGroupMember( $group, $username )
);
}
}
}
/**
- * Return an array of subpages beginning with $search that this special page will accept.
+ * Return an array of subpages that this special page will accept.
*
- * @param string $search Prefix to search for
- * @param int $limit Maximum number of results to return
- * @return string[] Matching subpages
+ * @return string[] subpages
*/
- public function prefixSearchSubpages( $search, $limit = 10 ) {
- $subpages = User::getAllGroups();
- return self::prefixSearchArray( $search, $limit, $subpages );
+ public function getSubpagesForPrefixSearch() {
+ return User::getAllGroups();
}
protected function getGroupName() {