http://www.mediawiki.org/wiki/Special:Code/MediaWiki/89462
Revision: 89462
Author: nikerabbit
Date: 2011-06-04 11:41:40 +0000 (Sat, 04 Jun 2011)
Log Message:
-----------
Added a special page that allows deleting translatable pages or parts of them.
Actual deletion is not tested.
Modified Paths:
--------------
trunk/extensions/Translate/PageTranslation.i18n.php
trunk/extensions/Translate/Translate.alias.php
trunk/extensions/Translate/Translate.php
trunk/extensions/Translate/_autoload.php
trunk/extensions/Translate/tag/PageTranslationHooks.php
Added Paths:
-----------
trunk/extensions/Translate/tag/DeleteJob.php
trunk/extensions/Translate/tag/SpecialPageTranslationDeletePage.php
Modified: trunk/extensions/Translate/PageTranslation.i18n.php
===================================================================
--- trunk/extensions/Translate/PageTranslation.i18n.php 2011-06-04 11:31:22 UTC
(rev 89461)
+++ trunk/extensions/Translate/PageTranslation.i18n.php 2011-06-04 11:41:40 UTC
(rev 89462)
@@ -77,7 +77,6 @@
This page is a translation of page [[$1]] and the translation can be updated
using [$2 the translation tool].',
'tpt-unknown-page' => 'This namespace is reserved for content page
translations.
The page you are trying to edit does not seem to correspond any page marked
for translation.',
- 'tpt-delete-impossible' => 'Deleting pages marked for translation is
not yet possible.',
'tpt-install' => 'Run php maintenance/update.php or web install to
enable page translation feature.',
@@ -104,6 +103,10 @@
'pt-log-unmark' => '{{GENDER:$2|removed}} page "[[:$1]]" from
translation',
'pt-log-moveok' => '{{GENDER:$2|completed}} renaming of translatable
page $1 to a new name',
'pt-log-movenok' => '{{GENDER:$2|encountered}} a problem while moving
[[:$1]] to [[:$3]]',
+ 'pt-log-delete-full-ok' => '{{GENDER:$2|completed}} deletion of
translatable page $1',
+ 'pt-log-delete-full-nok' => '{{GENDER:$2|encountered}} a problem while
deleting translatable page [[:$1]]',
+ 'pt-log-delete-lang-ok' => '{{GENDER:$2|completed}} deletion of
translation page $e',
+ 'pt-log-delete-lang-nok' => '{{GENDER:$2|encountered}} a problem while
deleting translation page [[:$1]]',
# move page replacement
@@ -144,6 +147,39 @@
Please check the [[Special:Log/pagetranslation|page translation log]] for
errors and completion message.',
'pt-locked-page' => 'This page is locked because the translatable page
is currently being moved.',
+
+
+ 'pt-deletepage-lang-title' => 'Deleting translation page $1.',
+ 'pt-deletepage-full-title' => 'Deleting translatable page $1.',
+
+ 'pt-deletepage-invalid-title' => 'The specified page is not valid.',
+ 'pt-deletepage-invalid-text' => 'The specified page is not a
translatable page nor translation of it.',
+
+ 'pt-deletepage-action-check' => 'List pages to be deleted',
+ 'pt-deletepage-action-perform' => 'Do the deletion',
+ 'pt-deletepage-action-other' => 'Change target',
+
+ 'pt-deletepage-lang-legend' => 'Delete translation page',
+ 'pt-deletepage-full-legend' => 'Delete translatable page',
+ 'pt-deletepage-any-legend' => 'Delete translatable page or translation
of translatable page',
+ 'pt-deletepage-current' => 'Page name:',
+ 'pt-deletepage-reason' => 'Reason:',
+ 'pt-deletepage-subpages' => 'Delete all subpages',
+
+ 'pt-deletepage-list-pages' => 'List of pages to delete',
+ 'pt-deletepage-list-translation' => 'Translation pages',
+ 'pt-deletepage-list-section' => 'Section pages',
+ 'pt-deletepage-list-other' => 'Other subpages',
+ 'pt-deletepage-list-count' => 'In total $1 {{PLURAL:$1|page|pages}} to
delete.',
+
+ 'pt-deletepage-full-logreason' => 'Part of translatable page $1.',
+ 'pt-deletepage-lang-logreason' => 'Part of translation page $1.',
+ 'pt-deletepage-started' => 'Please check the
[[Special:Log/pagetranslation|page translation log]] for errors and completion
message.',
+
+ 'pt-deletepage-intro' => 'This special page allows you delete whole
translatable pages or translations into one language.
+The delete action will not be instant, because many pages will need to be
deleted.
+Failures will be logged in the [[Special:Log/pagetranslation|page translation
log]] and they need to be repaired by hand.',
+
);
/** Message documentation (Message documentation)
Modified: trunk/extensions/Translate/Translate.alias.php
===================================================================
--- trunk/extensions/Translate/Translate.alias.php 2011-06-04 11:31:22 UTC
(rev 89461)
+++ trunk/extensions/Translate/Translate.alias.php 2011-06-04 11:41:40 UTC
(rev 89462)
@@ -22,6 +22,7 @@
'FirstSteps' => array( 'FirstSteps' ),
'SupportedLanguages' => array( 'SupportedLanguages' ),
'MyLanguage' => array( 'MyLanguage' ),
+ 'PageTranslationDeletePage' => array( 'PageTranslationDeletePage' ),
);
/** Afrikaans (Afrikaans) */
Modified: trunk/extensions/Translate/Translate.php
===================================================================
--- trunk/extensions/Translate/Translate.php 2011-06-04 11:31:22 UTC (rev
89461)
+++ trunk/extensions/Translate/Translate.php 2011-06-04 11:41:40 UTC (rev
89462)
@@ -8,7 +8,7 @@
*
* @author Niklas Laxström
* @author Siebrand Mazeland
- * @copyright Copyright © 2006-2010, Niklas Laxström, Siebrand Mazeland
+ * @copyright Copyright © 2006-2011, Niklas Laxström, Siebrand Mazeland
* @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
2.0 or later
*/
@@ -541,6 +541,8 @@
global $wgSpecialPages, $wgAvailableRights,
$wgSpecialPageGroups;
$wgSpecialPages['PageTranslation'] = 'SpecialPageTranslation';
$wgSpecialPageGroups['PageTranslation'] = 'pagetools';
+ $wgSpecialPages['PageTranslationDeletePage'] =
'SpecialPageTranslationDeletePage';
+ $wgSpecialPageGroups['PageTranslationDeletePage'] = 'pagetools';
$wgAvailableRights[] = 'pagetranslation';
global $wgLogNames, $wgLogActionsHandlers, $wgLogTypes,
$wgLogHeaders;
@@ -621,6 +623,9 @@
// Replace subpage logic behaviour
$wgHooks['SkinSubPageSubtitle'][] =
'PageTranslationHooks::replaceSubtitle';
+
+ // Disable action=delete
+ $wgHooks['ArticleConfirmDelete'][] =
'PageTranslationHooks::disableDelete';
}
}
Modified: trunk/extensions/Translate/_autoload.php
===================================================================
--- trunk/extensions/Translate/_autoload.php 2011-06-04 11:31:22 UTC (rev
89461)
+++ trunk/extensions/Translate/_autoload.php 2011-06-04 11:41:40 UTC (rev
89462)
@@ -4,7 +4,7 @@
*
* @file
* @author Niklas Laxström
- * @copyright Copyright © 2008-2010, Niklas Laxström
+ * @copyright Copyright © 2008-2011, Niklas Laxström
* @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
2.0 or later
*/
@@ -115,7 +115,6 @@
$wgAutoloadClasses['MessageHandle'] = $dir . 'utils/MessageHandle.php';
-
/**@}*/
/**
@@ -150,8 +149,10 @@
$wgAutoloadClasses['TPSection'] = $dir . 'tag/TPSection.php';
$wgAutoloadClasses['SpecialPageTranslation'] = $dir .
'tag/SpecialPageTranslation.php';
$wgAutoloadClasses['SpecialPageTranslationMovePage'] = $dir .
'tag/SpecialPageTranslationMovePage.php';
+$wgAutoloadClasses['SpecialPageTranslationDeletePage'] = $dir .
'tag/SpecialPageTranslationDeletePage.php';
$wgAutoloadClasses['RenderJob'] = $dir . 'tag/RenderJob.php';
$wgAutoloadClasses['MoveJob'] = $dir . 'tag/MoveJob.php';
+$wgAutoloadClasses['DeleteJob'] = $dir . 'tag/MoveJob.php';
/**@}*/
/**
Added: trunk/extensions/Translate/tag/DeleteJob.php
===================================================================
--- trunk/extensions/Translate/tag/DeleteJob.php
(rev 0)
+++ trunk/extensions/Translate/tag/DeleteJob.php 2011-06-04 11:41:40 UTC
(rev 89462)
@@ -0,0 +1,163 @@
+<?php
+/**
+ * Contains class with job for deleting translatable and translation pages.
+ *
+ * @file
+ * @author Niklas Laxström
+ * @copyright Copyright © 2008-2011, Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
2.0 or later
+ */
+
+/**
+ * Contains class with job for deleting translatable and translation pages.
+ *
+ * @ingroup PageTranslation JobQueue
+ * @todo Get rid of direct reference to $wgMemc.
+ */
+class DeleteJob extends Job {
+ public static function newJob( Title $target, $full, /*User*/
$performer ) {
+ global $wgTranslateFuzzyBotName;
+
+ $job = new self( $target );
+ $job->setUser( $wgTranslateFuzzyBotName );
+ $job->setFull( $full );
+ $msg = $this->getFull() ? 'pt-deletepage-full-logreason' :
'pt-deletepage-lang-logreason';
+ $job->setSummary( wfMsgForContent( 'pt-deletepage-logreason',
$target->getPrefixedText() ) );
+ $job->setPerformer( $performer );
+ $job->lock();
+ return $job;
+ }
+
+ function __construct( $title, $params = array(), $id = 0 ) {
+ parent::__construct( __CLASS__, $title, $params, $id );
+ }
+
+ function run() {
+ global $wgUser;
+
+ // Initialization
+ $title = $this->title;
+ // Other stuff
+ $user = $this->getUser();
+ $summary = $this->getSummary();
+ $target = $this->getTarget();
+
+ PageTranslationHooks::$allowTargetEdit = true;
+ $oldUser = $wgUser;
+ $wgUser = $user;
+
+ $error = '';
+ $ok = new Article( $title, 0 )->doDeleteArticle( $summary,
false, 0, true, $error );
+ if ( !$ok ) {
+ $logger = new LogPage( 'pagetranslation' );
+ $params = array(
+ 'user' => $this->getPerformer(),
+ 'target' => $target->getPrefixedText(),
+ 'error' => base64_encode( serialize( $ok ) ),
// This is getting ridiculous
+ );
+ $doer = User::newFromName( $this->getPerformer() );
+ $msg = $this->getFull() ? 'deletefnok' : 'deletelnok';
+ $logger->addEntry( $msg, $title, null, array(
serialize( $params ) ), $doer );
+ }
+
+ PageTranslationHooks::$allowTargetEdit = false;
+
+ global $wgMemc;
+ $pages = (array) $wgMemc->get( wfMemcKey( 'pt-base',
$title->getPrefixedText() ) );
+ $last = true;
+
+ foreach ( $pages as $page ) {
+ if ( $wgMemc->get( wfMemcKey( 'pt-lock', $page ) ) ===
true ) {
+ $last = false;
+ break;
+ }
+ }
+
+ if ( $last ) {
+ $wgMemc->delete( wfMemcKey( 'pt-base',
$title->getPrefixedText() ) );
+ $logger = new LogPage( 'pagetranslation' );
+ $params = array( 'user' => $this->getPerformer() );
+ $doer = User::newFromName( $this->getPerformer() );
+ $msg = $this->getFull() ? 'deletefok' : 'deletelok';
+ $logger->addEntry( $msg, $title, null, array(
serialize( $params ) ), $doer );
+ }
+
+ $wgUser = $oldUser;
+
+ return true;
+ }
+
+ public function setSummary( $summary ) {
+ $this->params['summary'] = $summary;
+ }
+
+ public function getSummary() {
+ return $this->params['summary'];
+ }
+
+ public function setFull( $full ) {
+ $this->params['full'] = $full;
+ }
+
+ public function getFull() {
+ return $this->params['full'];
+ }
+
+ public function setPerformer( $performer ) {
+ if ( is_object( $performer ) ) {
+ $this->params['performer'] = $performer->getName();
+ } else {
+ $this->params['performer'] = $performer;
+ }
+ }
+
+ public function getPerformer() {
+ return $this->params['performer'];
+ }
+
+ public function setUser( $user ) {
+ if ( is_object( $user ) ) {
+ $this->params['user'] = $user->getName();
+ } else {
+ $this->params['user'] = $user;
+ }
+ }
+
+ /**
+ * Get a user object for doing edits.
+ */
+ public function getUser() {
+ return User::newFromName( $this->params['user'], false );
+ }
+
+ /**
+ * Adapted from wfSuppressWarnings to allow not leaving redirects.
+ */
+ public static function forceRedirects( $end = false ) {
+ static $suppressCount = 0;
+ static $originalLevel = null;
+
+ global $wgGroupPermissions;
+ global $wgUser;
+
+ if ( $end ) {
+ if ( $suppressCount ) {
+ --$suppressCount;
+ if ( !$suppressCount ) {
+ if ( $originalLevel === null ) {
+ unset(
$wgGroupPermissions['*']['suppressredirect'] );
+ } else {
+
$wgGroupPermissions['*']['suppressredirect'] = $originalLevel;
+ }
+ }
+ }
+ } else {
+ if ( !$suppressCount ) {
+ $originalLevel = isset(
$wgGroupPermissions['*']['suppressredirect'] ) ?
$wgGroupPermissions['*']['suppressredirect'] : null;
+ $wgGroupPermissions['*']['suppressredirect'] =
true;
+ }
+ ++$suppressCount;
+ }
+ $wgUser->clearInstanceCache();
+ }
+}
Property changes on: trunk/extensions/Translate/tag/DeleteJob.php
___________________________________________________________________
Added: svn:eol-style
+ native
Modified: trunk/extensions/Translate/tag/PageTranslationHooks.php
===================================================================
--- trunk/extensions/Translate/tag/PageTranslationHooks.php 2011-06-04
11:31:22 UTC (rev 89461)
+++ trunk/extensions/Translate/tag/PageTranslationHooks.php 2011-06-04
11:41:40 UTC (rev 89462)
@@ -357,7 +357,7 @@
/// Prevent editing of translation pages directly
public static function preventDirectEditing( $title, $user, $action,
&$result ) {
$page = TranslatablePage::isTranslationPage( $title );
- if ( $page !== false ) {
+ if ( $page !== false && $action !== 'delete' ) {
if ( self::$allowTargetEdit ) {
return true;
}
@@ -372,17 +372,19 @@
return false;
}
- } elseif ( $action === 'delete' ) {
- $page = TranslatablePage::newFromTitle( $title );
- if ( $page->getMarkedTag() ) {
- $result = array( 'tpt-delete-impossible' );
- return false;
- }
}
return true;
}
+ public static function disableDelete( $article, $wgOut, &$reason ) {
+ if ( TranslatablePage::isSourcePage( $article->mTitle ) ||
TranslatablePage::isTranslationPage( $article->mTitle ) ) {
+ $new = SpecialPage::getTitleFor(
'PageTranslationDeletePage', $article->mTitle->getPrefixedText() );
+ $wgOut->redirect( $new->getFullUrl() );
+ }
+ return true;
+ }
+
public static function schemaUpdates( $updater = null ) {
$dir = dirname( __FILE__ ) . '/..';
@@ -550,6 +552,14 @@
return wfMsgExt( 'pt-log-moveok', $opts,
$title->getPrefixedText(), $user );
} elseif ( $action === 'movenok' ) {
return wfMsgExt( 'pt-log-movenok', $opts,
$title->getPrefixedText(), $user, $_['target'] );
+ } elseif ( $action === 'deletefnok' ) {
+ return wfMsgExt( 'pt-log-delete-full-nok', $opts,
$title->getPrefixedText(), $user, $_['target'] );
+ } elseif ( $action === 'deletelnok' ) {
+ return wfMsgExt( 'pt-log-delete-lang-nok', $opts,
$title->getPrefixedText(), $user, $_['target'] );
+ } elseif ( $action === 'deletelok' ) {
+ return wfMsgExt( 'pt-log-delete-full-ok', $opts,
$title->getPrefixedText(), $user );
+ } elseif ( $action === 'deletefok' ) {
+ return wfMsgExt( 'pt-log-delete-lang-ok', $opts,
$title->getPrefixedText(), $user );
}
}
Added: trunk/extensions/Translate/tag/SpecialPageTranslationDeletePage.php
===================================================================
--- trunk/extensions/Translate/tag/SpecialPageTranslationDeletePage.php
(rev 0)
+++ trunk/extensions/Translate/tag/SpecialPageTranslationDeletePage.php
2011-06-04 11:41:40 UTC (rev 89462)
@@ -0,0 +1,355 @@
+<?php
+/**
+ * Special page which enables deleting translations of translatable pages
+ *
+ * @file
+ * @author Niklas Laxström
+ * @copyright Copyright © 2011, Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
2.0 or later
+ */
+
+/**
+ * Special page which enables deleting translations of translatable pages
+ *
+ * @ingroup SpecialPage
+ * @ingroup PageTranslation
+ */
+class SpecialPageTranslationDeletePage extends SpecialPage {
+ // Basic form parameters both as text and as titles
+ protected $text, $title;
+
+ // Other form parameters
+ /// 'check' or 'perform'
+ protected $subaction;
+
+ /// There must be reason for everything.
+ protected $reason;
+
+ /// Allow skipping non-translation subpages.
+ protected $doSubpages = false;
+
+
+ /// TranslatablePage instance.
+ protected $page;
+ /// Contains the language code if we are working with translation page
+ protected $code;
+
+ /// User instance.
+ protected $user;
+
+ public function __construct() {
+ parent::__construct( 'PageTranslationDeletePage' );
+ }
+
+ public function execute( $par ) {
+ global $wgOut, $wgRequest, $wgUser;
+
+ // Yes, the use of getVal() and getText() is wanted, see bug
20365
+ $this->text = $wgRequest->getVal( 'wpTitle', $par );
+ $this->title = Title::newFromText( $this->text );
+ $this->reason = $wgRequest->getText( 'reason' );
+ // Checkboxes that default being checked are tricky
+ $this->doSubpages = $wgRequest->getBool( 'subpages',
!$wgRequest->wasPosted() );
+
+ $this->user = $wgUser;
+
+ if ( $this->doBasicChecks() !== true ) {
+ return;
+ }
+
+ // Real stuff starts here
+ if ( TranslatablePage::isSourcePage( $this->title ) ) {
+ $wgOut->setPagetitle( wfMsg(
'pt-deletepage-full-title', $this->title->getPrefixedText() ) );
+
+ $this->code = '';
+ $this->page = TranslatablePage::newFromTitle(
$this->title );
+ } else {
+ $page = TranslatablePage::isTranslationPage(
$this->title );
+ if ( $page ) {
+ $wgOut->setPagetitle( wfMsg(
'pt-deletepage-lang-title', $this->title->getPrefixedText() ) );
+
+ list( , $this->code ) =
TranslateUtils::figureMessage( $this->title->getText() );
+ $this->page = $page;
+ } else {
+ $wgOut->showErrorPage(
'pt-deletepage-invalid-title', 'pt-deletepage-invalid-text' );
+ return;
+ }
+ }
+
+ if ( !$this->user->isAllowed( 'pagetranslation' ) ) {
+ $wgOut->permissionRequired( 'pagetranslation' );
+ return;
+ }
+
+ // Is there really no better way to do this?
+ $subactionText = $wgRequest->getText( 'subaction' );
+ switch ( $subactionText ) {
+ case wfMsg( 'pt-deletepage-action-check' ):
+ $subaction = 'check'; break;
+ case wfMsg( 'pt-deletepage-action-perform' ):
+ $subaction = 'perform'; break;
+ case wfMsg( 'pt-deletepage-action-other' ):
+ $subaction = ''; break;
+ default:
+ $subaction = '';
+ }
+
+ if ( $subaction === 'check' && $this->checkToken() &&
$wgRequest->wasPosted() ) {
+ $this->showConfirmation();
+ } elseif ( $subaction === 'perform' && $this->checkToken() &&
$wgRequest->wasPosted() ) {
+ $this->performAction();
+ } else {
+ $this->showForm();
+ }
+
+ }
+
+ /**
+ * Do the basic checks whether moving is possible and whether
+ * the input looks anywhere near sane.
+ */
+ protected function doBasicChecks() {
+ global $wgOut;
+ # Check for database lock
+ if ( wfReadOnly() ) {
+ $wgOut->readOnlyPage();
+ return;
+ }
+
+ if ( !$this->title->exists() ) {
+ $wgOut->showErrorPage( 'nopagetitle', 'nopagetext' );
+ return;
+ }
+
+ # Check rights
+ $permErrors = $this->title->getUserPermissionsErrors( 'delete',
$this->user );
+ if ( !empty( $permErrors ) ) {
+ $wgOut->showPermissionsErrorPage( $permErrors );
+ return;
+ }
+
+ // Let the caller know it's safe to continue
+ return true;
+ }
+
+ /**
+ * Checks token. Use before real actions happen. Have to use wpEditToken
+ * for compatibility for SpecialMovepage.php.
+ */
+ protected function checkToken() {
+ global $wgRequest;
+ return $this->user->matchEditToken( $wgRequest->getVal(
'wpEditToken' ) );
+ }
+
+ /**
+ * The query form.
+ */
+ protected function showForm() {
+ global $wgOut;
+
+ $wgOut->addWikiMsg( 'pt-deletepage-intro' );
+
+ $br = Html::element( 'br' );
+ $subaction = array( 'name' => 'subaction' );
+ $formParams = array( 'method' => 'post', 'action' =>
$this->getTitle( $this->text )->getLocalURL() );
+
+ $form = array();
+ $form[] = Xml::fieldset( wfMsg( 'pt-deletepage-any-legend' ) );
+ $form[] = Html::openElement( 'form', $formParams );
+ $form[] = Html::hidden( 'wpEditToken', $this->user->editToken()
);
+ $this->addInputLabel( $form, wfMsg( 'pt-deletepage-current' ),
'wpTitle', 30, $this->text );
+ $this->addInputLabel( $form, wfMsg( 'pt-deletepage-reason' ),
'reason', 60, $this->reason );
+ $form[] = Xml::submitButton( wfMsg(
'pt-deletepage-action-check' ), $subaction );
+ $form[] = Xml::closeElement( 'form' );
+ $form[] = Xml::closeElement( 'fieldset' );
+ $wgOut->addHTML( implode( "\n", $form ) );
+ }
+
+ /**
+ * Shortcut for keeping the code at least a bit readable. Adds label
and input into $form array.
+ * @param $form \list{String} Array where input element and label is
appended.
+ * @param $label \string Label text.
+ * @param $name \string Name attribute.
+ * @param $size \int Size attribute of the input element. Default false.
+ * @param $text \string Text of the value attribute. Default false.
+ * @param $attribs \array Extra attributes. Default empty array.
+ */
+ protected function addInputLabel( &$form, $label, $name, $size = false
, $text = false, $attribs = array() ) {
+ $br = Html::element( 'br' );
+ list( $label, $input ) = Xml::inputLabelSep( $label, $name,
$name, $size, $text, $attribs );
+ $form[] = $label . $br;
+ $form[] = $input . $br;
+ }
+
+ /**
+ * The second form, which still allows changing some things.
+ * Lists all the action which would take place.
+ */
+ protected function showConfirmation() {
+ global $wgOut, $wgLang;
+
+ $wgOut->addWikiMsg( 'pt-deletepage-intro' );
+
+ $base = $this->title->getPrefixedText();
+ $target = $this->title;
+ $count = 1; // Base page
+
+ $wgOut->wrapWikiMsg( '== $1 ==', 'pt-deletepage-list-pages' );
+ if ( !$this->singleLanguage() ) {
+ $this->printChangeLine( $this->title );
+ }
+
+ $wgOut->wrapWikiMsg( '=== $1 ===',
'pt-deletepage-list-translation' );
+ $translationPages = $this->getTranslationPages();
+ foreach ( $translationPages as $old ) {
+ $count++;
+ $this->printChangeLine( $old );
+ }
+
+ $wgOut->wrapWikiMsg( '=== $1 ===', 'pt-deletepage-list-section'
);
+ $sectionPages = $this->getSectionPages( $target );
+ foreach ( $sectionPages as $old ) {
+ $count++;
+ $this->printChangeLine( $old );
+ }
+
+ $wgOut->wrapWikiMsg( '=== $1 ===', 'pt-deletepage-list-other' );
+ $subpages = $this->getSubpages();
+ foreach ( $subpages as $old ) {
+ if ( TranslatablePage::isTranslationPage( $old ) )
continue;
+ if ( $this->doSubpages ) { $count++; }
+ $this->printChangeLine( $old, $this->doSubpages );
+ }
+
+ $wgOut->addWikiText( "----\n" );
+ $wgOut->addWikiMsg( 'pt-deletepage-list-count',
$wgLang->formatNum( $count ) );
+
+ $br = Html::element( 'br' );
+ $readonly = array( 'readonly' => 'readonly' );
+
+ $subaction = array( 'name' => 'subaction' );
+ $formParams = array( 'method' => 'post', 'action' =>
$this->getTitle( $this->text )->getLocalURL() );
+
+ $form = array();
+ if ( $this->singleLanguage() ) {
+ $form[] = Xml::fieldset( wfMsg(
'pt-deletepage-lang-legend' ) );
+ } else {
+ $form[] = Xml::fieldset( wfMsg(
'pt-deletepage-full-legend' ) );
+ }
+ $form[] = Html::openElement( 'form', $formParams );
+ $form[] = Html::hidden( 'wpEditToken', $this->user->editToken()
);
+ $this->addInputLabel( $form, wfMsg( 'pt-deletepage-current' ),
'wpTitle', 30, $this->text, $readonly );
+ $this->addInputLabel( $form, wfMsg( 'pt-deletepage-reason' ),
'reason', 60, $this->reason );
+ $form[] = Xml::checkLabel( wfMsg( 'pt-deletepage-subpages' ),
'subpages', 'mw-subpages', $this->doSubpages, $readonly ) . $br;
+ $form[] = Xml::submitButton( wfMsg(
'pt-deletepage-action-perform' ), $subaction );
+ $form[] = Xml::submitButton( wfMsg(
'pt-deletepage-action-other' ), $subaction );
+ $form[] = Xml::closeElement( 'form' );
+ $form[] = Xml::closeElement( 'fieldset' );
+ $wgOut->addHTML( implode( "\n", $form ) );
+ }
+
+ protected function printChangeLine( $title, $enabled = true ) {
+ global $wgOut;
+ if ( $enabled ) {
+ $wgOut->addWikiText( '* ' . $title->getPrefixedText() );
+ } else {
+ $wgOut->addWikiText( '* <s>' .
$title->getPrefixedText() . '</s>' );
+ }
+ }
+
+ protected function performAction() {
+ $jobs = array();
+ $target = $this->title;
+
+ $translationPages = $this->getTranslationPages();
+ foreach ( $translationPages as $old ) {
+ $jobs[$old->getPrefixedText()] = DeleteJob::newJob(
$old, !$this->singleLanguage(), $this->user );
+ }
+
+ $sectionPages = $this->getSectionPages();
+ foreach ( $sectionPages as $old ) {
+ $to = $this->newPageTitle( $base, $old, $target );
+ $jobs[$old->getPrefixedText()] = DeleteJob::newJob(
$old, !$this->singleLanguage(), $this->user );
+ }
+
+ if ( !$this->doSubpages ) {
+ $subpages = $this->getSubpages();
+ foreach ( $subpages as $old ) {
+ if ( TranslatablePage::isTranslationPage( $old
) ) {
+ continue;
+ }
+
+ $to = $this->newPageTitle( $base, $old, $target
);
+ $jobs[$old->getPrefixedText()] =
DeleteJob::newJob( $old, !$this->singleLanguage(), $this->user );
+ }
+ }
+
+ Job::batchInsert( $jobs );
+
+ global $wgMemc;
+ $wgMemc->set( wfMemcKey( 'pt-base', $base ), array_keys( $jobs
), 60 * 60 * 6 );
+
+
+ if ( !$this->singleLanguage() ) {
+ $this->page->removeTags();
+ }
+
+ MessageGroups::clearCache();
+ // TODO: defer or make faster
+ MessageIndexRebuilder::execute();
+
+ global $wgOut;
+ $wgOut->addWikiMsg( 'pt-deletepage-started' );
+ }
+
+ /**
+ * Returns all section pages, including those which are currently not
active.
+ * @return TitleArray.
+ */
+ protected function getSectionPages() {
+ if ( !isset( $this->sectionPages ) ) {
+ $base = $this->page->getTitle()->getPrefixedDBKey();
+
+ $dbw = wfGetDB( DB_MASTER );
+ if ( $this->singleLanguage() ) {
+ $like = $dbw->buildLike( "$base/",
$dbw->anyString(), "/{$this->code}" );
+ } else {
+ $like = $dbw->buildLike( "$base/",
$dbw->anyString() );
+ }
+
+ $fields = array( 'page_namespace', 'page_title' );
+ $titleCond = 'page_title ' . $like;
+ $conds = array( 'page_namespace' => NS_TRANSLATIONS,
$titleCond );
+ $result = $dbw->select( 'page', $fields, $conds,
__METHOD__ );
+ $this->sectionPages = TitleArray::newFromResult(
$result );
+ }
+ return $this->sectionPages;
+ }
+
+ /**
+ * Returns only translation subpages.
+ * @return Array of titles.
+ */
+ protected function getTranslationPages() {
+ if ( $this->singleLanguage() ) {
+ return array( $this->title );
+ }
+
+ if ( !isset( $this->translationPages ) ) {
+ $this->translationPages =
$this->page->getTranslationPages();
+ }
+ return $this->translationPages;
+ }
+
+ /**
+ * Returns all subpages, if the namespace has them enabled.
+ * @return Empty array or TitleArray
+ */
+ protected function getSubpages() {
+ return $this->title->getSubpages();
+ }
+
+ protected function singleLanguage() {
+ return $this->code !== '';
+ }
+}
Property changes on:
trunk/extensions/Translate/tag/SpecialPageTranslationDeletePage.php
___________________________________________________________________
Added: svn:eol-style
+ native
_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs