From: Matthias Mullie Date: Wed, 16 Sep 2015 10:44:04 +0000 (+0000) Subject: When aborting EnhancedRC block line, block should reflect that X-Git-Tag: 1.31.0-rc.0~10009^2 X-Git-Url: http://git.cyclocoop.org/%7D%7Cconcat%7B?a=commitdiff_plain;h=e39bd385b2f1cbcd9c1e5d8e4d30a2d489f440bc;p=lhc%2Fweb%2Fwiklou.git When aborting EnhancedRC block line, block should reflect that It was possible to abort the rendering of all block lines, but the block would still be rendered (with nothing inside). It would also render a "x changes" link, even though that "x" is no longer correct. This had been reverted in adba11dfe332c4c10dbbf0f817982d4a225de6b1, but has now been fixed up. Change-Id: Ic5d15e56bc2f46fa6aa8c9375f3cafeb13e1ea9c --- diff --git a/includes/changes/EnhancedChangesList.php b/includes/changes/EnhancedChangesList.php index 9635c1791d..1a02a97c90 100644 --- a/includes/changes/EnhancedChangesList.php +++ b/includes/changes/EnhancedChangesList.php @@ -270,6 +270,20 @@ class EnhancedChangesList extends ChangesList { $queryParams['curid'] = $curId; + # Sub-entries + $lines = ''; + foreach ( $block as $i => $rcObj ) { + $line = $this->getLineData( $block, $rcObj, $queryParams ); + $lines .= $line; + if ( !$line ) { + // completely ignore this RC entry if we don't want to render it + unset( $block[$i] ); + } + } + // Further down are some assumptions that $block is a 0-indexed array + // with (count-1) as last key. Let's make sure it is. + $block = array_values( $block ); + $r .= $this->getLogText( $block, $queryParams, $allLogs, $isnew, $namehidden ); $r .= ' . . '; @@ -299,116 +313,133 @@ class EnhancedChangesList extends ChangesList { $r .= $this->numberofWatchingusers( $block[0]->numberofWatchingusers ); $r .= ''; - # Sub-entries - foreach ( $block as $rcObj ) { - # Classes to apply -- TODO implement - $classes = array(); - $type = $rcObj->mAttribs['rc_type']; - $data = array(); - - $trClass = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched - ? ' class="mw-enhanced-watched"' : ''; - $separator = ' . . '; - - $data['recentChangesFlags'] = array( - 'newpage' => $type == RC_NEW, - 'minor' => $rcObj->mAttribs['rc_minor'], - 'unpatrolled' => $rcObj->unpatrolled, - 'bot' => $rcObj->mAttribs['rc_bot'], - ); + if ( !$lines ) { + // if there are no lines to be rendered (all aborted by hook), don't render the block + return ''; + } - $params = $queryParams; + $r .= $lines; + $r .= "\n"; - if ( $rcObj->mAttribs['rc_this_oldid'] != 0 ) { - $params['oldid'] = $rcObj->mAttribs['rc_this_oldid']; - } + $this->rcCacheIndex++; + + return $r; + } - # Log timestamp - if ( $type == RC_LOG ) { - $link = $rcObj->timestamp; + /** + * @param RCCacheEntry[] $block + * @param RCCacheEntry $rcObj + * @param array $queryParams + * @return string + * @throws Exception + * @throws FatalError + * @throws MWException + */ + protected function getLineData( array $block, RCCacheEntry $rcObj, array $queryParams = array() ) { + $RCShowChangedSize = $this->getConfig()->get( 'RCShowChangedSize' ); + + # Classes to apply -- TODO implement + $classes = array(); + $type = $rcObj->mAttribs['rc_type']; + $data = array(); + + $trClass = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched + ? ' class="mw-enhanced-watched"' : ''; + $separator = ' . . '; + + $data['recentChangesFlags'] = array( + 'newpage' => $type == RC_NEW, + 'minor' => $rcObj->mAttribs['rc_minor'], + 'unpatrolled' => $rcObj->unpatrolled, + 'bot' => $rcObj->mAttribs['rc_bot'], + ); + + $params = $queryParams; + + if ( $rcObj->mAttribs['rc_this_oldid'] != 0 ) { + $params['oldid'] = $rcObj->mAttribs['rc_this_oldid']; + } + + # Log timestamp + if ( $type == RC_LOG ) { + $link = $rcObj->timestamp; # Revision link - } elseif ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) { - $link = '' . $rcObj->timestamp . ' '; - } else { - $link = Linker::linkKnown( - $rcObj->getTitle(), - $rcObj->timestamp, - array(), - $params - ); - if ( $this->isDeleted( $rcObj, Revision::DELETED_TEXT ) ) { - $link = '' . $link . ' '; - } + } elseif ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) { + $link = '' . $rcObj->timestamp . ' '; + } else { + $link = Linker::linkKnown( + $rcObj->getTitle(), + $rcObj->timestamp, + array(), + $params + ); + if ( $this->isDeleted( $rcObj, Revision::DELETED_TEXT ) ) { + $link = '' . $link . ' '; } - $data['timestampLink'] = $link; + } + $data['timestampLink'] = $link; - $currentAndLastLinks = ''; - if ( !$type == RC_LOG || $type == RC_NEW ) { - $currentAndLastLinks .= ' ' . $this->msg( 'parentheses' )->rawParams( + $currentAndLastLinks = ''; + if ( !$type == RC_LOG || $type == RC_NEW ) { + $currentAndLastLinks .= ' ' . $this->msg( 'parentheses' )->rawParams( $rcObj->curlink . - $this->message['pipe-separator'] . - $rcObj->lastlink + $this->message['pipe-separator'] . + $rcObj->lastlink )->escaped(); - } - $data['currentAndLastLinks'] = $currentAndLastLinks; - $data['separatorAfterCurrentAndLastLinks'] = $separator; - - # Character diff - if ( $RCShowChangedSize ) { - $cd = $this->formatCharacterDifference( $rcObj ); - if ( $cd !== '' ) { - $data['characterDiff'] = $cd; - $data['separatorAfterCharacterDiff'] = $separator; - } - } + } + $data['currentAndLastLinks'] = $currentAndLastLinks; + $data['separatorAfterCurrentAndLastLinks'] = $separator; - if ( $rcObj->mAttribs['rc_type'] == RC_LOG ) { - $data['logEntry'] = $this->insertLogEntry( $rcObj ); - } else { - # User links - $data['userLink'] = $rcObj->userlink; - $data['userTalkLink'] = $rcObj->usertalklink; - $data['comment'] = $this->insertComment( $rcObj ); + # Character diff + if ( $RCShowChangedSize ) { + $cd = $this->formatCharacterDifference( $rcObj ); + if ( $cd !== '' ) { + $data['characterDiff'] = $cd; + $data['separatorAfterCharacterDiff'] = $separator; } + } - # Rollback - $data['rollback'] = $this->getRollback( $rcObj ); - - # Tags - $data['tags'] = $this->getTags( $rcObj, $classes ); - - // give the hook a chance to modify the data - $success = Hooks::run( 'EnhancedChangesListModifyLineData', - array( $this, &$data, $block, $rcObj ) ); - if ( !$success ) { - // skip entry if hook aborted it - continue; - } + if ( $rcObj->mAttribs['rc_type'] == RC_LOG ) { + $data['logEntry'] = $this->insertLogEntry( $rcObj ); + } else { + # User links + $data['userLink'] = $rcObj->userlink; + $data['userTalkLink'] = $rcObj->usertalklink; + $data['comment'] = $this->insertComment( $rcObj ); + } - $line = ''; - if ( isset( $data['recentChangesFlags'] ) ) { - $line .= $this->recentChangesFlags( $data['recentChangesFlags'] ); - unset( $data['recentChangesFlags'] ); - } - $line .= ' '; + # Rollback + $data['rollback'] = $this->getRollback( $rcObj ); - if ( isset( $data['timestampLink'] ) ) { - $line .= '' . $data['timestampLink'] . ''; - unset( $data['timestampLink'] ); - } + # Tags + $data['tags'] = $this->getTags( $rcObj, $classes ); - // everything else: makes it easier for extensions to add or remove data - $line .= implode( '', $data ); + // give the hook a chance to modify the data + $success = Hooks::run( 'EnhancedChangesListModifyLineData', + array( $this, &$data, $block, $rcObj ) ); + if ( !$success ) { + // skip entry if hook aborted it + return ''; + } - $line .= "\n"; + $line = ''; + if ( isset( $data['recentChangesFlags'] ) ) { + $line .= $this->recentChangesFlags( $data['recentChangesFlags'] ); + unset( $data['recentChangesFlags'] ); + } + $line .= ' '; - $r .= $line; + if ( isset( $data['timestampLink'] ) ) { + $line .= '' . $data['timestampLink'] . ''; + unset( $data['timestampLink'] ); } - $r .= "\n"; - $this->rcCacheIndex++; + // everything else: makes it easier for extensions to add or remove data + $line .= implode( '', $data ); - return $r; + $line .= "\n"; + + return $line; } /**