MediaWiki REL1_37
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 // Twist: This would cause issues if the user is set and we need to check user existence first
154 if ( $user === '' ) {
155 $options[] = 'STRAIGHT_JOIN';
156 }
157
158 $query = [
159 'tables' => $tables,
160 'fields' => $fields,
161 'join_conds' => $jconds,
162 'conds' => $conds,
163 'options' => $options,
164 ];
165
166 return $query;
167 }
168
169 public function getIndexField() {
170 return 'img_timestamp';
171 }
172
173 protected function getStartBody() {
174 if ( !$this->gallery ) {
175 // Note that null for mode is taken to mean use default.
176 $mode = $this->getRequest()->getVal( 'gallerymode', null );
177 try {
178 $this->gallery = ImageGalleryBase::factory( $mode, $this->getContext() );
179 } catch ( Exception $e ) {
180 // User specified something invalid, fallback to default.
181 $this->gallery = ImageGalleryBase::factory( false, $this->getContext() );
182 }
183 }
184
185 return '';
186 }
187
188 protected function getEndBody() {
189 return $this->gallery->toHTML();
190 }
191
192 protected function doBatchLookups() {
193 $this->mResult->seek( 0 );
194 $lb = $this->linkBatchFactory->newLinkBatch();
195 foreach ( $this->mResult as $row ) {
196 if ( $row->actor_user ) {
197 $lb->add( NS_USER, $row->actor_name );
198 }
199 }
200 $lb->execute();
201 }
202
203 public function formatRow( $row ) {
204 $username = $row->actor_name;
205
206 if ( ExternalUserNames::isExternal( $username ) ) {
207 $ul = htmlspecialchars( $username );
208 } else {
209 $ul = $this->getLinkRenderer()->makeLink(
210 new TitleValue( NS_USER, $username ),
211 $username
212 );
213 }
214 $time = $this->getLanguage()->userTimeAndDate( $row->img_timestamp, $this->getUser() );
215
216 $this->gallery->add(
217 Title::makeTitle( NS_FILE, $row->img_name ),
218 "$ul<br />\n<i>"
219 . htmlspecialchars( $time )
220 . "</i><br />\n",
221 '',
222 '',
223 [],
224 ImageGalleryBase::LOADING_LAZY
225 );
226
227 return '';
228 }
229}
const NS_USER
Definition Defines.php:66
const NS_FILE
Definition Defines.php:70
const RC_LOG
Definition Defines.php:117
getContext()
IContextSource $context
Helper class to keep track of options when mixing links and form elements.
getValue( $name)
Get the value for the given option name.
getDatabase()
Get the Database object in use.
LinkRenderer $linkRenderer
setLimit( $limit)
Set the limit from an other source than the request.
Class that generates HTML links for pages.
getIndexField()
Returns the name of the index field.
getQueryInfo()
Provides all parameters needed for the main paged query.
getEndBody()
Hook into getBody() for the end of the list.
LinkBatchFactory $linkBatchFactory
GroupPermissionsLookup $groupPermissionsLookup
formatRow( $row)
Returns an HTML string representing the result row $row.
getStartBody()
Hook into getBody(), allows text to be inserted at the start.
__construct(IContextSource $context, FormOptions $opts, LinkRenderer $linkRenderer, GroupPermissionsLookup $groupPermissionsLookup, ILoadBalancer $loadBalancer, LinkBatchFactory $linkBatchFactory)
doBatchLookups()
Called from getBody(), before getStartBody() is called and after doQuery() was called.
FormOptions $opts
ImageGalleryBase $gallery
Pager for filtering by a range of dates.
getDateRangeCond( $startStamp, $endStamp)
Set and return a date range condition using timestamps provided by the user.
Represents a page (or page fragment) title within MediaWiki.
Represents a title within MediaWiki.
Definition Title.php:48
Interface for objects which can provide a MediaWiki context on request.
Database cluster connection, tracking, load balancing, and transaction manager interface.
getConnectionRef( $i, $groups=[], $domain=false, $flags=0)
Get a live database handle reference for a server index.