[ Index ]

PHP Cross Reference of MediaWiki-1.24.0

title

Body

[close]

/includes/specials/ -> SpecialListusers.php (source)

   1  <?php
   2  /**
   3   * Implements Special:Listusers
   4   *
   5   * Copyright © 2004 Brion Vibber, lcrocker, Tim Starling,
   6   * Domas Mituzas, Antoine Musso, Jens Frank, Zhengzhu,
   7   * 2006 Rob Church <[email protected]>
   8   *
   9   * This program is free software; you can redistribute it and/or modify
  10   * it under the terms of the GNU General Public License as published by
  11   * the Free Software Foundation; either version 2 of the License, or
  12   * (at your option) any later version.
  13   *
  14   * This program is distributed in the hope that it will be useful,
  15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17   * GNU General Public License for more details.
  18   *
  19   * You should have received a copy of the GNU General Public License along
  20   * with this program; if not, write to the Free Software Foundation, Inc.,
  21   * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  22   * http://www.gnu.org/copyleft/gpl.html
  23   *
  24   * @file
  25   * @ingroup SpecialPage
  26   */
  27  
  28  /**
  29   * This class is used to get a list of user. The ones with specials
  30   * rights (sysop, bureaucrat, developer) will have them displayed
  31   * next to their names.
  32   *
  33   * @ingroup SpecialPage
  34   */
  35  class UsersPager extends AlphabeticPager {
  36  
  37      /**
  38       * @param IContextSource $context
  39       * @param array $par (Default null)
  40       * @param bool $including Whether this page is being transcluded in
  41       * another page
  42       */
  43  	function __construct( IContextSource $context = null, $par = null, $including = null ) {
  44          if ( $context ) {
  45              $this->setContext( $context );
  46          }
  47  
  48          $request = $this->getRequest();
  49          $par = ( $par !== null ) ? $par : '';
  50          $parms = explode( '/', $par );
  51          $symsForAll = array( '*', 'user' );
  52  
  53          if ( $parms[0] != '' &&
  54              ( in_array( $par, User::getAllGroups() ) || in_array( $par, $symsForAll ) )
  55          ) {
  56              $this->requestedGroup = $par;
  57              $un = $request->getText( 'username' );
  58          } elseif ( count( $parms ) == 2 ) {
  59              $this->requestedGroup = $parms[0];
  60              $un = $parms[1];
  61          } else {
  62              $this->requestedGroup = $request->getVal( 'group' );
  63              $un = ( $par != '' ) ? $par : $request->getText( 'username' );
  64          }
  65  
  66          if ( in_array( $this->requestedGroup, $symsForAll ) ) {
  67              $this->requestedGroup = '';
  68          }
  69          $this->editsOnly = $request->getBool( 'editsOnly' );
  70          $this->creationSort = $request->getBool( 'creationSort' );
  71          $this->including = $including;
  72          $this->mDefaultDirection = $request->getBool( 'desc' )
  73              ? IndexPager::DIR_DESCENDING
  74              : IndexPager::DIR_ASCENDING;
  75  
  76          $this->requestedUser = '';
  77  
  78          if ( $un != '' ) {
  79              $username = Title::makeTitleSafe( NS_USER, $un );
  80  
  81              if ( !is_null( $username ) ) {
  82                  $this->requestedUser = $username->getText();
  83              }
  84          }
  85  
  86          parent::__construct();
  87      }
  88  
  89      /**
  90       * @return string
  91       */
  92  	function getIndexField() {
  93          return $this->creationSort ? 'user_id' : 'user_name';
  94      }
  95  
  96      /**
  97       * @return array
  98       */
  99  	function getQueryInfo() {
 100          $dbr = wfGetDB( DB_SLAVE );
 101          $conds = array();
 102  
 103          // Don't show hidden names
 104          if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
 105              $conds[] = 'ipb_deleted IS NULL OR ipb_deleted = 0';
 106          }
 107  
 108          $options = array();
 109  
 110          if ( $this->requestedGroup != '' ) {
 111              $conds['ug_group'] = $this->requestedGroup;
 112          }
 113  
 114          if ( $this->requestedUser != '' ) {
 115              # Sorted either by account creation or name
 116              if ( $this->creationSort ) {
 117                  $conds[] = 'user_id >= ' . intval( User::idFromName( $this->requestedUser ) );
 118              } else {
 119                  $conds[] = 'user_name >= ' . $dbr->addQuotes( $this->requestedUser );
 120              }
 121          }
 122  
 123          if ( $this->editsOnly ) {
 124              $conds[] = 'user_editcount > 0';
 125          }
 126  
 127          $options['GROUP BY'] = $this->creationSort ? 'user_id' : 'user_name';
 128  
 129          $query = array(
 130              'tables' => array( 'user', 'user_groups', 'ipblocks' ),
 131              'fields' => array(
 132                  'user_name' => $this->creationSort ? 'MAX(user_name)' : 'user_name',
 133                  'user_id' => $this->creationSort ? 'user_id' : 'MAX(user_id)',
 134                  'edits' => 'MAX(user_editcount)',
 135                  'numgroups' => 'COUNT(ug_group)',
 136                  'singlegroup' => 'MAX(ug_group)', // the usergroup if there is only one
 137                  'creation' => 'MIN(user_registration)',
 138                  'ipb_deleted' => 'MAX(ipb_deleted)' // block/hide status
 139              ),
 140              'options' => $options,
 141              'join_conds' => array(
 142                  'user_groups' => array( 'LEFT JOIN', 'user_id=ug_user' ),
 143                  'ipblocks' => array(
 144                      'LEFT JOIN', array(
 145                          'user_id=ipb_user',
 146                          'ipb_auto' => 0
 147                      )
 148                  ),
 149              ),
 150              'conds' => $conds
 151          );
 152  
 153          wfRunHooks( 'SpecialListusersQueryInfo', array( $this, &$query ) );
 154  
 155          return $query;
 156      }
 157  
 158      /**
 159       * @param stdClass $row
 160       * @return string
 161       */
 162  	function formatRow( $row ) {
 163          if ( $row->user_id == 0 ) { #Bug 16487
 164              return '';
 165          }
 166  
 167          $userName = $row->user_name;
 168  
 169          $ulinks = Linker::userLink( $row->user_id, $userName );
 170          $ulinks .= Linker::userToolLinksRedContribs(
 171              $row->user_id,
 172              $userName,
 173              (int)$row->edits
 174          );
 175  
 176          $lang = $this->getLanguage();
 177  
 178          $groups = '';
 179          $groups_list = self::getGroups( $row->user_id );
 180  
 181          if ( !$this->including && count( $groups_list ) > 0 ) {
 182              $list = array();
 183              foreach ( $groups_list as $group ) {
 184                  $list[] = self::buildGroupLink( $group, $userName );
 185              }
 186              $groups = $lang->commaList( $list );
 187          }
 188  
 189          $item = $lang->specialList( $ulinks, $groups );
 190  
 191          if ( $row->ipb_deleted ) {
 192              $item = "<span class=\"deleted\">$item</span>";
 193          }
 194  
 195          $edits = '';
 196          if ( !$this->including && $this->getConfig()->get( 'Edititis' ) ) {
 197              $count = $this->msg( 'usereditcount' )->numParams( $row->edits )->escaped();
 198              $edits = $this->msg( 'word-separator' )->escaped() . $this->msg( 'brackets', $count )->escaped();
 199          }
 200  
 201          $created = '';
 202          # Some rows may be null
 203          if ( !$this->including && $row->creation ) {
 204              $user = $this->getUser();
 205              $d = $lang->userDate( $row->creation, $user );
 206              $t = $lang->userTime( $row->creation, $user );
 207              $created = $this->msg( 'usercreated', $d, $t, $row->user_name )->escaped();
 208              $created = ' ' . $this->msg( 'parentheses' )->rawParams( $created )->escaped();
 209          }
 210          $blocked = !is_null( $row->ipb_deleted ) ?
 211              ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() :
 212              '';
 213  
 214          wfRunHooks( 'SpecialListusersFormatRow', array( &$item, $row ) );
 215  
 216          return Html::rawElement( 'li', array(), "{$item}{$edits}{$created}{$blocked}" );
 217      }
 218  
 219  	function doBatchLookups() {
 220          $batch = new LinkBatch();
 221          # Give some pointers to make user links
 222          foreach ( $this->mResult as $row ) {
 223              $batch->add( NS_USER, $row->user_name );
 224              $batch->add( NS_USER_TALK, $row->user_name );
 225          }
 226          $batch->execute();
 227          $this->mResult->rewind();
 228      }
 229  
 230      /**
 231       * @return string
 232       */
 233  	function getPageHeader() {
 234          list( $self ) = explode( '/', $this->getTitle()->getPrefixedDBkey() );
 235  
 236          # Form tag
 237          $out = Xml::openElement(
 238              'form',
 239              array( 'method' => 'get', 'action' => wfScript(), 'id' => 'mw-listusers-form' )
 240          ) .
 241              Xml::fieldset( $this->msg( 'listusers' )->text() ) .
 242              Html::hidden( 'title', $self );
 243  
 244          # Username field
 245          $out .= Xml::label( $this->msg( 'listusersfrom' )->text(), 'offset' ) . ' ' .
 246              Html::input(
 247                  'username',
 248                  $this->requestedUser,
 249                  'text',
 250                  array(
 251                      'id' => 'offset',
 252                      'size' => 20,
 253                      'autofocus' => $this->requestedUser === ''
 254                  )
 255              ) . ' ';
 256  
 257          # Group drop-down list
 258          $out .= Xml::label( $this->msg( 'group' )->text(), 'group' ) . ' ' .
 259              Xml::openElement( 'select', array( 'name' => 'group', 'id' => 'group' ) ) .
 260              Xml::option( $this->msg( 'group-all' )->text(), '' );
 261          foreach ( $this->getAllGroups() as $group => $groupText ) {
 262              $out .= Xml::option( $groupText, $group, $group == $this->requestedGroup );
 263          }
 264          $out .= Xml::closeElement( 'select' ) . '<br />';
 265          $out .= Xml::checkLabel(
 266              $this->msg( 'listusers-editsonly' )->text(),
 267              'editsOnly',
 268              'editsOnly',
 269              $this->editsOnly
 270          );
 271          $out .= '&#160;';
 272          $out .= Xml::checkLabel(
 273              $this->msg( 'listusers-creationsort' )->text(),
 274              'creationSort',
 275              'creationSort',
 276              $this->creationSort
 277          );
 278          $out .= '&#160;';
 279          $out .= Xml::checkLabel(
 280              $this->msg( 'listusers-desc' )->text(),
 281              'desc',
 282              'desc',
 283              $this->mDefaultDirection
 284          );
 285          $out .= '<br />';
 286  
 287          wfRunHooks( 'SpecialListusersHeaderForm', array( $this, &$out ) );
 288  
 289          # Submit button and form bottom
 290          $out .= Html::hidden( 'limit', $this->mLimit );
 291          $out .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() );
 292          wfRunHooks( 'SpecialListusersHeader', array( $this, &$out ) );
 293          $out .= Xml::closeElement( 'fieldset' ) .
 294              Xml::closeElement( 'form' );
 295  
 296          return $out;
 297      }
 298  
 299      /**
 300       * Get a list of all explicit groups
 301       * @return array
 302       */
 303  	function getAllGroups() {
 304          $result = array();
 305          foreach ( User::getAllGroups() as $group ) {
 306              $result[$group] = User::getGroupName( $group );
 307          }
 308          asort( $result );
 309  
 310          return $result;
 311      }
 312  
 313      /**
 314       * Preserve group and username offset parameters when paging
 315       * @return array
 316       */
 317  	function getDefaultQuery() {
 318          $query = parent::getDefaultQuery();
 319          if ( $this->requestedGroup != '' ) {
 320              $query['group'] = $this->requestedGroup;
 321          }
 322          if ( $this->requestedUser != '' ) {
 323              $query['username'] = $this->requestedUser;
 324          }
 325          wfRunHooks( 'SpecialListusersDefaultQuery', array( $this, &$query ) );
 326  
 327          return $query;
 328      }
 329  
 330      /**
 331       * Get a list of groups the specified user belongs to
 332       *
 333       * @param int $uid User id
 334       * @return array
 335       */
 336  	protected static function getGroups( $uid ) {
 337          $user = User::newFromId( $uid );
 338          $groups = array_diff( $user->getEffectiveGroups(), User::getImplicitGroups() );
 339  
 340          return $groups;
 341      }
 342  
 343      /**
 344       * Format a link to a group description page
 345       *
 346       * @param string $group Group name
 347       * @param string $username Username
 348       * @return string
 349       */
 350  	protected static function buildGroupLink( $group, $username ) {
 351          return User::makeGroupLinkHtml(
 352              $group,
 353              htmlspecialchars( User::getGroupMember( $group, $username ) )
 354          );
 355      }
 356  }
 357  
 358  /**
 359   * @ingroup SpecialPage
 360   */
 361  class SpecialListUsers extends IncludableSpecialPage {
 362      /**
 363       * Constructor
 364       */
 365  	public function __construct() {
 366          parent::__construct( 'Listusers' );
 367      }
 368  
 369      /**
 370       * Show the special page
 371       *
 372       * @param string $par (optional) A group to list users from
 373       */
 374  	public function execute( $par ) {
 375          $this->setHeaders();
 376          $this->outputHeader();
 377  
 378          $up = new UsersPager( $this->getContext(), $par, $this->including() );
 379  
 380          # getBody() first to check, if empty
 381          $usersbody = $up->getBody();
 382  
 383          $s = '';
 384          if ( !$this->including() ) {
 385              $s = $up->getPageHeader();
 386          }
 387  
 388          if ( $usersbody ) {
 389              $s .= $up->getNavigationBar();
 390              $s .= Html::rawElement( 'ul', array(), $usersbody );
 391              $s .= $up->getNavigationBar();
 392          } else {
 393              $s .= $this->msg( 'listusers-noresult' )->parseAsBlock();
 394          }
 395  
 396          $this->getOutput()->addHTML( $s );
 397      }
 398  
 399      /**
 400       * Return an array of subpages beginning with $search that this special page will accept.
 401       *
 402       * @param string $search Prefix to search for
 403       * @param int $limit Maximum number of results to return
 404       * @return string[] Matching subpages
 405       */
 406  	public function prefixSearchSubpages( $search, $limit = 10 ) {
 407          $subpages = User::getAllGroups();
 408          return self::prefixSearchArray( $search, $limit, $subpages );
 409      }
 410  
 411  	protected function getGroupName() {
 412          return 'users';
 413      }
 414  }
 415  
 416  /**
 417   * Redirect page: Special:ListAdmins --> Special:ListUsers/sysop.
 418   *
 419   * @ingroup SpecialPage
 420   */
 421  class SpecialListAdmins extends SpecialRedirectToSpecial {
 422  	function __construct() {
 423          parent::__construct( 'Listadmins', 'Listusers', 'sysop' );
 424      }
 425  }
 426  
 427  /**
 428   * Redirect page: Special:ListBots --> Special:ListUsers/bot.
 429   *
 430   * @ingroup SpecialPage
 431   */
 432  class SpecialListBots extends SpecialRedirectToSpecial {
 433  	function __construct() {
 434          parent::__construct( 'Listbots', 'Listusers', 'bot' );
 435      }
 436  }


Generated: Fri Nov 28 14:03:12 2014 Cross-referenced by PHPXref 0.7.1