if ( !$message->isDisabled() ) {
$this->getOutput()->addWikiText(
Html::rawElement( 'p',
- array( 'lang' => $wgContLang->getHtmlCode(), 'dir' => $wgContLang->getDir() ),
+ [ 'lang' => $wgContLang->getHtmlCode(), 'dir' => $wgContLang->getDir() ],
"\n" . $message->plain() . "\n"
),
/* $lineStart */ false,
*/
protected $gallery;
+ /**
+ * @var bool
+ */
+ protected $showBots;
+
+ /**
+ * @var bool
+ */
+ protected $hidePatrolled;
+
function __construct( IContextSource $context, $par = null ) {
$this->like = $context->getRequest()->getText( 'like' );
- $this->showbots = $context->getRequest()->getBool( 'showbots', 0 );
+ $this->showBots = $context->getRequest()->getBool( 'showbots', 0 );
+ $this->hidePatrolled = $context->getRequest()->getBool( 'hidepatrolled', 0 );
if ( is_numeric( $par ) ) {
$this->setLimit( $par );
}
}
function getQueryInfo() {
- $conds = $jconds = array();
- $tables = array( 'image' );
+ $conds = $jconds = [];
+ $tables = [ 'image' ];
+ $fields = [ 'img_name', 'img_user', 'img_timestamp' ];
+ $options = [];
- if ( !$this->showbots ) {
+ if ( !$this->showBots ) {
$groupsWithBotPermission = User::getGroupsWithPermission( 'bot' );
if ( count( $groupsWithBotPermission ) ) {
$tables[] = 'user_groups';
$conds[] = 'ug_group IS NULL';
- $jconds['user_groups'] = array(
+ $jconds['user_groups'] = [
'LEFT JOIN',
- array(
+ [
'ug_group' => $groupsWithBotPermission,
'ug_user = img_user'
- )
- );
+ ]
+ ];
}
}
+ if ( $this->hidePatrolled ) {
+ $tables[] = 'recentchanges';
+ $conds['rc_type'] = RC_LOG;
+ $conds['rc_log_type'] = 'upload';
+ $conds['rc_patrolled'] = 0;
+ $conds['rc_namespace'] = NS_FILE;
+ $jconds['recentchanges'] = [
+ 'INNER JOIN',
+ [
+ 'rc_title = img_name',
+ 'rc_user = img_user',
+ 'rc_timestamp = img_timestamp'
+ ]
+ ];
+ // We're ordering by img_timestamp, so we have to make sure MariaDB queries `image` first.
+ // It sometimes decides to query `recentchanges` first and filesort the result set later
+ // to get the right ordering. T124205 / https://mariadb.atlassian.net/browse/MDEV-8880
+ $options[] = 'STRAIGHT_JOIN';
+ }
+
if ( !$this->getConfig()->get( 'MiserMode' ) && $this->like !== null ) {
$dbr = wfGetDB( DB_SLAVE );
$likeObj = Title::newFromText( $this->like );
}
}
- $query = array(
+ $query = [
'tables' => $tables,
- 'fields' => '*',
+ 'fields' => $fields,
'join_conds' => $jconds,
- 'conds' => $conds
- );
+ 'conds' => $conds,
+ 'options' => $options,
+ ];
return $query;
}
}
function getForm() {
- $fields = array(
- 'like' => array(
+ $fields = [
+ 'like' => [
'type' => 'text',
'label-message' => 'newimages-label',
'name' => 'like',
- ),
- 'showbots' => array(
+ ],
+ 'showbots' => [
'type' => 'check',
'label-message' => 'newimages-showbots',
'name' => 'showbots',
- ),
- 'limit' => array(
+ ],
+ 'hidepatrolled' => [
+ 'type' => 'check',
+ 'label-message' => 'newimages-hidepatrolled',
+ 'name' => 'hidepatrolled',
+ ],
+ 'limit' => [
'type' => 'hidden',
'default' => $this->mLimit,
'name' => 'limit',
- ),
- 'offset' => array(
+ ],
+ 'offset' => [
'type' => 'hidden',
'default' => $this->getRequest()->getText( 'offset' ),
'name' => 'offset',
- ),
- );
+ ],
+ ];
if ( $this->getConfig()->get( 'MiserMode' ) ) {
unset( $fields['like'] );
}
+ if ( !$this->getUser()->useFilePatrol() ) {
+ unset( $fields['hidepatrolled'] );
+ }
+
$context = new DerivativeContext( $this->getContext() );
$context->setTitle( $this->getTitle() ); // Remove subpage
$form = new HTMLForm( $fields, $context );