MediaWiki  master
NewFilesPager.php
Go to the documentation of this file.
1 <?php
26 
31 
35  protected $gallery;
36 
40  protected $opts;
41 
44 
47 
56  public function __construct(
61  ILoadBalancer $loadBalancer,
63  ) {
64  // Set database before parent constructor to avoid setting it there with wfGetDB
65  $this->mDb = $loadBalancer->getConnectionRef( ILoadBalancer::DB_REPLICA );
66 
67  parent::__construct( $context, $linkRenderer );
68 
69  $this->opts = $opts;
70  $this->groupPermissionsLookup = $groupPermissionsLookup;
71  $this->linkBatchFactory = $linkBatchFactory;
72  $this->setLimit( $opts->getValue( 'limit' ) );
73 
74  $startTimestamp = '';
75  $endTimestamp = '';
76  if ( $opts->getValue( 'start' ) ) {
77  $startTimestamp = $opts->getValue( 'start' ) . ' 00:00:00';
78  }
79  if ( $opts->getValue( 'end' ) ) {
80  $endTimestamp = $opts->getValue( 'end' ) . ' 23:59:59';
81  }
82  $this->getDateRangeCond( $startTimestamp, $endTimestamp );
83  }
84 
85  public function getQueryInfo() {
87  $conds = [];
88  $dbr = $this->getDatabase();
89  $tables = [ 'image', 'actor' ];
90  $fields = [ 'img_name', 'img_timestamp', 'actor_user', 'actor_name' ];
91  $options = [];
92  $jconds = [ 'actor' => [ 'JOIN', 'actor_id=img_actor' ] ];
93 
94  $user = $opts->getValue( 'user' );
95  if ( $user !== '' ) {
96  $conds['actor_name'] = $user;
97  }
98 
99  if ( !$opts->getValue( 'showbots' ) ) {
100  $groupsWithBotPermission = $this->groupPermissionsLookup->getGroupsWithPermission( 'bot' );
101 
102  if ( count( $groupsWithBotPermission ) ) {
103  $tables[] = 'user_groups';
104  $conds[] = 'ug_group IS NULL';
105  $jconds['user_groups'] = [
106  'LEFT JOIN',
107  [
108  'ug_group' => $groupsWithBotPermission,
109  'ug_user = actor_user',
110  'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() )
111  ]
112  ];
113  }
114  }
115 
116  if ( $opts->getValue( 'hidepatrolled' ) ) {
117  $tables[] = 'recentchanges';
118  $conds['rc_type'] = RC_LOG;
119  $conds['rc_log_type'] = 'upload';
120  $conds['rc_patrolled'] = RecentChange::PRC_UNPATROLLED;
121  $conds['rc_namespace'] = NS_FILE;
122 
123  $jconds['recentchanges'] = [
124  'JOIN',
125  [
126  'rc_title = img_name',
127  'rc_actor = img_actor',
128  'rc_timestamp = img_timestamp'
129  ]
130  ];
131  }
132 
133  if ( $opts->getValue( 'mediatype' ) ) {
134  $conds['img_media_type'] = $opts->getValue( 'mediatype' );
135  }
136 
137  $likeVal = $opts->getValue( 'like' );
138  if ( !$this->getConfig()->get( 'MiserMode' ) && $likeVal !== '' ) {
139  $likeObj = Title::newFromText( $likeVal );
140  if ( $likeObj instanceof Title ) {
141  $like = $dbr->buildLike(
142  $dbr->anyString(),
143  strtolower( $likeObj->getDBkey() ),
144  $dbr->anyString()
145  );
146  $conds[] = "LOWER(img_name) $like";
147  }
148  }
149 
150  // We're ordering by img_timestamp, but MariaDB sometimes likes to query other tables first
151  // and filesort the result set later.
152  // See T124205 / https://mariadb.atlassian.net/browse/MDEV-8880, and T244533
153  $options[] = 'STRAIGHT_JOIN';
154 
155  $query = [
156  'tables' => $tables,
157  'fields' => $fields,
158  'join_conds' => $jconds,
159  'conds' => $conds,
160  'options' => $options,
161  ];
162 
163  return $query;
164  }
165 
166  public function getIndexField() {
167  return 'img_timestamp';
168  }
169 
170  protected function getStartBody() {
171  if ( !$this->gallery ) {
172  // Note that null for mode is taken to mean use default.
173  $mode = $this->getRequest()->getVal( 'gallerymode', null );
174  try {
175  $this->gallery = ImageGalleryBase::factory( $mode, $this->getContext() );
176  } catch ( Exception $e ) {
177  // User specified something invalid, fallback to default.
178  $this->gallery = ImageGalleryBase::factory( false, $this->getContext() );
179  }
180  }
181 
182  return '';
183  }
184 
185  protected function getEndBody() {
186  return $this->gallery->toHTML();
187  }
188 
189  protected function doBatchLookups() {
190  $this->mResult->seek( 0 );
191  $lb = $this->linkBatchFactory->newLinkBatch();
192  foreach ( $this->mResult as $row ) {
193  if ( $row->actor_user ) {
194  $lb->add( NS_USER, $row->actor_name );
195  }
196  }
197  $lb->execute();
198  }
199 
200  public function formatRow( $row ) {
201  $username = $row->actor_name;
202 
203  if ( ExternalUserNames::isExternal( $username ) ) {
204  $ul = htmlspecialchars( $username );
205  } else {
206  $ul = $this->getLinkRenderer()->makeLink(
207  new TitleValue( NS_USER, $username ),
208  $username
209  );
210  }
211  $time = $this->getLanguage()->userTimeAndDate( $row->img_timestamp, $this->getUser() );
212 
213  $this->gallery->add(
214  Title::makeTitle( NS_FILE, $row->img_name ),
215  "$ul<br />\n<i>"
216  . htmlspecialchars( $time )
217  . "</i><br />\n",
218  '',
219  '',
220  [],
222  );
223 
224  return '';
225  }
226 }
ContextSource\$context
IContextSource $context
Definition: ContextSource.php:39
ContextSource\getConfig
getConfig()
Definition: ContextSource.php:72
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:415
ContextSource\getContext
getContext()
Get the base IContextSource object.
Definition: ContextSource.php:47
MediaWiki\Permissions\GroupPermissionsLookup
Definition: GroupPermissionsLookup.php:30
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:43
ImageGalleryBase\LOADING_LAZY
const LOADING_LAZY
Definition: ImageGalleryBase.php:34
IndexPager\getDatabase
getDatabase()
Get the Database object in use.
Definition: IndexPager.php:244
IndexPager\$linkRenderer
LinkRenderer $linkRenderer
Definition: IndexPager.php:167
NewFilesPager\$gallery
ImageGalleryBase $gallery
Definition: NewFilesPager.php:35
ContextSource\getRequest
getRequest()
Definition: ContextSource.php:81
Wikimedia\Rdbms\ILoadBalancer\getConnectionRef
getConnectionRef( $i, $groups=[], $domain=false, $flags=0)
Get a live database handle reference for a server index.
NewFilesPager\$groupPermissionsLookup
GroupPermissionsLookup $groupPermissionsLookup
Definition: NewFilesPager.php:43
$dbr
$dbr
Definition: testCompression.php:54
NewFilesPager\formatRow
formatRow( $row)
Returns an HTML string representing the result row $row.
Definition: NewFilesPager.php:200
ContextSource\getLanguage
getLanguage()
Definition: ContextSource.php:153
RC_LOG
const RC_LOG
Definition: Defines.php:117
NewFilesPager\__construct
__construct(IContextSource $context, FormOptions $opts, LinkRenderer $linkRenderer, GroupPermissionsLookup $groupPermissionsLookup, ILoadBalancer $loadBalancer, LinkBatchFactory $linkBatchFactory)
Definition: NewFilesPager.php:56
IndexPager\setLimit
setLimit( $limit)
Set the limit from an other source than the request.
Definition: IndexPager.php:325
RangeChronologicalPager\getDateRangeCond
getDateRangeCond( $startStamp, $endStamp)
Set and return a date range condition using timestamps provided by the user.
Definition: RangeChronologicalPager.php:46
MediaWiki\Cache\LinkBatchFactory
Definition: LinkBatchFactory.php:39
NewFilesPager\getStartBody
getStartBody()
Hook into getBody(), allows text to be inserted at the start.
Definition: NewFilesPager.php:170
Title\makeTitle
static makeTitle( $ns, $title, $fragment='', $interwiki='')
Create a new Title from a namespace index and a DB key.
Definition: Title.php:680
DB_REPLICA
const DB_REPLICA
Definition: defines.php:25
RangeChronologicalPager
Pager for filtering by a range of dates.
Definition: RangeChronologicalPager.php:28
NewFilesPager\doBatchLookups
doBatchLookups()
Called from getBody(), before getStartBody() is called and after doQuery() was called.
Definition: NewFilesPager.php:189
NewFilesPager\$opts
FormOptions $opts
Definition: NewFilesPager.php:40
IndexPager\getLinkRenderer
getLinkRenderer()
Definition: IndexPager.php:980
NS_USER
const NS_USER
Definition: Defines.php:66
NewFilesPager\$linkBatchFactory
LinkBatchFactory $linkBatchFactory
Definition: NewFilesPager.php:46
IContextSource
Interface for objects which can provide a MediaWiki context on request.
Definition: IContextSource.php:58
NewFilesPager\getQueryInfo
getQueryInfo()
Provides all parameters needed for the main paged query.
Definition: NewFilesPager.php:85
Title
Represents a title within MediaWiki.
Definition: Title.php:49
RecentChange\PRC_UNPATROLLED
const PRC_UNPATROLLED
Definition: RecentChange.php:91
NewFilesPager\getEndBody
getEndBody()
Hook into getBody() for the end of the list.
Definition: NewFilesPager.php:185
NewFilesPager\getIndexField
getIndexField()
Returns the name of the index field.
Definition: NewFilesPager.php:166
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
NS_FILE
const NS_FILE
Definition: Defines.php:70
ExternalUserNames\isExternal
static isExternal( $username)
Tells whether the username is external or not.
Definition: ExternalUserNames.php:149
NewFilesPager
Definition: NewFilesPager.php:30
Wikimedia\Rdbms\ILoadBalancer
Database cluster connection, tracking, load balancing, and transaction manager interface.
Definition: ILoadBalancer.php:81
TitleValue
Represents a page (or page fragment) title within MediaWiki.
Definition: TitleValue.php:40