[ Index ]

PHP Cross Reference of MediaWiki-1.24.0

title

Body

[close]

/includes/api/ -> ApiQueryImages.php (source)

   1  <?php
   2  /**
   3   *
   4   *
   5   * Created on May 13, 2007
   6   *
   7   * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
   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   */
  26  
  27  /**
  28   * This query adds an "<images>" subelement to all pages with the list of
  29   * images embedded into those pages.
  30   *
  31   * @ingroup API
  32   */
  33  class ApiQueryImages extends ApiQueryGeneratorBase {
  34  
  35  	public function __construct( ApiQuery $query, $moduleName ) {
  36          parent::__construct( $query, $moduleName, 'im' );
  37      }
  38  
  39  	public function execute() {
  40          $this->run();
  41      }
  42  
  43  	public function executeGenerator( $resultPageSet ) {
  44          $this->run( $resultPageSet );
  45      }
  46  
  47      /**
  48       * @param ApiPageSet $resultPageSet
  49       */
  50  	private function run( $resultPageSet = null ) {
  51          if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
  52              return; // nothing to do
  53          }
  54  
  55          $params = $this->extractRequestParams();
  56          $this->addFields( array(
  57              'il_from',
  58              'il_to'
  59          ) );
  60  
  61          $this->addTables( 'imagelinks' );
  62          $this->addWhereFld( 'il_from', array_keys( $this->getPageSet()->getGoodTitles() ) );
  63          if ( !is_null( $params['continue'] ) ) {
  64              $cont = explode( '|', $params['continue'] );
  65              $this->dieContinueUsageIf( count( $cont ) != 2 );
  66              $op = $params['dir'] == 'descending' ? '<' : '>';
  67              $ilfrom = intval( $cont[0] );
  68              $ilto = $this->getDB()->addQuotes( $cont[1] );
  69              $this->addWhere(
  70                  "il_from $op $ilfrom OR " .
  71                  "(il_from = $ilfrom AND " .
  72                  "il_to $op= $ilto)"
  73              );
  74          }
  75  
  76          $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
  77          // Don't order by il_from if it's constant in the WHERE clause
  78          if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
  79              $this->addOption( 'ORDER BY', 'il_to' . $sort );
  80          } else {
  81              $this->addOption( 'ORDER BY', array(
  82                  'il_from' . $sort,
  83                  'il_to' . $sort
  84              ) );
  85          }
  86          $this->addOption( 'LIMIT', $params['limit'] + 1 );
  87  
  88          if ( !is_null( $params['images'] ) ) {
  89              $images = array();
  90              foreach ( $params['images'] as $img ) {
  91                  $title = Title::newFromText( $img );
  92                  if ( !$title || $title->getNamespace() != NS_FILE ) {
  93                      $this->setWarning( "\"$img\" is not a file" );
  94                  } else {
  95                      $images[] = $title->getDBkey();
  96                  }
  97              }
  98              $this->addWhereFld( 'il_to', $images );
  99          }
 100  
 101          $res = $this->select( __METHOD__ );
 102  
 103          if ( is_null( $resultPageSet ) ) {
 104              $count = 0;
 105              foreach ( $res as $row ) {
 106                  if ( ++$count > $params['limit'] ) {
 107                      // We've reached the one extra which shows that
 108                      // there are additional pages to be had. Stop here...
 109                      $this->setContinueEnumParameter( 'continue', $row->il_from . '|' . $row->il_to );
 110                      break;
 111                  }
 112                  $vals = array();
 113                  ApiQueryBase::addTitleInfo( $vals, Title::makeTitle( NS_FILE, $row->il_to ) );
 114                  $fit = $this->addPageSubItem( $row->il_from, $vals );
 115                  if ( !$fit ) {
 116                      $this->setContinueEnumParameter( 'continue', $row->il_from . '|' . $row->il_to );
 117                      break;
 118                  }
 119              }
 120          } else {
 121              $titles = array();
 122              $count = 0;
 123              foreach ( $res as $row ) {
 124                  if ( ++$count > $params['limit'] ) {
 125                      // We've reached the one extra which shows that
 126                      // there are additional pages to be had. Stop here...
 127                      $this->setContinueEnumParameter( 'continue', $row->il_from . '|' . $row->il_to );
 128                      break;
 129                  }
 130                  $titles[] = Title::makeTitle( NS_FILE, $row->il_to );
 131              }
 132              $resultPageSet->populateFromTitles( $titles );
 133          }
 134      }
 135  
 136  	public function getCacheMode( $params ) {
 137          return 'public';
 138      }
 139  
 140  	public function getAllowedParams() {
 141          return array(
 142              'limit' => array(
 143                  ApiBase::PARAM_DFLT => 10,
 144                  ApiBase::PARAM_TYPE => 'limit',
 145                  ApiBase::PARAM_MIN => 1,
 146                  ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
 147                  ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
 148              ),
 149              'continue' => null,
 150              'images' => array(
 151                  ApiBase::PARAM_ISMULTI => true,
 152              ),
 153              'dir' => array(
 154                  ApiBase::PARAM_DFLT => 'ascending',
 155                  ApiBase::PARAM_TYPE => array(
 156                      'ascending',
 157                      'descending'
 158                  )
 159              ),
 160          );
 161      }
 162  
 163  	public function getParamDescription() {
 164          return array(
 165              'limit' => 'How many images to return',
 166              'continue' => 'When more results are available, use this to continue',
 167              'images' => 'Only list these images. Useful for checking whether a ' .
 168                  'certain page has a certain Image.',
 169              'dir' => 'The direction in which to list',
 170          );
 171      }
 172  
 173  	public function getDescription() {
 174          return 'Returns all images contained on the given page(s).';
 175      }
 176  
 177  	public function getExamples() {
 178          return array(
 179              'api.php?action=query&prop=images&titles=Main%20Page'
 180                  => 'Get a list of images used in the [[Main Page]]',
 181              'api.php?action=query&generator=images&titles=Main%20Page&prop=info'
 182                  => 'Get information about all images used in the [[Main Page]]',
 183          );
 184      }
 185  
 186  	public function getHelpUrls() {
 187          return 'https://www.mediawiki.org/wiki/API:Properties#images_.2F_im';
 188      }
 189  }


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