X-Git-Url: https://git.cyclocoop.org/?a=blobdiff_plain;ds=sidebyside;f=includes%2FHistoryPage.php;h=27c115339536e613145f954a772298c19ffcca45;hb=9d285a54b4a8f97b23f5f51601bfcd53de36521c;hp=5cd0b0d79910f919e016a115c973fa9df2d28ff4;hpb=0d831e12c753cf01354554f3e9765884a5515e16;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/HistoryPage.php b/includes/HistoryPage.php index 5cd0b0d799..27c1153395 100644 --- a/includes/HistoryPage.php +++ b/includes/HistoryPage.php @@ -24,8 +24,7 @@ class HistoryPage { /** * Construct a new HistoryPage. * - * @param Article $article - * @returns nothing + * @param $article Article */ function __construct( $article ) { global $wgUser; @@ -50,16 +49,16 @@ class HistoryPage { function preCacheMessages() { // Precache various messages if( !isset( $this->message ) ) { - foreach( explode(' ', 'cur last rev-delundel' ) as $msg ) { - $this->message[$msg] = wfMsgExt( $msg, array( 'escape') ); + $msgs = array( 'cur', 'last', 'pipe-separator' ); + foreach( $msgs as $msg ) { + $this->message[$msg] = wfMsgExt( $msg, array( 'escapenoentities') ); } } } /** * Print the history page for an article. - * - * @returns nothing + * @return nothing */ function history() { global $wgOut, $wgRequest, $wgScript; @@ -82,7 +81,7 @@ class HistoryPage { $wgOut->setRobotPolicy( 'noindex,nofollow' ); $wgOut->setSyndicated( true ); $wgOut->setFeedAppendQuery( 'action=history' ); - $wgOut->addScriptFile( 'history.js' ); + $wgOut->addModules( array( 'mediawiki.legacy.history' ) ); $logPage = SpecialPage::getTitleFor( 'Log' ); $logLink = $this->skin->link( @@ -105,6 +104,18 @@ class HistoryPage { */ if( !$this->title->exists() ) { $wgOut->addWikiMsg( 'nohistory' ); + # show deletion/move log if there is an entry + LogEventsList::showLogExtract( + $wgOut, + array( 'delete', 'move' ), + $this->title->getPrefixedText(), + '', + array( 'lim' => 10, + 'conds' => array( "log_action != 'revision'" ), + 'showIfEmpty' => false, + 'msgKey' => array( 'moveddeleted-notice' ) + ) + ); wfProfileOut( __METHOD__ ); return; } @@ -116,15 +127,30 @@ class HistoryPage { $month = $wgRequest->getInt( 'month' ); $tagFilter = $wgRequest->getVal( 'tagfilter' ); $tagSelector = ChangeTags::buildTagFilterSelector( $tagFilter ); + /** + * Option to show only revisions that have been (partially) hidden via RevisionDelete + */ + if ( $wgRequest->getBool( 'deleted' ) ) { + $conds = array("rev_deleted != '0'"); + } else { + $conds = array(); + } + $checkDeleted = Xml::checkLabel( wfMsg( 'history-show-deleted' ), + 'deleted', 'mw-show-deleted-only', $wgRequest->getBool( 'deleted' ) ) . "\n"; $action = htmlspecialchars( $wgScript ); $wgOut->addHTML( "
" . - Xml::fieldset( wfMsg( 'history-fieldset-title' ), false, array( 'id' => 'mw-history-search' ) ) . + Xml::fieldset( + wfMsg( 'history-fieldset-title' ), + false, + array( 'id' => 'mw-history-search' ) + ) . Xml::hidden( 'title', $this->title->getPrefixedDBKey() ) . "\n" . Xml::hidden( 'action', 'history' ) . "\n" . - xml::dateMenu( $year, $month ) . ' ' . - ( $tagSelector ? ( implode( ' ', $tagSelector ) . ' ' ) : '' ) . + Xml::dateMenu( $year, $month ) . ' ' . + ( $tagSelector ? ( implode( ' ', $tagSelector ) . ' ' ) : '' ) . + $checkDeleted . Xml::submitButton( wfMsg( 'allpagessubmit' ) ) . "\n" . '
' ); @@ -134,7 +160,7 @@ class HistoryPage { /** * Do the list */ - $pager = new HistoryPager( $this, $year, $month, $tagFilter ); + $pager = new HistoryPager( $this, $year, $month, $tagFilter, $conds ); $wgOut->addHTML( $pager->getNavigationBar() . $pager->getBody() . @@ -148,8 +174,13 @@ class HistoryPage { * Fetch an array of revisions, specified by a given limit, offset and * direction. This is now only used by the feeds. It was previously * used by the main UI but that's now handled by the pager. + * + * @param $limit Integer: the limit number of revisions to get + * @param $offset Integer + * @param $direction Integer: either HistoryPage::DIR_PREV or HistoryPage::DIR_NEXT + * @return ResultWrapper */ - function fetchRevisions($limit, $offset, $direction) { + function fetchRevisions( $limit, $offset, $direction ) { $dbr = wfGetDB( DB_SLAVE ); if( $direction == HistoryPage::DIR_PREV ) @@ -168,14 +199,15 @@ class HistoryPage { Revision::selectFields(), array_merge(array("rev_page=$page_id"), $offsets), __METHOD__, - array( 'ORDER BY' => "rev_timestamp $dirs", + array( 'ORDER BY' => "rev_timestamp $dirs", 'USE INDEX' => 'page_timestamp', 'LIMIT' => $limit) ); } /** * Output a subscription feed listing recent edits to this page. - * @param string $type + * + * @param $type String: feed type */ function feed( $type ) { global $wgFeedClasses, $wgRequest, $wgFeedLimit; @@ -184,10 +216,11 @@ class HistoryPage { } $feed = new $wgFeedClasses[$type]( - $this->title->getPrefixedText() . ' - ' . - wfMsgForContent( 'history-feed-title' ), - wfMsgForContent( 'history-feed-description' ), - $this->title->getFullUrl( 'action=history' ) ); + $this->title->getPrefixedText() . ' - ' . + wfMsgForContent( 'history-feed-title' ), + wfMsgForContent( 'history-feed-description' ), + $this->title->getFullUrl( 'action=history' ) + ); // Get a limit on number of feed entries. Provide a sane default // of 10 if none is defined (but limit to $wgFeedLimit max) @@ -215,8 +248,9 @@ class HistoryPage { $wgOut->parse( wfMsgForContent( 'history-feed-empty' ) ), $this->title->getFullUrl(), wfTimestamp( TS_MW ), - '', - $this->title->getTalkPage()->getFullUrl() ); + '', + $this->title->getTalkPage()->getFullUrl() + ); } /** @@ -224,72 +258,90 @@ class HistoryPage { * Borrows Recent Changes' feed generation functions for formatting; * includes a diff to the previous revision (if any). * - * @param $row + * @param $row Object: database row * @return FeedItem */ function feedItem( $row ) { $rev = new Revision( $row ); $rev->setTitle( $this->title ); - $text = FeedUtils::formatDiffRow( $this->title, - $this->title->getPreviousRevisionID( $rev->getId() ), - $rev->getId(), - $rev->getTimestamp(), - $rev->getComment() ); - + $text = FeedUtils::formatDiffRow( + $this->title, + $this->title->getPreviousRevisionID( $rev->getId() ), + $rev->getId(), + $rev->getTimestamp(), + $rev->getComment() + ); if( $rev->getComment() == '' ) { global $wgContLang; $title = wfMsgForContent( 'history-feed-item-nocomment', - $rev->getUserText(), - $wgContLang->timeanddate( $rev->getTimestamp() ) ); + $rev->getUserText(), + $wgContLang->timeanddate( $rev->getTimestamp() ), + $wgContLang->date( $rev->getTimestamp() ), + $wgContLang->time( $rev->getTimestamp() ) + ); } else { - $title = $rev->getUserText() . wfMsgForContent( 'colon-separator' ) . FeedItem::stripComment( $rev->getComment() ); + $title = $rev->getUserText() . + wfMsgForContent( 'colon-separator' ) . + FeedItem::stripComment( $rev->getComment() ); } - return new FeedItem( $title, $text, $this->title->getFullUrl( 'diff=' . $rev->getId() . '&oldid=prev' ), $rev->getTimestamp(), $rev->getUserText(), - $this->title->getTalkPage()->getFullUrl() ); + $this->title->getTalkPage()->getFullUrl() + ); } } - /** * @ingroup Pager */ class HistoryPager extends ReverseChronologicalPager { - public $lastRow = false, $counter, $historyPage, $title; + public $lastRow = false, $counter, $historyPage, $title, $buttons, $conds; protected $oldIdChecked; - function __construct( $historyPage, $year='', $month='', $tagFilter = '' ) { + function __construct( $historyPage, $year='', $month='', $tagFilter = '', $conds = array() ) { parent::__construct(); $this->historyPage = $historyPage; $this->title = $this->historyPage->title; $this->tagFilter = $tagFilter; $this->getDateCond( $year, $month ); + $this->conds = $conds; } - + // For hook compatibility... function getArticle() { return $this->historyPage->getArticle(); } + function getSqlComment() { + if ( $this->conds ) { + return 'history page filtered'; // potentially slow, see CR r58153 + } else { + return 'history page unfiltered'; + } + } + function getQueryInfo() { $queryInfo = array( 'tables' => array('revision'), - 'fields' => array_merge( Revision::selectFields(), array('ts_tags') ), - 'conds' => array('rev_page' => $this->historyPage->title->getArticleID() ), + 'fields' => Revision::selectFields(), + 'conds' => array_merge( + array( 'rev_page' => $this->historyPage->title->getArticleID() ), + $this->conds ), 'options' => array( 'USE INDEX' => array('revision' => 'page_timestamp') ), 'join_conds' => array( 'tag_summary' => array( 'LEFT JOIN', 'ts_rev_id=rev_id' ) ), ); - ChangeTags::modifyDisplayQuery( $queryInfo['tables'], - $queryInfo['fields'], - $queryInfo['conds'], - $queryInfo['join_conds'], - $queryInfo['options'], - $this->tagFilter ); + ChangeTags::modifyDisplayQuery( + $queryInfo['tables'], + $queryInfo['fields'], + $queryInfo['conds'], + $queryInfo['join_conds'], + $queryInfo['options'], + $this->tagFilter + ); wfRunHooks( 'PageHistoryPager::getQueryInfo', array( &$this, &$queryInfo ) ); return $queryInfo; } @@ -300,7 +352,7 @@ class HistoryPager extends ReverseChronologicalPager { function formatRow( $row ) { if( $this->lastRow ) { - $latest = $this->counter == 1 && $this->mIsFirst; + $latest = ($this->counter == 1 && $this->mIsFirst); $firstInList = $this->counter == 1; $s = $this->historyLine( $this->lastRow, $row, $this->counter++, $this->title->getNotificationTimestamp(), $latest, $firstInList ); @@ -317,64 +369,64 @@ class HistoryPager extends ReverseChronologicalPager { * @return string HTML output */ function getStartBody() { - global $wgScript, $wgEnableHtmlDiff, $wgUser, $wgOut; + global $wgScript, $wgUser, $wgOut, $wgContLang; $this->lastRow = false; $this->counter = 1; $this->oldIdChecked = 0; - $wgOut->wrapWikiMsg( "
\n$1
", 'histlegend' ); - $s = ''; - if( $this->getNumRows() > 1 && $wgUser->isAllowed('deleterevision') ) { - $revdel = SpecialPage::getTitleFor( 'Revisiondelete' ); - $s .= Xml::openElement( 'form', + $wgOut->wrapWikiMsg( "
\n$1\n
", 'histlegend' ); + $s = Html::openElement( 'form', array( 'action' => $wgScript, + 'id' => 'mw-history-compare' ) ) . "\n"; + $s .= Html::hidden( 'title', $this->title->getPrefixedDbKey() ) . "\n"; + $s .= Html::hidden( 'action', 'historysubmit' ) . "\n"; + + $s .= '
' . $this->submitButton( wfMsg( 'compareselectedversions'), + array( 'class' => 'historysubmit' ) ) . "\n"; + + $this->buttons = '
'; + $this->buttons .= $this->submitButton( wfMsg( 'compareselectedversions'), + array( 'class' => 'historysubmit' ) + + $wgUser->getSkin()->tooltipAndAccessKeyAttribs( 'compareselectedversions' ) + ) . "\n"; + + if( $wgUser->isAllowed('deleterevision') ) { + $float = $wgContLang->alignEnd(); + # Note bug #20966,
'; + $s .= '
'; - if( $wgEnableHtmlDiff ) { - $s .= $this->submitButton( wfMsg( 'visualcomparison'), - array( - 'name' => 'htmldiff', - 'class' => 'historysubmit', - 'accesskey' => wfMsg( 'accesskey-visualcomparison' ), - 'title' => wfMsg( 'tooltip-compareselectedversions' ), - ) - ); - $s .= $this->submitButton( wfMsg( 'wikicodecomparison'), - array( - 'class' => 'historysubmit', - 'accesskey' => wfMsg( 'accesskey-compareselectedversions' ), - 'title' => wfMsg( 'tooltip-compareselectedversions' ), - ) - ); - } else { - $s .= $this->submitButton( wfMsg( 'compareselectedversions'), - array( - 'class' => 'historysubmit', - 'accesskey' => wfMsg( 'accesskey-compareselectedversions' ), - 'title' => wfMsg( 'tooltip-compareselectedversions' ), - ) - ); + $s .= "\n"; + # Add second buttons only if there is more than one rev + if( $this->getNumRows() > 2 ) { + $s .= $this->buttons; } $s .= ''; return $s; @@ -429,10 +458,11 @@ class HistoryPager extends ReverseChronologicalPager { /** * Creates a submit button * - * @param array $attributes attributes - * @return string HTML output for the submit button + * @param $message String: text of the submit button, will be escaped + * @param $attributes Array: attributes + * @return String: HTML output for the submit button */ - function submitButton($message, $attributes = array() ) { + function submitButton( $message, $attributes = array() ) { # Disable submit button if history has 1 revision only if( $this->getNumRows() > 1 ) { return Xml::submitButton( $message , $attributes ); @@ -446,13 +476,13 @@ class HistoryPager extends ReverseChronologicalPager { * * @todo document some more, and maybe clean up the code (some params redundant?) * - * @param Row $row The database row corresponding to the previous line. - * @param mixed $next The database row corresponding to the next line. - * @param int $counter Apparently a counter of what row number we're at, counted from the top row = 1. + * @param $row Object: the database row corresponding to the previous line. + * @param $next Mixed: the database row corresponding to the next line. + * @param $counter Integer: apparently a counter of what row number we're at, counted from the top row = 1. * @param $notificationtimestamp - * @param bool $latest Whether this row corresponds to the page's latest revision. - * @param bool $firstInList Whether this row corresponds to the first displayed on this history page. - * @return string HTML output for the row + * @param $latest Boolean: whether this row corresponds to the page's latest revision. + * @param $firstInList Boolean: whether this row corresponds to the first displayed on this history page. + * @return String: HTML output for the row */ function historyLine( $row, $next, $counter = '', $notificationtimestamp = false, $latest = false, $firstInList = false ) @@ -464,40 +494,46 @@ class HistoryPager extends ReverseChronologicalPager { $curlink = $this->curLink( $rev, $latest ); $lastlink = $this->lastLink( $rev, $next, $counter ); $diffButtons = $this->diffButtons( $rev, $firstInList, $counter ); + $histLinks = Html::rawElement( + 'span', + array( 'class' => 'mw-history-histlinks' ), + '(' . $curlink . $this->historyPage->message['pipe-separator'] . $lastlink . ') ' + ); + $s = $histLinks . $diffButtons; + $link = $this->revLink( $rev ); $classes = array(); - $s = "($curlink) ($lastlink) $diffButtons"; - - if( $wgUser->isAllowed( 'deleterevision' ) ) { - // Hide JS by default for non-JS browsing - $hidden = array( 'style' => 'display:none' ); - // If revision was hidden from sysops + $del = ''; + // Show checkboxes for each revision + if( $wgUser->isAllowed( 'deleterevision' ) || $wgUser->isAllowed( 'revisionmove' ) ) { + // If revision was hidden from sysops, disable the checkbox + // However, if the user has revisionmove rights, we cannot disable the checkbox + if( !$rev->userCan( Revision::DELETED_RESTRICTED ) && !$wgUser->isAllowed( 'revisionmove' ) ) { + $del = Xml::check( 'deleterevisions', false, array( 'disabled' => 'disabled' ) ); + // Otherwise, enable the checkbox... + } else { + $del = Xml::check( 'showhiderevisions', false, + array( 'name' => 'ids['.$rev->getId().']' ) ); + } + // User can only view deleted revisions... + } else if( $rev->getVisibility() && $wgUser->isAllowed( 'deletedhistory' ) ) { + // If revision was hidden from sysops, disable the link if( !$rev->userCan( Revision::DELETED_RESTRICTED ) ) { - $del = Xml::check( 'deleterevisions', false, - $hidden + array('disabled' => 'disabled') ); - $del .= Xml::tags( 'span', array( 'class'=>'mw-revdelundel-link' ), - '(' . $this->historyPage->message['rev-delundel'] . ')' ); + $cdel = $this->getSkin()->revDeleteLinkDisabled( false ); // Otherwise, show the link... } else { - $id = $rev->getId(); - $jsCall = "updateShowHideForm($id,this.checked)"; - $del = Xml::check( 'showhiderevisions', false, - $hidden + array( - 'onchange' => $jsCall, - 'id' => "mw-revdel-$id" ) ); - $query = array( - 'type' => 'revision', - 'target' => $this->title->getPrefixedDbkey(), - 'ids' => $rev->getId() ); + $query = array( 'type' => 'revision', + 'target' => $this->title->getPrefixedDbkey(), 'ids' => $rev->getId() ); $del .= $this->getSkin()->revDeleteLink( $query, - $rev->isDeleted( Revision::DELETED_RESTRICTED ) ); + $rev->isDeleted( Revision::DELETED_RESTRICTED ), false ); } - $s .= " $del "; } + if( $del ) $s .= " $del "; $s .= " $link"; - $s .= " " . $this->getSkin()->revUserTools( $rev, true ) . ""; + $s .= " " . + $this->getSkin()->revUserTools( $rev, true ) . ""; if( $rev->isMinor() ) { $s .= ' ' . ChangesList::flag( 'minor' ); @@ -515,6 +551,7 @@ class HistoryPager extends ReverseChronologicalPager { $tools = array(); + # Rollback and undo links if( !is_null( $next ) && is_object( $next ) ) { if( $latest && $this->title->userCan( 'rollback' ) && $this->title->userCan( 'edit' ) ) { $tools[] = ''. @@ -533,7 +570,11 @@ class HistoryPager extends ReverseChronologicalPager { $this->title, wfMsgHtml( 'editundo' ), $undoTooltip, - array( 'action' => 'edit', 'undoafter' => $next->rev_id, 'undo' => $rev->getId() ), + array( + 'action' => 'edit', + 'undoafter' => $next->rev_id, + 'undo' => $rev->getId() + ), array( 'known', 'noclasses' ) ); $tools[] = "{$undolink}"; @@ -549,7 +590,7 @@ class HistoryPager extends ReverseChronologicalPager { $classes = array_merge( $classes, $newClasses ); $s .= " $tagSummary"; - wfRunHooks( 'PageHistoryLineEnding', array( $this, &$row , &$s ) ); + wfRunHooks( 'PageHistoryLineEnding', array( $this, &$row , &$s, &$classes ) ); $attribs = array(); if ( $classes ) { @@ -561,14 +602,15 @@ class HistoryPager extends ReverseChronologicalPager { /** * Create a link to view this revision of the page - * @param Revision $rev - * @returns string + * + * @param $rev Revision + * @return String */ function revLink( $rev ) { global $wgLang; $date = $wgLang->timeanddate( wfTimestamp(TS_MW, $rev->getTimestamp()), true ); $date = htmlspecialchars( $date ); - if( !$rev->isDeleted( Revision::DELETED_TEXT ) ) { + if ( $rev->userCan( Revision::DELETED_TEXT ) ) { $link = $this->getSkin()->link( $this->title, $date, @@ -577,16 +619,20 @@ class HistoryPager extends ReverseChronologicalPager { array( 'known', 'noclasses' ) ); } else { - $link = "$date"; + $link = $date; + } + if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) { + $link = "$link"; } return $link; } /** * Create a diff-to-current link for this revision for this page - * @param Revision $rev - * @param Bool $latest, this is the latest revision of the page? - * @returns string + * + * @param $rev Revision + * @param $latest Boolean: this is the latest revision of the page? + * @return String */ function curLink( $rev, $latest ) { $cur = $this->historyPage->message['cur']; @@ -608,10 +654,11 @@ class HistoryPager extends ReverseChronologicalPager { /** * Create a diff-to-previous link for this revision for this page. - * @param Revision $prevRev, the previous revision - * @param mixed $next, the newer revision - * @param int $counter, what row on the history list this is - * @returns string + * + * @param $prevRev Revision: the previous revision + * @param $next Mixed: the newer revision + * @param $counter Integer: what row on the history list this is + * @return String */ function lastLink( $prevRev, $next, $counter ) { $last = $this->historyPage->message['last']; @@ -632,7 +679,9 @@ class HistoryPager extends ReverseChronologicalPager { ), array( 'known', 'noclasses' ) ); - } elseif( !$prevRev->userCan(Revision::DELETED_TEXT) || !$nextRev->userCan(Revision::DELETED_TEXT) ) { + } elseif( !$prevRev->userCan(Revision::DELETED_TEXT) + || !$nextRev->userCan(Revision::DELETED_TEXT) ) + { return $last; } else { return $this->getSkin()->link( @@ -651,10 +700,10 @@ class HistoryPager extends ReverseChronologicalPager { /** * Create radio buttons for page history * - * @param object $rev Revision - * @param bool $firstInList Is this version the first one? - * @param int $counter A counter of what row number we're at, counted from the top row = 1. - * @return string HTML output for the radio buttons + * @param $rev Revision object + * @param $firstInList Boolean: is this version the first one? + * @param $counter Integer: a counter of what row number we're at, counted from the top row = 1. + * @return String: HTML output for the radio buttons */ function diffButtons( $rev, $firstInList, $counter ) { if( $this->getNumRows() > 1 ) { @@ -662,7 +711,7 @@ class HistoryPager extends ReverseChronologicalPager { $radio = array( 'type' => 'radio', 'value' => $id ); /** @todo: move title texts to javascript */ if( $firstInList ) { - $first = Xml::element( 'input', + $first = Xml::element( 'input', array_merge( $radio, array( 'style' => 'visibility:hidden', 'name' => 'oldid', @@ -674,7 +723,7 @@ class HistoryPager extends ReverseChronologicalPager { if( !$rev->userCan( Revision::DELETED_TEXT ) ) { $radio['disabled'] = 'disabled'; $checkmark = array(); // We will check the next possible one - } else if( $counter == 2 || !$this->oldIdChecked ) { + } else if( !$this->oldIdChecked ) { $checkmark = array( 'checked' => 'checked' ); $this->oldIdChecked = $id; } else { @@ -702,4 +751,3 @@ class HistoryPager extends ReverseChronologicalPager { */ class PageHistory extends HistoryPage {} class PageHistoryPager extends HistoryPager {} -