X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fspecials%2FSpecialMovepage.php;h=f583d1a5bbaaa72fddf7e1a597e465774fbf9c2c;hb=1da0f63b8ad648696015e4fbbbe3989897d9325d;hp=4db533b9f3c55baa160f12d48a831aded0d32056;hpb=fad28e2aebb18a0627206a89ffeb3c6c432ab783;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/specials/SpecialMovepage.php b/includes/specials/SpecialMovepage.php index 4db533b9f3..f583d1a5bb 100644 --- a/includes/specials/SpecialMovepage.php +++ b/includes/specials/SpecialMovepage.php @@ -17,36 +17,35 @@ function wfSpecialMovepage( $par = null ) { } $target = isset( $par ) ? $par : $wgRequest->getVal( 'target' ); - $oldTitle = $wgRequest->getText( 'wpOldTitle', $target ); - $newTitle = $wgRequest->getText( 'wpNewTitle' ); + $oldTitleText = $wgRequest->getText( 'wpOldTitle', $target ); + $newTitleText = $wgRequest->getText( 'wpNewTitle' ); - # Variables beginning with 'o' for old article 'n' for new article - $ot = Title::newFromText( $oldTitle ); - $nt = Title::newFromText( $newTitle ); + $oldTitle = Title::newFromText( $oldTitleText ); + $newTitle = Title::newFromText( $newTitleText ); - if( is_null( $ot ) ) { + if( is_null( $oldTitle ) ) { $wgOut->showErrorPage( 'notargettitle', 'notargettext' ); return; } - if( !$ot->exists() ) { + if( !$oldTitle->exists() ) { $wgOut->showErrorPage( 'nopagetitle', 'nopagetext' ); return; } # Check rights - $permErrors = $ot->getUserPermissionsErrors( 'move', $wgUser ); + $permErrors = $oldTitle->getUserPermissionsErrors( 'move', $wgUser ); if( !empty( $permErrors ) ) { $wgOut->showPermissionsErrorPage( $permErrors ); return; } - $f = new MovePageForm( $ot, $nt ); + $form = new MovePageForm( $oldTitle, $newTitle ); if ( 'submit' == $action && $wgRequest->wasPosted() && $wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) ) ) { - $f->doSubmit(); + $form->doSubmit(); } else { - $f->showForm( '' ); + $form->showForm( '' ); } } @@ -55,12 +54,13 @@ function wfSpecialMovepage( $par = null ) { * @ingroup SpecialPage */ class MovePageForm { - var $oldTitle, $newTitle, $reason; # Text input - var $moveTalk, $deleteAndMove, $moveSubpages; + var $oldTitle, $newTitle; # Objects + var $reason; # Text input + var $moveTalk, $deleteAndMove, $moveSubpages, $fixRedirects, $leaveRedirect; # Checks private $watch = false; - function MovePageForm( $oldTitle, $newTitle ) { + function __construct( $oldTitle, $newTitle ) { global $wgRequest; $target = isset($par) ? $par : $wgRequest->getVal( 'target' ); $this->oldTitle = $oldTitle; @@ -68,48 +68,55 @@ class MovePageForm { $this->reason = $wgRequest->getText( 'wpReason' ); if ( $wgRequest->wasPosted() ) { $this->moveTalk = $wgRequest->getBool( 'wpMovetalk', false ); + $this->fixRedirects = $wgRequest->getBool( 'wpFixRedirects', false ); + $this->leaveRedirect = $wgRequest->getBool( 'wpLeaveRedirect', false ); } else { $this->moveTalk = $wgRequest->getBool( 'wpMovetalk', true ); + $this->fixRedirects = $wgRequest->getBool( 'wpFixRedirects', true ); + $this->leaveRedirect = $wgRequest->getBool( 'wpLeaveRedirect', true ); } $this->moveSubpages = $wgRequest->getBool( 'wpMovesubpages', false ); $this->deleteAndMove = $wgRequest->getBool( 'wpDeleteAndMove' ) && $wgRequest->getBool( 'wpConfirm' ); $this->watch = $wgRequest->getCheck( 'wpWatch' ); } - function showForm( $err, $hookErr = '' ) { - global $wgOut, $wgUser; + /** + * Show the form + * @param mixed $err Error message. May either be a string message name or + * array message name and parameters, like the second argument to + * OutputPage::wrapWikiMsg(). + */ + function showForm( $err ) { + global $wgOut, $wgUser, $wgFixDoubleRedirects; - $ot = $this->oldTitle; - $sk = $wgUser->getSkin(); + $skin = $wgUser->getSkin(); - $oldTitleLink = $sk->makeLinkObj( $ot ); - $oldTitle = $ot->getPrefixedText(); + $oldTitleLink = $skin->link( $this->oldTitle ); - $wgOut->setPagetitle( wfMsg( 'move-page', $oldTitle ) ); + $wgOut->setPagetitle( wfMsg( 'move-page', $this->oldTitle->getPrefixedText() ) ); $wgOut->setSubtitle( wfMsg( 'move-page-backlink', $oldTitleLink ) ); - if( $this->newTitle == '' ) { + $newTitle = $this->newTitle; + + if( !$newTitle ) { # Show the current title as a default # when the form is first opened. - $newTitle = $oldTitle; - } else { - if( $err == '' ) { - $nt = Title::newFromURL( $this->newTitle ); - if( $nt ) { - # If a title was supplied, probably from the move log revert - # link, check for validity. We can then show some diagnostic - # information and save a click. - $newerr = $ot->isValidMoveOperation( $nt ); - if( is_string( $newerr ) ) { - $err = $newerr; - } + $newTitle = $this->oldTitle; + } + else { + if( empty($err) ) { + # If a title was supplied, probably from the move log revert + # link, check for validity. We can then show some diagnostic + # information and save a click. + $newerr = $this->oldTitle->isValidMoveOperation( $newTitle ); + if( $newerr ) { + $err = $newerr[0]; } } - $newTitle = $this->newTitle; } - if ( $err == 'articleexists' && $wgUser->isAllowed( 'delete' ) ) { - $wgOut->addWikiMsg( 'delete_and_move_text', $newTitle ); + if ( !empty($err) && $err[0] == 'articleexists' && $wgUser->isAllowed( 'delete' ) ) { + $wgOut->addWikiMsg( 'delete_and_move_text', $newTitle->getPrefixedText() ); $movepagebtn = wfMsg( 'delete_and_move' ); $submitVar = 'wpDeleteAndMove'; $confirm = " @@ -127,8 +134,19 @@ class MovePageForm { $confirm = false; } - $oldTalk = $ot->getTalkPage(); - $considerTalk = ( !$ot->isTalkPage() && $oldTalk->exists() ); + $oldTalk = $this->oldTitle->getTalkPage(); + $considerTalk = ( !$this->oldTitle->isTalkPage() && $oldTalk->exists() ); + + $dbr = wfGetDB( DB_SLAVE ); + if ( $wgFixDoubleRedirects ) { + $hasRedirects = $dbr->selectField( 'redirect', '1', + array( + 'rd_namespace' => $this->oldTitle->getNamespace(), + 'rd_title' => $this->oldTitle->getDBkey(), + ) , __METHOD__ ); + } else { + $hasRedirects = false; + } if ( $considerTalk ) { $wgOut->addWikiMsg( 'movepagetalktext' ); @@ -137,17 +155,31 @@ class MovePageForm { $titleObj = SpecialPage::getTitleFor( 'Movepage' ); $token = htmlspecialchars( $wgUser->editToken() ); - if ( $err != '' ) { + if ( !empty($err) ) { $wgOut->setSubtitle( wfMsg( 'formerror' ) ); - $errMsg = ""; - if( $err == 'hookaborted' ) { + if( $err[0] == 'hookaborted' ) { + $hookErr = $err[1]; $errMsg = "

