MediaWiki  master
NewFilesPager.php
Go to the documentation of this file.
1 <?php
27 
29 
33  protected $gallery;
34 
38  protected $opts;
39 
47  ) {
48  parent::__construct( $context, $linkRenderer );
49 
50  $this->opts = $opts;
51  $this->setLimit( $opts->getValue( 'limit' ) );
52 
53  $startTimestamp = '';
54  $endTimestamp = '';
55  if ( $opts->getValue( 'start' ) ) {
56  $startTimestamp = $opts->getValue( 'start' ) . ' 00:00:00';
57  }
58  if ( $opts->getValue( 'end' ) ) {
59  $endTimestamp = $opts->getValue( 'end' ) . ' 23:59:59';
60  }
61  $this->getDateRangeCond( $startTimestamp, $endTimestamp );
62  }
63 
64  public function getQueryInfo() {
66  $conds = [];
67  $actorQuery = ActorMigration::newMigration()->getJoin( 'img_user' );
68  $tables = [ 'image' ] + $actorQuery['tables'];
69  $fields = [ 'img_name', 'img_timestamp' ] + $actorQuery['fields'];
70  $options = [];
71  $jconds = $actorQuery['joins'];
72 
73  $user = $opts->getValue( 'user' );
74  if ( $user !== '' ) {
75  $conds[] = ActorMigration::newMigration()
76  ->getWhere( wfGetDB( DB_REPLICA ), 'img_user', User::newFromName( $user, false ) )['conds'];
77  }
78 
79  if ( !$opts->getValue( 'showbots' ) ) {
80  $groupsWithBotPermission = MediaWikiServices::getInstance()
81  ->getPermissionManager()
82  ->getGroupsWithPermission( 'bot' );
83 
84  if ( count( $groupsWithBotPermission ) ) {
85  $dbr = wfGetDB( DB_REPLICA );
86  $tables[] = 'user_groups';
87  $conds[] = 'ug_group IS NULL';
88  $jconds['user_groups'] = [
89  'LEFT JOIN',
90  [
91  'ug_group' => $groupsWithBotPermission,
92  'ug_user = ' . $actorQuery['fields']['img_user'],
93  'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() )
94  ]
95  ];
96  }
97  }
98 
99  if ( $opts->getValue( 'hidepatrolled' ) ) {
100  $tables[] = 'recentchanges';
101  $conds['rc_type'] = RC_LOG;
102  $conds['rc_log_type'] = 'upload';
103  $conds['rc_patrolled'] = RecentChange::PRC_UNPATROLLED;
104  $conds['rc_namespace'] = NS_FILE;
105 
106  $jconds['recentchanges'] = [
107  'JOIN',
108  [
109  'rc_title = img_name',
110  'rc_actor = ' . $actorQuery['fields']['img_actor'],
111  'rc_timestamp = img_timestamp'
112  ]
113  ];
114  }
115 
116  if ( $opts->getValue( 'mediatype' ) ) {
117  $conds['img_media_type'] = $opts->getValue( 'mediatype' );
118  }
119 
120  $likeVal = $opts->getValue( 'like' );
121  if ( !$this->getConfig()->get( 'MiserMode' ) && $likeVal !== '' ) {
122  $dbr = wfGetDB( DB_REPLICA );
123  $likeObj = Title::newFromText( $likeVal );
124  if ( $likeObj instanceof Title ) {
125  $like = $dbr->buildLike(
126  $dbr->anyString(),
127  strtolower( $likeObj->getDBkey() ),
128  $dbr->anyString()
129  );
130  $conds[] = "LOWER(img_name) $like";
131  }
132  }
133 
134  // We're ordering by img_timestamp, but MariaDB sometimes likes to query other tables first
135  // and filesort the result set later.
136  // See T124205 / https://mariadb.atlassian.net/browse/MDEV-8880, and T244533
137  $options[] = 'STRAIGHT_JOIN';
138 
139  $query = [
140  'tables' => $tables,
141  'fields' => $fields,
142  'join_conds' => $jconds,
143  'conds' => $conds,
144  'options' => $options,
145  ];
146 
147  return $query;
148  }
149 
150  public function getIndexField() {
151  return 'img_timestamp';
152  }
153 
154  protected function getStartBody() {
155  if ( !$this->gallery ) {
156  // Note that null for mode is taken to mean use default.
157  $mode = $this->getRequest()->getVal( 'gallerymode', null );
158  try {
159  $this->gallery = ImageGalleryBase::factory( $mode, $this->getContext() );
160  } catch ( Exception $e ) {
161  // User specified something invalid, fallback to default.
162  $this->gallery = ImageGalleryBase::factory( false, $this->getContext() );
163  }
164  }
165 
166  return '';
167  }
168 
169  protected function getEndBody() {
170  return $this->gallery->toHTML();
171  }
172 
173  protected function doBatchLookups() {
174  $userIds = [];
175  $this->mResult->seek( 0 );
176  foreach ( $this->mResult as $row ) {
177  $userIds[] = $row->img_user;
178  }
179  // Do a link batch query for names and userpages
180  UserCache::singleton()->doQuery( $userIds, [ 'userpage' ], __METHOD__ );
181  }
182 
183  public function formatRow( $row ) {
184  $name = $row->img_name;
185  $username = UserCache::singleton()->getUserName( $row->img_user, $row->img_user_text );
186 
187  $title = Title::makeTitle( NS_FILE, $name );
188  if ( ExternalUserNames::isExternal( $username ) ) {
189  $ul = htmlspecialchars( $username );
190  } else {
191  $ul = $this->getLinkRenderer()->makeLink(
192  Title::makeTitle( NS_USER, $username ),
193  $username
194  );
195  }
196  $time = $this->getLanguage()->userTimeAndDate( $row->img_timestamp, $this->getUser() );
197 
198  $this->gallery->add(
199  $title,
200  "$ul<br />\n<i>"
201  . htmlspecialchars( $time )
202  . "</i><br />\n",
203  '',
204  '',
205  [],
207  );
208  return '';
209  }
210 }
ContextSource\$context
IContextSource $context
Definition: ContextSource.php:34
ContextSource\getConfig
getConfig()
Definition: ContextSource.php:67
Title\newFromText
static newFromText( $text, $defaultNamespace=NS_MAIN)
Create a new Title from text, such as what one would find in a link.
Definition: Title.php:329
ContextSource\getContext
getContext()
Get the base IContextSource object.
Definition: ContextSource.php:42
MediaWiki\MediaWikiServices
MediaWikiServices is the service locator for the application scope of MediaWiki.
Definition: MediaWikiServices.php:154
FormOptions\getValue
getValue( $name)
Get the value for the given option name.
Definition: FormOptions.php:182
ImageGalleryBase
Image gallery.
Definition: ImageGalleryBase.php:32
MediaWiki\Linker\LinkRenderer
Class that generates HTML links for pages.
Definition: LinkRenderer.php:41
RC_LOG
const RC_LOG
Definition: Defines.php:133
ImageGalleryBase\LOADING_LAZY
const LOADING_LAZY
Definition: ImageGalleryBase.php:34
NS_FILE
const NS_FILE
Definition: Defines.php:75
User\newFromName
static newFromName( $name, $validate='valid')
Static factory method for creation from username.
Definition: User.php:538
IndexPager\$linkRenderer
LinkRenderer $linkRenderer
Definition: IndexPager.php:167
NewFilesPager\$gallery
ImageGalleryBase $gallery
Definition: NewFilesPager.php:33
ContextSource\getRequest
getRequest()
Definition: ContextSource.php:76
ActorMigration\newMigration
static newMigration()
Static constructor.
Definition: ActorMigration.php:140
$dbr
$dbr
Definition: testCompression.php:54
NewFilesPager\formatRow
formatRow( $row)
Returns an HTML string representing the result row $row.
Definition: NewFilesPager.php:183
ContextSource\getLanguage
getLanguage()
Definition: ContextSource.php:140
IndexPager\setLimit
setLimit( $limit)
Set the limit from an other source than the request.
Definition: IndexPager.php:325
wfGetDB
wfGetDB( $db, $groups=[], $wiki=false)
Get a Database object.
Definition: GlobalFunctions.php:2467
RangeChronologicalPager\getDateRangeCond
getDateRangeCond( $startStamp, $endStamp)
Set and return a date range condition using timestamps provided by the user.
Definition: RangeChronologicalPager.php:46
$title
$title
Definition: testCompression.php:38
NewFilesPager\getStartBody
getStartBody()
Hook into getBody(), allows text to be inserted at the start.
Definition: NewFilesPager.php:154
Title\makeTitle
static makeTitle( $ns, $title, $fragment='', $interwiki='')
Create a new Title from a namespace index and a DB key.
Definition: Title.php:592
DB_REPLICA
const DB_REPLICA
Definition: defines.php:25
RangeChronologicalPager
Pager for filtering by a range of dates.
Definition: RangeChronologicalPager.php:28
$ul
$ul
Definition: upgradeLogging.php:222
NewFilesPager\doBatchLookups
doBatchLookups()
Called from getBody(), before getStartBody() is called and after doQuery() was called.
Definition: NewFilesPager.php:173
NewFilesPager\$opts
FormOptions $opts
Definition: NewFilesPager.php:38
NewFilesPager\__construct
__construct(IContextSource $context, FormOptions $opts, LinkRenderer $linkRenderer)
Definition: NewFilesPager.php:45
IndexPager\getLinkRenderer
getLinkRenderer()
Definition: IndexPager.php:976
IContextSource
Interface for objects which can provide a MediaWiki context on request.
Definition: IContextSource.php:55
NewFilesPager\getQueryInfo
getQueryInfo()
Provides all parameters needed for the main paged query.
Definition: NewFilesPager.php:64
Title
Represents a title within MediaWiki.
Definition: Title.php:42
RecentChange\PRC_UNPATROLLED
const PRC_UNPATROLLED
Definition: RecentChange.php:82
UserCache\singleton
static singleton()
Definition: UserCache.php:34
NewFilesPager\getEndBody
getEndBody()
Hook into getBody() for the end of the list.
Definition: NewFilesPager.php:169
NS_USER
const NS_USER
Definition: Defines.php:71
NewFilesPager\getIndexField
getIndexField()
Returns the name of the index field.
Definition: NewFilesPager.php:150
ImageGalleryBase\factory
static factory( $mode=false, IContextSource $context=null)
Get a new image gallery.
Definition: ImageGalleryBase.php:116
FormOptions
Helper class to keep track of options when mixing links and form elements.
Definition: FormOptions.php:35
ExternalUserNames\isExternal
static isExternal( $username)
Tells whether the username is external or not.
Definition: ExternalUserNames.php:137
NewFilesPager
Definition: NewFilesPager.php:28