MediaWiki  REL1_21
ApiImport.php
Go to the documentation of this file.
00001 <?php
00032 class ApiImport extends ApiBase {
00033 
00034         public function execute() {
00035                 $user = $this->getUser();
00036                 $params = $this->extractRequestParams();
00037 
00038                 $isUpload = false;
00039                 if ( isset( $params['interwikisource'] ) ) {
00040                         if ( !$user->isAllowed( 'import' ) ) {
00041                                 $this->dieUsageMsg( 'cantimport' );
00042                         }
00043                         if ( !isset( $params['interwikipage'] ) ) {
00044                                 $this->dieUsageMsg( array( 'missingparam', 'interwikipage' ) );
00045                         }
00046                         $source = ImportStreamSource::newFromInterwiki(
00047                                 $params['interwikisource'],
00048                                 $params['interwikipage'],
00049                                 $params['fullhistory'],
00050                                 $params['templates']
00051                         );
00052                 } else {
00053                         $isUpload = true;
00054                         if ( !$user->isAllowed( 'importupload' ) ) {
00055                                 $this->dieUsageMsg( 'cantimport-upload' );
00056                         }
00057                         $source = ImportStreamSource::newFromUpload( 'xml' );
00058                 }
00059                 if ( !$source->isOK() ) {
00060                         $this->dieUsageMsg( $source->getErrorsArray() );
00061                 }
00062 
00063                 $importer = new WikiImporter( $source->value );
00064                 if ( isset( $params['namespace'] ) ) {
00065                         $importer->setTargetNamespace( $params['namespace'] );
00066                 }
00067                 if ( isset( $params['rootpage'] ) ) {
00068                         $statusRootPage = $importer->setTargetRootPage( $params['rootpage'] );
00069                         if( !$statusRootPage->isGood() ) {
00070                                 $this->dieUsageMsg( $statusRootPage->getErrorsArray() );
00071                         }
00072                 }
00073                 $reporter = new ApiImportReporter(
00074                         $importer,
00075                         $isUpload,
00076                         $params['interwikisource'],
00077                         $params['summary']
00078                 );
00079 
00080                 try {
00081                         $importer->doImport();
00082                 } catch ( MWException $e ) {
00083                         $this->dieUsageMsg( array( 'import-unknownerror', $e->getMessage() ) );
00084                 }
00085 
00086                 $resultData = $reporter->getData();
00087                 $result = $this->getResult();
00088                 $result->setIndexedTagName( $resultData, 'page' );
00089                 $result->addValue( null, $this->getModuleName(), $resultData );
00090         }
00091 
00092         public function mustBePosted() {
00093                 return true;
00094         }
00095 
00096         public function isWriteMode() {
00097                 return true;
00098         }
00099 
00100         public function getAllowedParams() {
00101                 global $wgImportSources;
00102                 return array(
00103                         'token' => array(
00104                                 ApiBase::PARAM_TYPE => 'string',
00105                                 ApiBase::PARAM_REQUIRED => true
00106                         ),
00107                         'summary' => null,
00108                         'xml' => array(
00109                                 ApiBase::PARAM_TYPE => 'upload',
00110                         ),
00111                         'interwikisource' => array(
00112                                 ApiBase::PARAM_TYPE => $wgImportSources
00113                         ),
00114                         'interwikipage' => null,
00115                         'fullhistory' => false,
00116                         'templates' => false,
00117                         'namespace' => array(
00118                                 ApiBase::PARAM_TYPE => 'namespace'
00119                         ),
00120                         'rootpage' => null,
00121                 );
00122         }
00123 
00124         public function getParamDescription() {
00125                 return array(
00126                         'token' => 'Import token obtained through prop=info',
00127                         'summary' => 'Import summary',
00128                         'xml' => 'Uploaded XML file',
00129                         'interwikisource' => 'For interwiki imports: wiki to import from',
00130                         'interwikipage' => 'For interwiki imports: page to import',
00131                         'fullhistory' => 'For interwiki imports: import the full history, not just the current version',
00132                         'templates' => 'For interwiki imports: import all included templates as well',
00133                         'namespace' => 'For interwiki imports: import to this namespace',
00134                         'rootpage' => 'Import as subpage of this page',
00135                 );
00136         }
00137 
00138         public function getResultProperties() {
00139                 return array(
00140                         ApiBase::PROP_LIST => true,
00141                         '' => array(
00142                                 'ns' => 'namespace',
00143                                 'title' => 'string',
00144                                 'revisions' => 'integer'
00145                         )
00146                 );
00147         }
00148 
00149         public function getDescription() {
00150                 return array(
00151                         'Import a page from another wiki, or an XML file.',
00152                         'Note that the HTTP POST must be done as a file upload (i.e. using multipart/form-data) when',
00153                         'sending a file for the "xml" parameter.'
00154                 );
00155         }
00156 
00157         public function getPossibleErrors() {
00158                 return array_merge( parent::getPossibleErrors(), array(
00159                         array( 'cantimport' ),
00160                         array( 'missingparam', 'interwikipage' ),
00161                         array( 'cantimport-upload' ),
00162                         array( 'import-unknownerror', 'source' ),
00163                         array( 'import-unknownerror', 'result' ),
00164                         array( 'import-rootpage-nosubpage', 'namespace' ),
00165                         array( 'import-rootpage-invalid' ),
00166                 ) );
00167         }
00168 
00169         public function needsToken() {
00170                 return true;
00171         }
00172 
00173         public function getTokenSalt() {
00174                 return '';
00175         }
00176 
00177         public function getExamples() {
00178                 return array(
00179                         'api.php?action=import&interwikisource=meta&interwikipage=Help:ParserFunctions&namespace=100&fullhistory=&token=123ABC'
00180                                 => 'Import [[meta:Help:Parserfunctions]] to namespace 100 with full history',
00181                 );
00182         }
00183 
00184         public function getHelpUrls() {
00185                 return 'https://www.mediawiki.org/wiki/API:Import';
00186         }
00187 }
00188 
00193 class ApiImportReporter extends ImportReporter {
00194         private $mResultArr = array();
00195 
00204         function reportPage( $title, $origTitle, $revisionCount, $successCount, $pageInfo ) {
00205                 // Add a result entry
00206                 $r = array();
00207 
00208                 if ( $title === null ) {
00209                         # Invalid or non-importable title
00210                         $r['title'] = $pageInfo['title'];
00211                         $r['invalid'] = '';
00212                 } else {
00213                         ApiQueryBase::addTitleInfo( $r, $title );
00214                         $r['revisions'] = intval( $successCount );
00215                 }
00216 
00217                 $this->mResultArr[] = $r;
00218 
00219                 // Piggyback on the parent to do the logging
00220                 parent::reportPage( $title, $origTitle, $revisionCount, $successCount, $pageInfo );
00221         }
00222 
00223         function getData() {
00224                 return $this->mResultArr;
00225         }
00226 }