API: Transform into a standalone module instead of a query submodule.

Change-Id: Ia858fa43a50ade947e6353d22dc89a519c3da61a
This commit is contained in:
Timo Tijhof 2013-03-27 21:08:57 +01:00
parent 5d0f0b78fd
commit 30b4a592c6
3 changed files with 142 additions and 87 deletions

View file

@ -28,16 +28,16 @@ $dir = __DIR__;
$wgExtensionMessagesFiles['TemplateData'] = $dir . '/TemplateData.i18n.php';
$wgAutoloadClasses['TemplateDataHooks'] = $dir . '/TemplateData.hooks.php';
$wgAutoloadClasses['TemplateDataBlob'] = $dir . '/TemplateDataBlob.php';
$wgAutoloadClasses['ApiQueryTemplateData'] = $dir . '/api/ApiQueryTemplateData.php';
$wgAutoloadClasses['ApiTemplateData'] = $dir . '/api/ApiTemplateData.php';
// Register hooks
$wgHooks['ParserFirstCallInit'][] = 'TemplateDataHooks::onParserFirstCallInit';
$wgHooks['PageContentSave'][] = 'TemplateDataHooks::onPageContentSave';
// Register API actions
$wgAPIPropModules['templatedata'] = 'ApiQueryTemplateData';
// Register APIs
$wgAPIModules['templatedata'] = 'ApiTemplateData';
// Register page_props
// Register page properties
$wgPageProps['templatedata'] = 'Content of <templatedata> tag';
// Register modules

View file

@ -1,83 +0,0 @@
<?php
/**
* Implement the 'templatedata' query module in the API.
* Format JSON only.
*
* @ingroup API
* @emits error.code templatedata-corrupt
*/
class ApiQueryTemplateData extends ApiQueryBase {
public function __construct( $query, $module ) {
parent::__construct( $query, $module, 'td' );
}
/**
* TODO: This currently outputs it in an ugly '*' property
* and it fails in formats like XML (works in JSON/YAML).
*/
public function execute() {
$params = $this->extractRequestParams();
$titles = $this->getPageSet()->getGoodTitles(); // page_id => Title object
if ( !count( $titles ) ) {
return;
}
$this->addTables( 'page_props' );
$this->addFields( array( 'pp_page', 'pp_value' ) );
$this->addWhere( array(
'pp_page' => array_keys( $titles ),
'pp_propname' => 'templatedata'
) );
$this->addOption( 'ORDER BY', 'pp_page' );
if ( $params['continue'] !== null ) {
$fromid = intval( $params['continue'] );
$this->addWhere( "pp_page >= $fromid" );
}
$res = $this->select( __METHOD__ );
foreach ( $res as $row ) {
$rawData = $row->pp_value;
$data = json_decode( $rawData );
if ( !$data ) {
$this->dieUsage( 'Database data is corrupted.', 'templatedata-corrupt' );
}
$value = array();
ApiResult::setContent( $value, $data->params, 'params' );
$fit = $this->addPageSubItems( $row->pp_page, $value );
if ( !$fit ) {
$this->setContinueEnumParameter( 'continue', $row->pp_page );
break;
}
}
}
public function getAllowedParams() {
return array(
'continue' => null,
);
}
public function getParamDescription() {
return array(
'continue' => 'When more results are available, use this to continue',
);
}
public function getDescription() {
return 'Data stored by the TemplateData extension (https://www.mediawiki.org/Extension:TemplateData)';
}
// getPossibleErrors() is provided by ApiQueryBase
protected function getExamples() {
return array(
'api.php?action=query&prop=templatedata&titles=Template:Stub|Template:Example',
);
}
}

138
api/ApiTemplateData.php Normal file
View file

@ -0,0 +1,138 @@
<?php
/**
* Implement the 'templatedata' query module in the API.
* Format JSON only.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
*/
/**
* @ingroup API
* @emits error.code templatedata-corrupt
*/
class ApiTemplateData extends ApiBase {
/**
* Override built-in handling of format parameter.
* Only JSON is supported.
*
* @return ApiFormatBase
*/
public function getCustomPrinter() {
$params = $this->extractRequestParams();
$format = $params['format'];
$allowed = array( 'json', 'jsonfm' );
if ( in_array( $format, $allowed ) ) {
return $this->getMain()->createPrinterByName( $format );
}
return $this->getMain()->createPrinterByName( $allowed[0] );
}
/**
* @return ApiPageSet
*/
private function getPageSet() {
if ( !isset( $this->mPageSet ) ) {
$this->mPageSet = new ApiPageSet( $this );
}
return $this->mPageSet;
}
public function execute() {
$params = $this->extractRequestParams();
$result = $this->getResult();
$pageSet = $this->getPageSet();
$pageSet->execute();
$titles = $pageSet->getGoodTitles(); // page_id => Title object
if ( !count( $titles ) ) {
$result->addValue( null, 'pages', (object) array() );
return;
}
$db = $this->getDB();
$res = $db->select( 'page_props',
array( 'pp_page', 'pp_value' ), array(
'pp_page' => array_keys( $titles ),
'pp_propname' => 'templatedata'
),
__METHOD__,
array( 'ORDER BY', 'pp_page' )
);
$resp = array();
foreach ( $res as $row ) {
$rawData = $row->pp_value;
$data = json_decode( $rawData );
if ( !$data ) {
$this->dieUsage( 'Corrupt data found in templatedata storage for page #' . intval( $row->pp_page ), 'templatedata-corrupt' );
}
$resp[$row->pp_page] = array(
'title' => strval( $titles[$row->pp_page] ),
'params' => $data->params,
);
}
// Set top level element
$result->addValue( null, 'pages', (object) $resp );
$values = $pageSet->getNormalizedTitlesAsResult();
if ( $values ) {
$result->addValue( null, 'normalized', $values );
}
}
public function getAllowedParams( $flags = 0 ) {
return $this->getPageSet()->getFinalParams( $flags ) + array(
'format' => array(
ApiBase::PARAM_DFLT => 'json',
ApiBase::PARAM_TYPE => array( 'json', 'jsonfm' ),
)
);
}
public function getParamDescription() {
return $this->getPageSet()->getParamDescription() + array(
'format' => 'The format of the output',
);
}
public function getDescription() {
return 'Data stored by the TemplateData extension';
}
public function getPossibleErrors() {
return array_merge(
parent::getPossibleErrors(),
$this->getPageSet()->getPossibleErrors()
);
}
public function getExamples() {
return array(
'api.php?action=templatedata&titles=Template:Stub|Template:Example',
);
}
public function getHelpUrls() {
return 'https://www.mediawiki.org/Extension:TemplateData';
}
}