const NO_ACTION_LINK = 1;
const NO_EXTRA_USER_LINKS = 2;
+ /**
+ * @var Skin
+ */
private $skin;
+
+ /**
+ * @var OutputPage
+ */
private $out;
public $flags;
+ /**
+ * @var Array
+ */
+ protected $message;
+
+ /**
+ * @var Array
+ */
+ protected $mDefaultQuery;
+
public function __construct( $skin, $out, $flags = 0 ) {
$this->skin = $skin;
$this->out = $out;
* @param $tagFilter: array?
*/
public function showOptions( $types=array(), $user='', $page='', $pattern='', $year='',
- $month = '', $filter = null, $tagFilter='' )
- {
+ $month = '', $filter = null, $tagFilter='' ) {
global $wgScript, $wgMiserMode;
$action = $wgScript;
* @return String: Formatted HTML
*/
private function getFilterLinks( $filter ) {
- global $wgTitle, $wgLang;
+ global $wgLang;
// show/hide links
$messages = array( wfMsgHtml( 'show' ), wfMsgHtml( 'hide' ) );
// Option value -> message mapping
$query[$queryKey] = $hideVal;
$link = $this->skin->link(
- $wgTitle,
+ $this->out->getTitle(),
$messages[$hideVal],
array(),
$query,
return $comment;
}
- // @TODO: split up!
+ /**
+ * @TODO: split up!
+ *
+ * @param $row
+ * @param Title $title
+ * @param Array $paramArray
+ * @param $comment
+ * @return String
+ */
private function logActionLinks( $row, $title, $paramArray, &$comment ) {
global $wgUser;
if( ( $this->flags & self::NO_ACTION_LINK ) // we don't want to see the action
} else if( self::typeAction( $row, array( 'block', 'suppress' ), array( 'block', 'reblock' ), 'block' ) ) {
$revert = '(' .
$this->skin->link(
- SpecialPage::getTitleFor( 'Ipblocklist' ),
+ SpecialPage::getTitleFor( 'Unblock', $row->log_title ),
$this->message['unblocklink'],
array(),
- array(
- 'action' => 'unblock',
- 'ip' => $row->log_title
- ),
+ array(),
'known'
) .
$this->message['pipe-separator'] .
$this->skin->link(
- SpecialPage::getTitleFor( 'Blockip', $row->log_title ),
+ SpecialPage::getTitleFor( 'Block', $row->log_title ),
$this->message['change-blocklink'],
array(),
array(),
if( count($paramArray) >= 1 ) {
$revdel = SpecialPage::getTitleFor( 'Revisiondelete' );
// $paramArray[1] is a CSV of the IDs
- $Ids = explode( ',', $paramArray[0] );
$query = $paramArray[0];
// Link to each hidden object ID, $paramArray[1] is the url param
$revert = '(' . $this->skin->link(
private function getShowHideLinks( $row ) {
global $wgUser;
if( ( $this->flags & self::NO_ACTION_LINK ) // we don't want to see the links
- || $row->log_type == 'suppress' ) // no one can hide items from the suppress log
- {
+ || $row->log_type == 'suppress' ) { // no one can hide items from the suppress log
return '';
}
$del = '';
/**
* Show log extract. Either with text and a box (set $msgKey) or without (don't set $msgKey)
*
- * @param $out OutputPage or String-by-reference
+ * @param $out OutputPage|String-by-reference
* @param $types String or Array
* @param $page String The page title to show log entries for
* @param $user String The user who made the log entries
* @param $tagFilter String: tag
*/
public function __construct( $list, $types = array(), $user = '', $title = '', $pattern = '',
- $conds = array(), $year = false, $month = false, $tagFilter = '' )
- {
+ $conds = array(), $year = false, $month = false, $tagFilter = '' ) {
parent::__construct();
$this->mConds = $conds;
global $wgMiserMode, $wgUser;
$title = Title::newFromText( $page );
- if( strlen( $page ) == 0 || !$title instanceof Title )
+ if( strlen( $page ) == 0 || !$title instanceof Title ) {
return false;
+ }
$this->title = $title->getPrefixedText();
$ns = $title->getNamespace();
$this->mConds[] = 'user_id = log_user';
$index = array();
$options = array();
- # Add log_search table if there are conditions on it
- if( array_key_exists('ls_field',$this->mConds) ) {
+ # Add log_search table if there are conditions on it.
+ # This filters the results to only include log rows that have
+ # log_search records with the specified ls_field and ls_value values.
+ if( array_key_exists( 'ls_field', $this->mConds ) ) {
$tables[] = 'log_search';
$index['log_search'] = 'ls_field_val';
$index['logging'] = 'PRIMARY';
- $options[] = 'DISTINCT';
+ if ( !$this->hasEqualsClause( 'ls_field' )
+ || !$this->hasEqualsClause( 'ls_value' ) )
+ {
+ # Since (ls_field,ls_value,ls_logid) is unique, if the condition is
+ # to match a specific (ls_field,ls_value) tuple, then there will be
+ # no duplicate log rows. Otherwise, we need to remove the duplicates.
+ $options[] = 'DISTINCT';
+ }
# Avoid usage of the wrong index by limiting
# the choices of available indexes. This mainly
# avoids site-breaking filesorts.
'conds' => $this->mConds,
'options' => $options,
'join_conds' => array(
- 'user' => array( 'INNER JOIN', 'user_id=log_user' ),
+ 'user' => array( 'INNER JOIN', 'user_id=log_user' ),
'log_search' => array( 'INNER JOIN', 'ls_log_id=log_id' )
)
);
return $info;
}
+ // Checks if $this->mConds has $field matched to a *single* value
+ protected function hasEqualsClause( $field ) {
+ return (
+ array_key_exists( $field, $this->mConds ) &&
+ ( !is_array( $this->mConds[$field] ) || count( $this->mConds[$field] ) == 1 )
+ );
+ }
+
function getIndexField() {
return 'log_timestamp';
}
public function show() {
global $wgOut;
# Set title and add header
- $this->list->showHeader( $pager->getType() );
+ $this->list->showHeader( $this->pager->getType() );
# Show form options
$this->list->showOptions( $this->pager->getType(), $this->pager->getUser(), $this->pager->getPage(),
$this->pager->getPattern(), $this->pager->getYear(), $this->pager->getMonth() );