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.

Change-Id: I94ae68e80461dcfbf328683522ea6cb58c6c5753
This commit is contained in:
Matthias Mullie 2015-07-08 16:39:05 +02:00
parent 69f0d1d34b
commit b30417048b

View file

@ -270,6 +270,17 @@ 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] );
}
}
$r .= $this->getLogText( $block, $queryParams, $allLogs, $isnew, $namehidden );
$r .= ' <span class="mw-changeslist-separator">. .</span> ';
@ -299,111 +310,12 @@ class EnhancedChangesList extends ChangesList {
$r .= $this->numberofWatchingusers( $block[0]->numberofWatchingusers );
$r .= '</td></tr>';
# 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 = ' <span class="mw-changeslist-separator">. .</span> ';
$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 = '<span class="history-deleted">' . $rcObj->timestamp . '</span> ';
} else {
$link = Linker::linkKnown(
$rcObj->getTitle(),
$rcObj->timestamp,
array(),
$params
);
if ( $this->isDeleted( $rcObj, Revision::DELETED_TEXT ) ) {
$link = '<span class="history-deleted">' . $link . '</span> ';
}
}
$data['timestampLink'] = $link;
$currentAndLastLinks = '';
if ( !$type == RC_LOG || $type == RC_NEW ) {
$currentAndLastLinks .= ' ' . $this->msg( 'parentheses' )->rawParams(
$rcObj->curlink .
$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;
}
}
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 );
}
# 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;
}
$line = '<tr' . $trClass . '><td></td><td class="mw-enhanced-rc">';
if ( isset( $data['recentChangesFlags'] ) ) {
$line .= $this->recentChangesFlags( $data['recentChangesFlags'] );
unset( $data['recentChangesFlags'] );
}
$line .= '&#160;</td><td class="mw-enhanced-rc-nested">';
if ( isset( $data['timestampLink'] ) ) {
$line .= '<span class="mw-enhanced-rc-time">' . $data['timestampLink'] . '</span>';
unset( $data['timestampLink'] );
}
// everything else: makes it easier for extensions to add or remove data
$line .= implode( '', $data );
$line .= "</td></tr>\n";
$r .= $line;
if ( !$lines ) {
// if there are no lines to be rendered (all aborted by hook), don't render the block
return '';
}
$r .= $lines;
$r .= "</table>\n";
$this->rcCacheIndex++;
@ -411,6 +323,122 @@ class EnhancedChangesList extends ChangesList {
return $r;
}
/**
* @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 = ' <span class="mw-changeslist-separator">. .</span> ';
$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 = '<span class="history-deleted">' . $rcObj->timestamp . '</span> ';
} else {
$link = Linker::linkKnown(
$rcObj->getTitle(),
$rcObj->timestamp,
array(),
$params
);
if ( $this->isDeleted( $rcObj, Revision::DELETED_TEXT ) ) {
$link = '<span class="history-deleted">' . $link . '</span> ';
}
}
$data['timestampLink'] = $link;
$currentAndLastLinks = '';
if ( !$type == RC_LOG || $type == RC_NEW ) {
$currentAndLastLinks .= ' ' . $this->msg( 'parentheses' )->rawParams(
$rcObj->curlink .
$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;
}
}
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 );
}
# 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
return '';
}
$line = '<tr' . $trClass . '><td></td><td class="mw-enhanced-rc">';
if ( isset( $data['recentChangesFlags'] ) ) {
$line .= $this->recentChangesFlags( $data['recentChangesFlags'] );
unset( $data['recentChangesFlags'] );
}
$line .= '&#160;</td><td class="mw-enhanced-rc-nested">';
if ( isset( $data['timestampLink'] ) ) {
$line .= '<span class="mw-enhanced-rc-time">' . $data['timestampLink'] . '</span>';
unset( $data['timestampLink'] );
}
// everything else: makes it easier for extensions to add or remove data
$line .= implode( '', $data );
$line .= "</td></tr>\n";
return $line;
}
/**
* Generates amount of changes (linking to diff ) & link to history.
*