37 parent::__construct(
'Export' );
46 $this->curonly =
true;
49 $this->templates =
$request->getCheck(
'templates' );
51 $request->getIntOrNull(
'pagelink-depth' )
56 if (
$request->getCheck(
'addcat' ) ) {
57 $page =
$request->getText(
'pages' );
58 $catname =
$request->getText(
'catname' );
60 if ( $catname !==
'' && $catname !==
null && $catname !==
false ) {
61 $t = Title::makeTitleSafe(
NS_MAIN, $catname );
73 $page .= implode(
"\n", $catpages );
77 }
elseif (
$request->getCheck(
'addns' ) && $config->get(
'ExportFromNamespaces' ) ) {
78 $page =
$request->getText(
'pages' );
79 $nsindex =
$request->getText(
'nsindex',
'' );
81 if (
strval( $nsindex ) !==
'' ) {
87 $page .=
"\n" . implode(
"\n", $nspages );
90 }
elseif (
$request->getCheck(
'exportall' ) && $config->get(
'ExportAllowAll' ) ) {
103 LoggerFactory::getInstance(
'export' )->debug(
104 'Special:Export POST, dir: [{dir}], offset: [{offset}], limit: [{limit}]', [
105 'dir' =>
$request->getRawVal(
'dir' ),
106 'offset' =>
$request->getRawVal(
'offset' ),
107 'limit' =>
$request->getRawVal(
'limit' ),
110 $page =
$request->getText(
'pages' );
111 $this->curonly =
$request->getCheck(
'curonly' );
112 $rawOffset =
$request->getVal(
'offset' );
120 $maxHistory = $config->get(
'ExportMaxHistory' );
121 $limit =
$request->getInt(
'limit' );
128 $historyCheck =
$request->getCheck(
'history' );
130 if ( $this->curonly ) {
131 $history = WikiExporter::CURRENT;
132 }
elseif ( !$historyCheck ) {
133 if ( $limit > 0 && ( $maxHistory == 0 || $limit < $maxHistory ) ) {
134 $history[
'limit'] = $limit;
138 $history[
'offset'] = $offset;
142 $history[
'dir'] =
'desc';
151 $page =
$request->getText(
'pages', $par );
152 $historyCheck =
$request->getCheck(
'history' );
154 if ( $historyCheck ) {
155 $history = WikiExporter::FULL;
157 $history = WikiExporter::CURRENT;
165 if ( !$config->get(
'ExportAllowHistory' ) ) {
167 $history = WikiExporter::CURRENT;
170 $list_authors =
$request->getCheck(
'listauthors' );
171 if ( !$this->curonly || !$config->get(
'ExportAllowListContributors' ) ) {
172 $list_authors =
false;
181 $request->response()->header(
"Content-type: application/xml; charset=utf-8" );
182 $request->response()->header(
"X-Robots-Tag: noindex,nofollow" );
184 if (
$request->getCheck(
'wpDownload' ) ) {
186 $filename = urlencode( $config->get(
'Sitename' ) .
'-' .
wfTimestampNow() .
'.xml' );
187 $request->response()->header(
"Content-disposition: attachment;filename={$filename}" );
190 $this->
doExport( $page, $history, $list_authors, $exportall );
196 $out->addWikiMsg(
'exporttext' );
199 $categoryName =
$request->getText(
'catname' );
206 'type' =>
'textwithbutton',
208 'horizontal-label' =>
true,
209 'label-message' =>
'export-addcattext',
212 'buttontype' =>
'submit',
213 'buttonname' =>
'addcat',
214 'buttondefault' => $this->
msg(
'export-addcat' )->text(),
215 'hide-if' => [
'===',
'exportall',
'1' ],
218 if ( $config->get(
'ExportFromNamespaces' ) ) {
221 'type' =>
'namespaceselectwithbutton',
223 'label-message' =>
'export-addnstext',
224 'horizontal-label' =>
true,
227 'cssclass' =>
'namespaceselector',
228 'buttontype' =>
'submit',
229 'buttonname' =>
'addns',
230 'buttondefault' => $this->
msg(
'export-addns' )->text(),
231 'hide-if' => [
'===',
'exportall',
'1' ],
236 if ( $config->get(
'ExportAllowAll' ) ) {
240 'label-message' =>
'exportall',
241 'name' =>
'exportall',
243 'default' =>
$request->wasPosted() ?
$request->getCheck(
'exportall' ) :
false,
250 'class' => HTMLTextAreaField::class,
252 'label-message' =>
'export-manual',
256 'hide-if' => [
'===',
'exportall',
'1' ],
260 if ( $config->get(
'ExportAllowHistory' ) ) {
264 'label-message' =>
'exportcuronly',
267 'default' =>
$request->wasPosted() ?
$request->getCheck(
'curonly' ) :
true,
271 $out->addWikiMsg(
'exportnohistory' );
277 'label-message' =>
'export-templates',
278 'name' =>
'templates',
279 'id' =>
'wpExportTemplates',
280 'default' =>
$request->wasPosted() ?
$request->getCheck(
'templates' ) :
false,
284 if ( $config->get(
'ExportMaxLinkDepth' ) || $this->userCanOverrideExportDepth() ) {
286 'pagelink-depth' => [
288 'name' =>
'pagelink-depth',
289 'id' =>
'pagelink-depth',
290 'label-message' =>
'export-pagelinks',
300 'name' =>
'wpDownload',
301 'id' =>
'wpDownload',
302 'default' =>
$request->wasPosted() ?
$request->getCheck(
'wpDownload' ) :
true,
303 'label-message' =>
'export-download',
307 if ( $config->get(
'ExportAllowListContributors' ) ) {
311 'label-message' =>
'exportlistauthors',
312 'default' =>
$request->wasPosted() ?
$request->getCheck(
'listauthors' ) :
false,
313 'name' =>
'listauthors',
314 'id' =>
'listauthors',
320 $htmlForm->setSubmitTextMsg(
'export-submit' );
321 $htmlForm->prepareForm()->displayForm(
false );
329 return $this->
getUser()->isAllowed(
'override-export-depth' );
341 private function doExport( $page, $history, $list_authors, $exportall ) {
344 $history = WikiExporter::FULL;
349 foreach ( explode(
"\n", $page ) as $pageName ) {
350 $pageName =
trim( $pageName );
351 $title = Title::newFromText( $pageName );
352 if ( $title && !$title->isExternal() && $title->getText() !==
'' ) {
354 $pageSet[$title->getPrefixedText()] =
true;
362 if ( $this->templates ) {
363 $pageSet = $this->
getTemplates( $inputPages, $pageSet );
367 $pageSet = $this->
getPageLinks( $inputPages, $pageSet, $linkDepth );
373 foreach ( $pages as $k => $v ) {
384 $exporter->list_authors = $list_authors;
385 $exporter->openStream();
388 $exporter->allPages();
390 foreach ( $pages as $page ) {
391 # T10824: Only export pages the user can read
392 $title = Title::newFromText( $page );
398 if ( !$title->userCan(
'read', $this->getUser() ) ) {
403 $exporter->pageByTitle( $title );
407 $exporter->closeStream();
415 $maxPages = $this->
getConfig()->get(
'ExportPagelistLimit' );
417 $name = $title->getDBkey();
421 [
'page',
'categorylinks' ],
422 [
'page_namespace',
'page_title' ],
423 [
'cl_from=page_id',
'cl_to' => $name ],
425 [
'LIMIT' => $maxPages ]
430 foreach (
$res as $row ) {
431 $pages[] = Title::makeName( $row->page_namespace, $row->page_title );
442 $maxPages = $this->
getConfig()->get(
'ExportPagelistLimit' );
447 [
'page_namespace',
'page_title' ],
448 [
'page_namespace' => $nsindex ],
450 [
'LIMIT' => $maxPages ]
455 foreach (
$res as $row ) {
456 $pages[] = Title::makeName( $row->page_namespace, $row->page_title );
469 return $this->
getLinks( $inputPages, $pageSet,
471 [
'namespace' =>
'tl_namespace',
'title' =>
'tl_title' ],
472 [
'page_id=tl_from' ]
487 $maxLinkDepth = $this->
getConfig()->get(
'ExportMaxLinkDepth' );
488 if ( $depth > $maxLinkDepth ) {
499 return intval( min( $depth, 5 ) );
510 for ( ; $depth > 0; --$depth ) {
512 $inputPages, $pageSet,
'pagelinks',
513 [
'namespace' =>
'pl_namespace',
'title' =>
'pl_title' ],
514 [
'page_id=pl_from' ]
531 private function getLinks( $inputPages, $pageSet, $table, $fields, $join ) {
534 foreach ( $inputPages as $page ) {
535 $title = Title::newFromText( $page );
538 $pageSet[$title->getPrefixedText()] =
true;
541 $result =
$dbr->select(
547 'page_namespace' => $title->getNamespace(),
548 'page_title' => $title->getDBkey()
554 foreach ( $result as $row ) {
555 $template = Title::makeTitle( $row->namespace, $row->title );
556 $pageSet[
$template->getPrefixedText()] =
true;
and that you know you can do these things To protect your we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights These restrictions translate to certain responsibilities for you if you distribute copies of the or if you modify it For if you distribute copies of such a whether gratis or for a you must give the recipients all the rights that you have You must make sure that receive or can get the source code And you must show them these terms so they know their rights We protect your rights with two and(2) offer you this license which gives you legal permission to copy
wfTimestampNow()
Convenience function; returns MediaWiki timestamp for the present time.
wfGetDB( $db, $groups=[], $wiki=false)
Get a Database object.
wfTimestamp( $outputtype=TS_UNIX, $ts=0)
Get a timestamp string in one of various formats.
wfResetOutputBuffers( $resetGzipEncoding=true)
Clear away any user-level output buffers, discarding contents.
A special page that allows users to export pages in a XML file.
getGroupName()
Under which header this special page is listed in Special:SpecialPages See messages 'specialpages-gro...
doExport( $page, $history, $list_authors, $exportall)
Do the actual page exporting.
getPageLinks( $inputPages, $pageSet, $depth)
Expand a list of pages to include pages linked to from that page.
userCanOverrideExportDepth()
getLinks( $inputPages, $pageSet, $table, $fields, $join)
Expand a list of pages to include items used in those pages.
getPagesFromNamespace( $nsindex)
execute( $par)
Default execute method Checks user permissions.
validateLinkDepth( $depth)
Validate link depth setting, if available.
getTemplates( $inputPages, $pageSet)
Expand a list of pages to include templates used in those pages.
getPagesFromCategory( $title)
Parent class for all special pages.
outputHeader( $summaryMessageKey='')
Outputs a summary message on top of special pages Per default the message key is the canonical name o...
setHeaders()
Sets headers - this should be called from the execute() method of all derived classes!
getOutput()
Get the OutputPage being used for this instance.
getUser()
Shortcut to get the User executing this instance.
getContext()
Gets the context this SpecialPage is executed in.
msg( $key)
Wrapper around wfMessage that sets the current context.
getConfig()
Shortcut to get main config object.
getRequest()
Get the WebRequest being used for this instance.
addHelpLink( $to, $overrideBaseUrl=false)
Adds help link with an icon via page indicators.
do that in ParserLimitReportFormat instead use this to modify the parameters of the image all existing parser cache entries will be invalid To avoid you ll need to handle that somehow(e.g. with the RejectParserCacheValue hook) because MediaWiki won 't do it for you. & $defaults also a ContextSource after deleting those rows but within the same transaction you ll probably need to make sure the header is varied on $request
this hook is for auditing only or null if authentication failed before getting that far or null if we can t even determine that When $user is not it can be in the form of< username >< more info > e g for bot passwords intended to be added to log contexts Fields it might only if the login was with a bot password it is not rendered in wiki pages or galleries in category pages allow injecting custom HTML after the section Any uses of the hook need to handle escaping $template
this hook is for auditing only or null if authentication failed before getting that far or null if we can t even determine that When $user is not it can be in the form of< username >< more info > e g for bot passwords intended to be added to log contexts Fields it might only if the login was with a bot password it is not rendered in wiki pages or galleries in category pages allow injecting custom HTML after the section Any uses of the hook need to handle escaping see BaseTemplate::getToolbox and BaseTemplate::makeListItem for details on the format of individual items inside of this array or by returning and letting standard HTTP rendering take place modifiable or by returning false and taking over the output $out
either a unescaped string or a HtmlArmor object after in associative array form externallinks including delete and has completed for all link tables whether this was an auto creation use $formDescriptor instead & $formDescriptor