X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fapi%2FApiQuery.php;h=866b71c25fd38bafd016d3738745f39afe219d8f;hb=3d58f903d84426658300d17da5ccd0e1f2557de5;hp=89689d80c27ec157fb3a9f3f6f48345915e60167;hpb=135d0998b6e539d7696c322962176c0fa3dd9477;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/api/ApiQuery.php b/includes/api/ApiQuery.php index 89689d80c2..866b71c25f 100644 --- a/includes/api/ApiQuery.php +++ b/includes/api/ApiQuery.php @@ -24,11 +24,6 @@ * @file */ -if ( !defined( 'MEDIAWIKI' ) ) { - // Eclipse helper - will be ignored in production - require_once( 'ApiBase.php' ); -} - /** * This is the main query class. It behaves similar to ApiMain: based on the * parameters given, it will create a list of titles to work on (an ApiPageSet @@ -49,7 +44,7 @@ class ApiQuery extends ApiBase { */ private $mPageSet; - private $params, $redirects, $convertTitles; + private $params, $redirects, $convertTitles, $iwUrl; private $mQueryPropModules = array( 'info' => 'ApiQueryInfo', @@ -69,8 +64,8 @@ class ApiQuery extends ApiBase { ); private $mQueryListModules = array( - 'allimages' => 'ApiQueryAllimages', - 'allpages' => 'ApiQueryAllpages', + 'allimages' => 'ApiQueryAllImages', + 'allpages' => 'ApiQueryAllPages', 'alllinks' => 'ApiQueryAllLinks', 'allcategories' => 'ApiQueryAllCategories', 'allusers' => 'ApiQueryAllUsers', @@ -82,6 +77,7 @@ class ApiQuery extends ApiBase { 'filearchive' => 'ApiQueryFilearchive', 'imageusage' => 'ApiQueryBacklinks', 'iwbacklinks' => 'ApiQueryIWBacklinks', + 'langbacklinks' => 'ApiQueryLangBacklinks', 'logevents' => 'ApiQueryLogEvents', 'recentchanges' => 'ApiQueryRecentChanges', 'search' => 'ApiQuerySearch', @@ -99,12 +95,14 @@ class ApiQuery extends ApiBase { private $mQueryMetaModules = array( 'siteinfo' => 'ApiQuerySiteinfo', 'userinfo' => 'ApiQueryUserInfo', - 'allmessages' => 'ApiQueryAllmessages', + 'allmessages' => 'ApiQueryAllMessages', ); private $mSlaveDB = null; private $mNamedDB = array(); + protected $mAllowedGenerators = array(); + public function __construct( $main, $action ) { parent::__construct( $main, $action ); @@ -118,9 +116,8 @@ class ApiQuery extends ApiBase { $this->mListModuleNames = array_keys( $this->mQueryListModules ); $this->mMetaModuleNames = array_keys( $this->mQueryMetaModules ); - // Allow the entire list of modules at first, - // but during module instantiation check if it can be used as a generator. - $this->mAllowedGenerators = array_merge( $this->mListModuleNames, $this->mPropModuleNames ); + $this->makeHelpMsgHelper( $this->mQueryPropModules, 'prop' ); + $this->makeHelpMsgHelper( $this->mQueryListModules, 'list' ); } /** @@ -138,7 +135,7 @@ class ApiQuery extends ApiBase { /** * Gets a default slave database connection object - * @return Database + * @return DatabaseBase */ public function getDB() { if ( !isset( $this->mSlaveDB ) ) { @@ -157,7 +154,7 @@ class ApiQuery extends ApiBase { * @param $name string Name to assign to the database connection * @param $db int One of the DB_* constants * @param $groups array Query groups - * @return Database + * @return DatabaseBase */ public function getNamedDB( $name, $db, $groups ) { if ( !array_key_exists( $name, $this->mNamedDB ) ) { @@ -178,7 +175,7 @@ class ApiQuery extends ApiBase { /** * Get the array mapping module names to class names - * @return array(modulename => classname) + * @return array array(modulename => classname) */ function getModules() { return array_merge( $this->mQueryPropModules, $this->mQueryListModules, $this->mQueryMetaModules ); @@ -231,6 +228,7 @@ class ApiQuery extends ApiBase { $this->params = $this->extractRequestParams(); $this->redirects = $this->params['redirects']; $this->convertTitles = $this->params['converttitles']; + $this->iwUrl = $this->params['iwurl']; // Create PageSet $this->mPageSet = new ApiPageSet( $this, $this->redirects, $this->convertTitles ); @@ -278,6 +276,10 @@ class ApiQuery extends ApiBase { * Update a cache mode string, applying the cache mode of a new module to it. * The cache mode may increase in the level of privacy, but public modules * added to private data do not decrease the level of privacy. + * + * @param $cacheMode string + * @param $modCacheMode string + * @return string */ protected function mergeCacheMode( $cacheMode, $modCacheMode ) { if ( $modCacheMode === 'anon-public-user-private' ) { @@ -313,9 +315,8 @@ class ApiQuery extends ApiBase { * @param $moduleList Array array(modulename => classname) */ private function instantiateModules( &$modules, $param, $moduleList ) { - $list = @$this->params[$param]; - if ( !is_null ( $list ) ) { - foreach ( $list as $moduleName ) { + if ( isset( $this->params[$param] ) ) { + foreach ( $this->params[$param] as $moduleName ) { $modules[] = new $moduleList[$moduleName] ( $this, $moduleName ); } } @@ -365,10 +366,15 @@ class ApiQuery extends ApiBase { // Interwiki titles $intrwValues = array(); foreach ( $pageSet->getInterwikiTitles() as $rawTitleStr => $interwikiStr ) { - $intrwValues[] = array( + $item = array( 'title' => $rawTitleStr, - 'iw' => $interwikiStr + 'iw' => $interwikiStr, ); + if ( $this->iwUrl ) { + $title = Title::newFromText( $rawTitleStr ); + $item['url'] = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT ); + } + $intrwValues[] = $item; } if ( count( $intrwValues ) ) { @@ -378,11 +384,15 @@ class ApiQuery extends ApiBase { // Show redirect information $redirValues = array(); - foreach ( $pageSet->getRedirectTitles() as $titleStrFrom => $titleStrTo ) { - $redirValues[] = array( + foreach ( $pageSet->getRedirectTitles() as $titleStrFrom => $titleTo ) { + $r = array( 'from' => strval( $titleStrFrom ), - 'to' => $titleStrTo + 'to' => $titleTo->getPrefixedText(), ); + if ( $titleTo->getFragment() !== '' ) { + $r['tofragment'] = $titleTo->getFragment(); + } + $redirValues[] = $r; } if ( count( $redirValues ) ) { @@ -429,8 +439,8 @@ class ApiQuery extends ApiBase { $vals = array(); ApiQueryBase::addTitleInfo( $vals, $title ); $vals['special'] = ''; - if ( $title->getNamespace() == NS_SPECIAL && - !SpecialPage::exists( $title->getText() ) ) { + if ( $title->isSpecialPage() && + !SpecialPageFactory::exists( $title->getDbKey() ) ) { $vals['missing'] = ''; } elseif ( $title->getNamespace() == NS_MEDIA && !wfFindFile( $title ) ) { @@ -473,15 +483,11 @@ class ApiQuery extends ApiBase { $titles = $pageSet->getGoodTitles(); if ( count( $titles ) ) { foreach ( $titles as $title ) { - if ( $title->userCanRead() ) { + if ( $title->userCan( 'read' ) ) { $exportTitles[] = $title; } } } - // only export when there are titles - if ( !count( $exportTitles ) ) { - return; - } $exporter = new WikiExporter( $this->getDB() ); // WikiExporter writes to stdout, so catch its @@ -584,6 +590,7 @@ class ApiQuery extends ApiBase { 'indexpageids' => false, 'export' => false, 'exportnowrap' => false, + 'iwurl' => false, ); } @@ -592,8 +599,6 @@ class ApiQuery extends ApiBase { * @return string */ public function makeHelpMsg() { - $msg = ''; - // Make sure the internal object is empty // (just in case a sub-module decides to optimize during instantiation) $this->mPageSet = null; @@ -601,7 +606,7 @@ class ApiQuery extends ApiBase { $querySeparator = str_repeat( '--- ', 12 ); $moduleSeparator = str_repeat( '*** ', 14 ); - $msg .= "\n$querySeparator Query: Prop $querySeparator\n\n"; + $msg = "\n$querySeparator Query: Prop $querySeparator\n\n"; $msg .= $this->makeHelpMsgHelper( $this->mQueryPropModules, 'prop' ); $msg .= "\n$querySeparator Query: List $querySeparator\n\n"; $msg .= $this->makeHelpMsgHelper( $this->mQueryListModules, 'list' ); @@ -627,7 +632,10 @@ class ApiQuery extends ApiBase { $moduleDescriptions = array(); foreach ( $moduleList as $moduleName => $moduleClass ) { - $module = new $moduleClass ( $this, $moduleName, null ); + /** + * @var $module ApiQueryBase + */ + $module = new $moduleClass( $this, $moduleName, null ); $msg = ApiMain::makeHelpMsgHeader( $module, $paramName ); $msg2 = $module->makeHelpMsg(); @@ -666,10 +674,11 @@ class ApiQuery extends ApiBase { 'NOTE: generator parameter names must be prefixed with a \'g\', see examples' ), 'redirects' => 'Automatically resolve redirects', 'converttitles' => array( "Convert titles to other variants if necessary. Only works if the wiki's content language supports variant conversion.", - 'Languages that support variant conversion include kk, ku, gan, tg, sr, zh' ), + 'Languages that support variant conversion include gan, iu, kk, ku, shi, sr, tg, zh' ), 'indexpageids' => 'Include an additional pageids section listing all returned page IDs', 'export' => 'Export the current revisions of all given or generated pages', 'exportnowrap' => 'Return the export XML without wrapping it in an XML result (same format as Special:Export). Can only be used with export', + 'iwurl' => 'Whether to get the full URL if the title is an interwiki link', ); } @@ -687,13 +696,21 @@ class ApiQuery extends ApiBase { ) ); } - protected function getExamples() { + public function getExamples() { return array( 'api.php?action=query&prop=revisions&meta=siteinfo&titles=Main%20Page&rvprop=user|comment', 'api.php?action=query&generator=allpages&gapprefix=API/&prop=revisions', ); } + public function getHelpUrls() { + return array( + 'https://www.mediawiki.org/wiki/API:Meta', + 'https://www.mediawiki.org/wiki/API:Properties', + 'https://www.mediawiki.org/wiki/API:Lists', + ); + } + public function getVersion() { $psModule = new ApiPageSet( $this ); $vers = array();