73 $parms = explode(
'/', $par );
74 $symsForAll = [
'*',
'user' ];
76 if ( $parms[0] !=
'' &&
77 ( in_array( $par, User::getAllGroups() ) || in_array( $par, $symsForAll ) )
79 $this->requestedGroup = $par;
80 $un = $request->getText(
'username' );
81 } elseif ( count( $parms ) == 2 ) {
82 $this->requestedGroup = $parms[0];
85 $this->requestedGroup = $request->getVal(
'group' );
86 $un = ( $par !=
'' ) ? $par : $request->getText(
'username' );
89 if ( in_array( $this->requestedGroup, $symsForAll ) ) {
90 $this->requestedGroup =
'';
92 $this->editsOnly = $request->getBool(
'editsOnly' );
93 $this->temporaryGroupsOnly = $request->getBool(
'temporaryGroupsOnly' );
94 $this->creationSort = $request->getBool(
'creationSort' );
96 $this->mDefaultDirection = $request->getBool(
'desc' )
100 $this->requestedUser =
'';
103 $username = Title::makeTitleSafe(
NS_USER, $un );
105 if ( !is_null( $username ) ) {
106 $this->requestedUser = $username->getText();
110 parent::__construct();
128 if ( !MediaWikiServices::getInstance()
130 ->userHasRight( $this->
getUser(),
'hideuser' )
132 $conds[] =
'ipb_deleted IS NULL OR ipb_deleted = 0';
137 if ( $this->requestedGroup !=
'' || $this->temporaryGroupsOnly ) {
138 $conds[] =
'ug_expiry >= ' .
$dbr->addQuotes(
$dbr->timestamp() ) .
139 ( !$this->temporaryGroupsOnly ?
' OR ug_expiry IS NULL' :
'' );
142 if ( $this->requestedGroup !=
'' ) {
146 if ( $this->requestedUser !=
'' ) {
147 # Sorted either by account creation or name
148 if ( $this->creationSort ) {
149 $conds[] =
'user_id >= ' . intval( User::idFromName( $this->requestedUser ) );
151 $conds[] =
'user_name >= ' .
$dbr->addQuotes( $this->requestedUser );
155 if ( $this->editsOnly ) {
156 $conds[] =
'user_editcount > 0';
159 $options[
'GROUP BY'] = $this->creationSort ?
'user_id' :
'user_name';
162 'tables' => [
'user',
'user_groups',
'ipblocks' ],
164 'user_name' => $this->creationSort ?
'MAX(user_name)' :
'user_name',
165 'user_id' => $this->creationSort ?
'user_id' :
'MAX(user_id)',
166 'edits' =>
'MAX(user_editcount)',
167 'creation' =>
'MIN(user_registration)',
168 'ipb_deleted' =>
'MAX(ipb_deleted)',
169 'ipb_sitewide' =>
'MAX(ipb_sitewide)'
171 'options' => $options,
173 'user_groups' => [
'LEFT JOIN',
'user_id=ug_user' ],
184 Hooks::run(
'SpecialListusersQueryInfo', [ $this, &$query ] );
194 if ( $row->user_id == 0 ) { # T18487
198 $userName = $row->user_name;
214 if ( !$this->including && count( $ugms ) > 0 ) {
216 foreach ( $ugms as $ugm ) {
219 $groups =
$lang->commaList( $list );
222 $item =
$lang->specialList( $ulinks, $groups );
224 if ( $row->ipb_deleted ) {
225 $item =
"<span class=\"deleted\">$item</span>";
229 if ( !$this->including && $this->
getConfig()->
get(
'Edititis' ) ) {
230 $count = $this->
msg(
'usereditcount' )->numParams( $row->edits )->escaped();
231 $edits = $this->
msg(
'word-separator' )->escaped() . $this->
msg(
'brackets', $count )->escaped();
235 # Some rows may be null
236 if ( !$this->including && $row->creation ) {
238 $d =
$lang->userDate( $row->creation, $user );
239 $t =
$lang->userTime( $row->creation, $user );
240 $created = $this->
msg(
'usercreated', $d,
$t, $row->user_name )->escaped();
241 $created =
' ' . $this->
msg(
'parentheses' )->rawParams( $created )->escaped();
244 $blocked = !is_null( $row->ipb_deleted ) && $row->ipb_sitewide ===
'1' ?
245 ' ' . $this->
msg(
'listusers-blocked', $userName )->escaped() :
248 Hooks::run(
'SpecialListusersFormatRow', [ &$item, $row ] );
250 return Html::rawElement(
'li', [],
"{$item}{$edits}{$created}{$blocked}" );
256 # Give some pointers to make user links
257 foreach ( $this->mResult as $row ) {
258 $batch->add(
NS_USER, $row->user_name );
260 $userIds[] = $row->user_id;
265 $groupRes =
$dbr->select(
267 UserGroupMembership::selectFields(),
268 [
'ug_user' => $userIds ],
273 foreach ( $groupRes as $row ) {
274 $ugm = UserGroupMembership::newFromRow( $row );
275 if ( !$ugm->isExpired() ) {
276 $cache[$row->ug_user][$row->ug_group] = $ugm;
277 $groups[$row->ug_group] =
true;
283 Hooks::run(
'UsersPagerDoBatchLookups', [
$dbr, $userIds, &
$cache, &$groups ] );
285 $this->userGroupCache =
$cache;
288 foreach ( $groups as $group => $unused ) {
289 $groupPage = UserGroupMembership::getGroupPage( $group );
291 $batch->addObj( $groupPage );
296 $this->mResult->rewind();
303 $self = explode(
'/', $this->
getTitle()->getPrefixedDBkey(), 2 )[0];
305 $groupOptions = [ $this->
msg(
'group-all' )->text() =>
'' ];
306 foreach ( $this->
getAllGroups() as $group => $groupText ) {
307 $groupOptions[ $groupText ] = $group;
312 'class' => HTMLUserTextField::class,
313 'label' => $this->
msg(
'listusersfrom' )->text(),
314 'name' =>
'username',
318 'label' => $this->
msg(
'group' )->text(),
321 'class' => HTMLSelectField::class,
322 'options' => $groupOptions,
326 'label' => $this->
msg(
'listusers-editsonly' )->text(),
327 'name' =>
'editsOnly',
331 'temporaryGroupsOnly' => [
333 'label' => $this->
msg(
'listusers-temporarygroupsonly' )->text(),
334 'name' =>
'temporaryGroupsOnly',
335 'id' =>
'temporaryGroupsOnly',
340 'label' => $this->
msg(
'listusers-creationsort' )->text(),
341 'name' =>
'creationSort',
342 'id' =>
'creationSort',
347 'label' => $this->
msg(
'listusers-desc' )->text(),
352 'limithiddenfield' => [
353 'class' => HTMLHiddenField::class,
359 $beforeSubmitButtonHookOut =
'';
360 Hooks::run(
'SpecialListusersHeaderForm', [ $this, &$beforeSubmitButtonHookOut ] );
362 if ( $beforeSubmitButtonHookOut !==
'' ) {
363 $formDescriptor[
'beforeSubmitButtonHookOut' ] = [
364 'class' => HTMLInfoField::class,
366 'default' => $beforeSubmitButtonHookOut
370 $formDescriptor[
'submit' ] = [
371 'class' => HTMLSubmitField::class,
372 'buttonlabel-message' =>
'listusers-submit',
375 $beforeClosingFieldsetHookOut =
'';
376 Hooks::run(
'SpecialListusersHeader', [ $this, &$beforeClosingFieldsetHookOut ] );
378 if ( $beforeClosingFieldsetHookOut !==
'' ) {
379 $formDescriptor[
'beforeClosingFieldsetHookOut' ] = [
380 'class' => HTMLInfoField::class,
382 'default' => $beforeClosingFieldsetHookOut
386 $htmlForm = HTMLForm::factory(
'ooui', $formDescriptor, $this->
getContext() );
389 ->setAction( Title::newFromText(
$self )->getLocalURL() )
390 ->setId(
'mw-listusers-form' )
391 ->setFormIdentifier(
'mw-listusers-form' )
392 ->suppressDefaultSubmit()
393 ->setWrapperLegendMsg(
'listusers' );
394 return $htmlForm->prepareForm()->getHTML(
true );