| Current File : /home/jvzmxxx/wiki/extensions/Kartographer/includes/ApiQueryMapData.php |
<?php
namespace Kartographer;
use ApiBase;
use ApiQuery;
use ApiQueryBase;
use FormatJson;
class ApiQueryMapData extends ApiQueryBase {
public function __construct( ApiQuery $query, $moduleName ) {
parent::__construct( $query, $moduleName, 'mpd' );
}
public function execute() {
$params = $this->extractRequestParams();
$limit = $params['limit'];
$continue = isset( $params['continue'] ) ? $params['continue'] : 0;
$groups = $params['groups'] === '' ? false : explode( '|', $params['groups'] );
$titles = $this->getPageSet()->getGoodTitles();
if ( !$titles ) {
return;
}
$dbr = wfGetDB( DB_SLAVE );
$this->addTables( 'page_props' );
$this->addFields( [ 'pp_page', 'pp_value' ] );
$this->addWhere( [ 'pp_page' => array_keys( $titles ), 'pp_propname' => 'kartographer' ] );
$this->addWhereIf( 'pp_page >= ' . $dbr->addQuotes( $continue ), $continue );
$this->addOption( 'ORDER BY', 'pp_page' );
$this->addOption( 'LIMIT', $limit + 1 );
$res = $this->select( __METHOD__ );
$count = 0;
foreach ( $res as $row ) {
$pageId = $row->pp_page;
if ( ++$count > $limit ) {
$this->setContinueEnumParameter( 'continue', $pageId );
break;
}
$status = FormatJson::parse( gzdecode( $row->pp_value ) );
if ( !$status->isOK() ) {
continue;
}
$data = $status->getValue();
$result = [];
if ( $groups ) {
foreach ( $groups as $group ) {
if ( property_exists( $data, $group ) ) {
$result[$group] = $data->$group;
} else {
// Let the client know there is no data found for this group
$result[$group] = null;
}
}
} else {
$result = $data;
}
$result = FormatJson::encode( $result, false, FormatJson::ALL_OK );
$fit = $this->addPageSubItem( $pageId, $result );
if ( !$fit ) {
$this->setContinueEnumParameter( 'continue', $pageId );
}
}
}
public function getAllowedParams() {
return [
'groups' => [
ApiBase::PARAM_TYPE => 'string',
ApiBase::PARAM_DFLT => '',
],
'limit' => [
ApiBase::PARAM_TYPE => 'limit',
ApiBase::PARAM_DFLT => 10,
ApiBase::PARAM_MIN => 1,
ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
],
'continue' => [
ApiBase::PARAM_TYPE => 'integer',
ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
],
];
}
public function getExamplesMessages() {
return [
'action=query&prop=mapdata&titles=Metallica' => 'apihelp-query+mapdata-example-1',
'action=query&prop=mapdata&titles=Metallica&mpdgroups=group1|group2' => 'apihelp-query+mapdata-example-2',
];
}
public function getCacheMode( $params ) {
return 'public';
}
public function isInternal() {
return true;
}
}