$hookErr

\n"; - } else if (is_array($err)) { - $errMsg = '

' . call_user_func_array( 'wfMsgWikiHtml', $err ) . "

\n"; + $wgOut->addHTML( $errMsg ); + } else { + $wgOut->wrapWikiMsg( '

$1

', $err ); + } + } + + if ( $this->oldTitle->isProtected( 'move' ) ) { + # Is the title semi-protected? + if ( $this->oldTitle->isSemiProtected( 'move' ) ) { + $noticeMsg = 'semiprotectedpagemovewarning'; + $classes[] = 'mw-textarea-sprotected'; } else { - $errMsg = '

' . wfMsgWikiHtml( $err ) . "

\n"; + # Then it must be protected based on static groups (regular) + $noticeMsg = 'protectedpagemovewarning'; + $classes[] = 'mw-textarea-protected'; } - $wgOut->addHTML( $errMsg ); + $wgOut->addHTML( "
\n" ); + $wgOut->addWikiMsg( $noticeMsg ); + LogEventsList::showLogExtract( $wgOut, 'protect', $this->oldTitle->getPrefixedText(), '', 1 ); + $wgOut->addHTML( "
\n" ); } $wgOut->addHTML( @@ -168,8 +200,8 @@ class MovePageForm { Xml::label( wfMsg( 'newtitle' ), 'wpNewTitle' ) . " " . - Xml::input( 'wpNewTitle', 40, $newTitle, array( 'type' => 'text', 'id' => 'wpNewTitle' ) ) . - Xml::hidden( 'wpOldTitle', $oldTitle ) . + Xml::input( 'wpNewTitle', 40, $newTitle->getPrefixedText(), array( 'type' => 'text', 'id' => 'wpNewTitle' ) ) . + Xml::hidden( 'wpOldTitle', $this->oldTitle->getPrefixedText() ) . " @@ -193,28 +225,63 @@ class MovePageForm { ); } - if( ($ot->hasSubpages() || $ot->getTalkPage()->hasSubpages()) - && $ot->userCan( 'move-subpages' ) ) { + if ( $wgUser->isAllowed( 'suppressredirect' ) ) { + $wgOut->addHTML( " + + + " . + Xml::checkLabel( wfMsg( 'move-leave-redirect' ), 'wpLeaveRedirect', + 'wpLeaveRedirect', $this->leaveRedirect ) . + " + " + ); + } + + if ( $hasRedirects ) { + $wgOut->addHTML( " + + + " . + Xml::checkLabel( wfMsg( 'fix-double-redirects' ), 'wpFixRedirects', + 'wpFixRedirects', $this->fixRedirects ) . + " + " + ); + } + + if( ($this->oldTitle->hasSubpages() || $this->oldTitle->getTalkPage()->hasSubpages()) + && $this->oldTitle->userCan( 'move-subpages' ) ) + { + global $wgMaximumMovedPages, $wgLang; + $wgOut->addHTML( " " . - Xml::checkLabel( wfMsgHtml( - $ot->hasSubpages() - ? 'move-subpages' - : 'move-talk-subpages' + Xml::checkLabel( wfMsgExt( + ( $this->oldTitle->hasSubpages() + ? 'move-subpages' + : 'move-talk-subpages' ), + array( 'parsemag' ), + $wgLang->formatNum( $wgMaximumMovedPages ), + # $2 to allow use of PLURAL in message. + $wgMaximumMovedPages ), 'wpMovesubpages', 'wpMovesubpages', # Don't check the box if we only have talk subpages to # move and we aren't moving the talk page. - $this->moveSubpages && ($ot->hasSubpages() || $this->moveTalk) + $this->moveSubpages && ($this->oldTitle->hasSubpages() || $this->moveTalk) ) . " " ); } - $watchChecked = $this->watch || $wgUser->getBoolOption( 'watchmoves' ) || $ot->userIsWatching(); + # Check the watch checkbox in case the watch parameter was given in the + # request, the preferences say so, or either the old or new title is + # being watched. + $watchChecked = $this->watch || $wgUser->getBoolOption( 'watchmoves' ) + || $this->oldTitle->userIsWatching() || $this->newTitle->userIsWatching(); $wgOut->addHTML( " @@ -236,12 +303,14 @@ class MovePageForm { "\n" ); - $this->showLogFragment( $ot, $wgOut ); + $this->showLogFragment( $this->oldTitle, $wgOut ); + $this->showSubpages( $this->oldTitle, $wgOut ); } function doSubmit() { global $wgOut, $wgUser, $wgRequest, $wgMaximumMovedPages, $wgLang; + global $wgFixDoubleRedirects; if ( $wgUser->pingLimiter( 'move' ) ) { $wgOut->rateLimited(); @@ -263,6 +332,12 @@ class MovePageForm { return; } + // Delete an associated image if there is + $file = wfLocalFile( $nt ); + if( $file->exists() ) { + $file->delete( wfMsgForContent( 'delete_and_move_reason' ), false ); + } + // This may output an error message and exit $article->doDelete( wfMsgForContent( 'delete_and_move_reason' ) ); } @@ -273,13 +348,23 @@ class MovePageForm { return; } - $error = $ot->moveTo( $nt, true, $this->reason ); + if ( $wgUser->isAllowed( 'suppressredirect' ) ) { + $createRedirect = $this->leaveRedirect; + } else { + $createRedirect = true; + } + + $error = $ot->moveTo( $nt, true, $this->reason, $createRedirect ); if ( $error !== true ) { - # FIXME: showForm() should handle multiple errors - call_user_func_array(array($this, 'showForm'), $error[0]); + # FIXME: show all the errors in a list, not just the first one + $this->showForm( reset( $error ) ); return; } + if ( $wgFixDoubleRedirects && $this->fixRedirects ) { + DoubleRedirectJob::fixRedirects( 'move', $ot, $nt ); + } + wfRunHooks( 'SpecialMovepageAfterMove', array( &$this , &$ot , &$nt ) ) ; $wgOut->setPagetitle( wfMsg( 'pagemovedsub' ) ); @@ -291,7 +376,9 @@ class MovePageForm { $oldLink = "[$oldUrl $oldText]"; $newLink = "[$newUrl $newText]"; - $wgOut->addWikiMsg( 'movepage-page-moved', $oldLink, $newLink, $oldText, $newText ); + $msgName = $createRedirect ? 'movepage-moved-redirect' : 'movepage-moved-noredirect'; + $wgOut->addWikiMsg( 'movepage-moved', $oldLink, $newLink, $oldText, $newText ); + $wgOut->addWikiMsg( $msgName ); # Now we move extra pages we've been asked to move: subpages and talk # pages. First, if the old page or the new page is a talk page, we @@ -315,6 +402,8 @@ class MovePageForm { # would mean that you couldn't move them back in one operation, which # is bad. FIXME: A specific error message should be given in this # case. + + // FIXME: Use Title::moveSubpages() here $dbr = wfGetDB( DB_MASTER ); if( $this->moveSubpages && ( MWNamespace::hasSubpages( $nt->getNamespace() ) || ( @@ -336,65 +425,74 @@ class MovePageForm { } elseif( $this->moveTalk ) { $conds = array( 'page_namespace' => $ot->getTalkPage()->getNamespace(), - 'page_title' => $ot->getDBKey() + 'page_title' => $ot->getDBkey() ); } else { # Skip the query $conds = null; } - $extrapages = array(); + $extraPages = array(); if( !is_null( $conds ) ) { - $extrapages = $dbr->select( 'page', - array( 'page_id', 'page_namespace', 'page_title' ), - $conds, - __METHOD__ + $extraPages = TitleArray::newFromResult( + $dbr->select( 'page', + array( 'page_id', 'page_namespace', 'page_title' ), + $conds, + __METHOD__ + ) ); } $extraOutput = array(); $skin = $wgUser->getSkin(); $count = 1; - foreach( $extrapages as $row ) { - if( $row->page_id == $ot->getArticleId() ) { + foreach( $extraPages as $oldSubpage ) { + if( $oldSubpage->getArticleId() == $ot->getArticleId() ) { # Already did this one. continue; } - $oldPage = Title::newFromRow( $row ); $newPageName = preg_replace( - '#^'.preg_quote( $ot->getDBKey(), '#' ).'#', - $nt->getDBKey(), - $oldPage->getDBKey() + '#^'.preg_quote( $ot->getDBkey(), '#' ).'#', + $nt->getDBkey(), + $oldSubpage->getDBkey() ); - if( $oldPage->isTalkPage() ) { + if( $oldSubpage->isTalkPage() ) { $newNs = $nt->getTalkPage()->getNamespace(); } else { $newNs = $nt->getSubjectPage()->getNamespace(); } # Bug 14385: we need makeTitleSafe because the new page names may # be longer than 255 characters. - $newPage = Title::makeTitleSafe( $newNs, $newPageName ); - if( !$newPage ) { - $oldLink = $skin->makeKnownLinkObj( $oldPage ); + $newSubpage = Title::makeTitleSafe( $newNs, $newPageName ); + if( !$newSubpage ) { + $oldLink = $skin->linkKnown( $oldSubpage ); $extraOutput []= wfMsgHtml( 'movepage-page-unmoved', $oldLink, htmlspecialchars(Title::makeName( $newNs, $newPageName ))); continue; } # This was copy-pasted from Renameuser, bleh. - if ( $newPage->exists() && !$oldPage->isValidMoveTarget( $newPage ) ) { - $link = $skin->makeKnownLinkObj( $newPage ); + if ( $newSubpage->exists() && !$oldSubpage->isValidMoveTarget( $newSubpage ) ) { + $link = $skin->linkKnown( $newSubpage ); $extraOutput []= wfMsgHtml( 'movepage-page-exists', $link ); } else { - $success = $oldPage->moveTo( $newPage, true, $this->reason ); + $success = $oldSubpage->moveTo( $newSubpage, true, $this->reason, $createRedirect ); if( $success === true ) { - $oldLink = $skin->makeKnownLinkObj( $oldPage, '', 'redirect=no' ); - $newLink = $skin->makeKnownLinkObj( $newPage ); + if ( $this->fixRedirects ) { + DoubleRedirectJob::fixRedirects( 'move', $oldSubpage, $newSubpage ); + } + $oldLink = $skin->linkKnown( + $oldSubpage, + null, + array(), + array( 'redirect' => 'no' ) + ); + $newLink = $skin->linkKnown( $newSubpage ); $extraOutput []= wfMsgHtml( 'movepage-page-moved', $oldLink, $newLink ); } else { - $oldLink = $skin->makeKnownLinkObj( $oldPage ); - $newLink = $skin->makeLinkObj( $newPage ); + $oldLink = $skin->linkKnown( $oldSubpage ); + $newLink = $skin->link( $newSubpage ); $extraOutput []= wfMsgHtml( 'movepage-page-unmoved', $oldLink, $newLink ); } } @@ -425,4 +523,32 @@ class MovePageForm { LogEventsList::showLogExtract( $out, 'move', $title->getPrefixedText() ); } + function showSubpages( $title, $out ) { + global $wgUser, $wgLang; + + if( !MWNamespace::hasSubpages( $title->getNamespace() ) ) + return; + + $subpages = $title->getSubpages(); + $count = $subpages instanceof TitleArray ? $subpages->count() : 0; + + $out->wrapWikiMsg( '== $1 ==', array( 'movesubpage', $count ) ); + + # No subpages. + if ( $count == 0 ) { + $out->addWikiMsg( 'movenosubpage' ); + return; + } + + $out->addWikiMsg( 'movesubpagetext', $wgLang->formatNum( $count ) ); + $skin = $wgUser->getSkin(); + $out->addHTML( "\n" ); + } } +