[ Index ]

PHP Cross Reference of MediaWiki-1.24.0

title

Body

[close]

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

   1  <?php
   2  /**
   3   * Implements Special:Categories
   4   *
   5   * This program is free software; you can redistribute it and/or modify
   6   * it under the terms of the GNU General Public License as published by
   7   * the Free Software Foundation; either version 2 of the License, or
   8   * (at your option) any later version.
   9   *
  10   * This program is distributed in the hope that it will be useful,
  11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13   * GNU General Public License for more details.
  14   *
  15   * You should have received a copy of the GNU General Public License along
  16   * with this program; if not, write to the Free Software Foundation, Inc.,
  17   * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  18   * http://www.gnu.org/copyleft/gpl.html
  19   *
  20   * @file
  21   * @ingroup SpecialPage
  22   */
  23  
  24  /**
  25   * @ingroup SpecialPage
  26   */
  27  class SpecialCategories extends SpecialPage {
  28  
  29      /**
  30       * @var PageLinkRenderer
  31       */
  32      protected $linkRenderer = null;
  33  
  34  	public function __construct() {
  35          parent::__construct( 'Categories' );
  36  
  37          // Since we don't control the constructor parameters, we can't inject services that way.
  38          // Instead, we initialize services in the execute() method, and allow them to be overridden
  39          // using the initServices() method.
  40      }
  41  
  42      /**
  43       * Initialize or override the PageLinkRenderer SpecialCategories collaborates with.
  44       * Useful mainly for testing.
  45       *
  46       * @todo the pager should also be injected, and de-coupled from the rendering logic.
  47       *
  48       * @param PageLinkRenderer $linkRenderer
  49       */
  50  	public function setPageLinkRenderer(
  51          PageLinkRenderer $linkRenderer
  52      ) {
  53          $this->linkRenderer = $linkRenderer;
  54      }
  55  
  56      /**
  57       * Initialize any services we'll need (unless it has already been provided via a setter).
  58       * This allows for dependency injection even though we don't control object creation.
  59       */
  60  	private function initServices() {
  61          if ( !$this->linkRenderer ) {
  62              $lang = $this->getContext()->getLanguage();
  63              $titleFormatter = new MediaWikiTitleCodec( $lang, GenderCache::singleton() );
  64              $this->linkRenderer = new MediaWikiPageLinkRenderer( $titleFormatter );
  65          }
  66      }
  67  
  68  	public function execute( $par ) {
  69          $this->initServices();
  70  
  71          $this->setHeaders();
  72          $this->outputHeader();
  73          $this->getOutput()->allowClickjacking();
  74  
  75          $from = $this->getRequest()->getText( 'from', $par );
  76  
  77          $cap = new CategoryPager( $this->getContext(), $from, $this->linkRenderer );
  78          $cap->doQuery();
  79  
  80          $this->getOutput()->addHTML(
  81              Html::openElement( 'div', array( 'class' => 'mw-spcontent' ) ) .
  82                  $this->msg( 'categoriespagetext', $cap->getNumRows() )->parseAsBlock() .
  83                  $cap->getStartForm( $from ) .
  84                  $cap->getNavigationBar() .
  85                  '<ul>' . $cap->getBody() . '</ul>' .
  86                  $cap->getNavigationBar() .
  87                  Html::closeElement( 'div' )
  88          );
  89      }
  90  
  91  	protected function getGroupName() {
  92          return 'pages';
  93      }
  94  }
  95  
  96  /**
  97   * TODO: Allow sorting by count.  We need to have a unique index to do this
  98   * properly.
  99   *
 100   * @ingroup SpecialPage Pager
 101   */
 102  class CategoryPager extends AlphabeticPager {
 103  
 104      /**
 105       * @var PageLinkRenderer
 106       */
 107      protected $linkRenderer;
 108  
 109      /**
 110       * @param IContextSource $context
 111       * @param string $from
 112       * @param PageLinkRenderer $linkRenderer
 113       */
 114  	public function __construct( IContextSource $context, $from, PageLinkRenderer $linkRenderer
 115      ) {
 116          parent::__construct( $context );
 117          $from = str_replace( ' ', '_', $from );
 118          if ( $from !== '' ) {
 119              $from = Title::capitalize( $from, NS_CATEGORY );
 120              $this->setOffset( $from );
 121              $this->setIncludeOffset( true );
 122          }
 123  
 124          $this->linkRenderer = $linkRenderer;
 125      }
 126  
 127  	function getQueryInfo() {
 128          return array(
 129              'tables' => array( 'category' ),
 130              'fields' => array( 'cat_title', 'cat_pages' ),
 131              'conds' => array( 'cat_pages > 0' ),
 132              'options' => array( 'USE INDEX' => 'cat_title' ),
 133          );
 134      }
 135  
 136  	function getIndexField() {
 137  #        return array( 'abc' => 'cat_title', 'count' => 'cat_pages' );
 138          return 'cat_title';
 139      }
 140  
 141  	function getDefaultQuery() {
 142          parent::getDefaultQuery();
 143          unset( $this->mDefaultQuery['from'] );
 144  
 145          return $this->mDefaultQuery;
 146      }
 147  
 148  #    protected function getOrderTypeMessages() {
 149  #        return array( 'abc' => 'special-categories-sort-abc',
 150  #            'count' => 'special-categories-sort-count' );
 151  #    }
 152  
 153  	protected function getDefaultDirections() {
 154  #        return array( 'abc' => false, 'count' => true );
 155          return false;
 156      }
 157  
 158      /* Override getBody to apply LinksBatch on resultset before actually outputting anything. */
 159  	public function getBody() {
 160          $batch = new LinkBatch;
 161  
 162          $this->mResult->rewind();
 163  
 164          foreach ( $this->mResult as $row ) {
 165              $batch->addObj( Title::makeTitleSafe( NS_CATEGORY, $row->cat_title ) );
 166          }
 167          $batch->execute();
 168          $this->mResult->rewind();
 169  
 170          return parent::getBody();
 171      }
 172  
 173  	function formatRow( $result ) {
 174          $title = new TitleValue( NS_CATEGORY, $result->cat_title );
 175          $text = $title->getText();
 176          $link = $this->linkRenderer->renderHtmlLink( $title, $text );
 177  
 178          $count = $this->msg( 'nmembers' )->numParams( $result->cat_pages )->escaped();
 179          return Html::rawElement( 'li', null, $this->getLanguage()->specialList( $link, $count ) ) . "\n";
 180      }
 181  
 182  	public function getStartForm( $from ) {
 183          return Xml::tags(
 184              'form',
 185              array( 'method' => 'get', 'action' => wfScript() ),
 186              Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
 187                  Xml::fieldset(
 188                      $this->msg( 'categories' )->text(),
 189                      Xml::inputLabel(
 190                          $this->msg( 'categoriesfrom' )->text(),
 191                          'from', 'from', 20, $from ) .
 192                          ' ' .
 193                          Xml::submitButton( $this->msg( 'allpagessubmit' )->text()
 194                          )
 195                  )
 196          );
 197      }
 198  }


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