54 $including =
false, $showAll =
false
57 $this->mIncluding = $including;
58 $this->mShowAll = $showAll;
60 if ( $userName !==
null && $userName !==
'' ) {
62 if ( is_null( $nt ) ) {
65 $this->mUserName = $nt->getText();
76 if ( $search !==
'' && !$this->
getConfig()->
get(
'MiserMode' ) ) {
77 $this->mSearch = $search;
82 $this->mQueryConds[] =
'LOWER(img_name)' .
84 strtolower( $nt->getDBkey() ),
$dbr->anyString() );
89 if ( $this->
getRequest()->getText(
'sort',
'img_date' ) ==
'img_date' ) {
117 "<div class=\"mw-userpage-userdoesnotexist error\">\n$1\n</div>",
119 'listfiles-userdoesnotexist',
133 $prefix = $table ===
'image' ?
'img' :
'oi';
136 if ( !is_null( $this->mUserName ) ) {
146 $conds[] = $actorWhere[
'conds'];
149 if ( $this->mSearch !==
'' ) {
153 $conds[] =
'LOWER(' . $prefix .
'_name)' .
155 strtolower( $nt->getDBkey() ),
$dbr->anyString() );
159 if ( $table ===
'oldimage' ) {
163 $conds[
'oi_deleted'] = 0;
177 if ( !$this->mFieldNames ) {
178 $this->mFieldNames = [
179 'img_timestamp' => $this->
msg(
'listfiles_date' )->text(),
180 'img_name' => $this->
msg(
'listfiles_name' )->text(),
181 'thumb' => $this->
msg(
'listfiles_thumb' )->text(),
182 'img_size' => $this->
msg(
'listfiles_size' )->text(),
184 if ( is_null( $this->mUserName ) ) {
186 $this->mFieldNames[
'img_user_text'] = $this->
msg(
'listfiles_user' )->text();
189 $this->mFieldNames[
'img_description'] = $this->
msg(
'listfiles_description' )->text();
191 if ( !$this->
getConfig()->
get(
'MiserMode' ) && !$this->mShowAll ) {
192 $this->mFieldNames[
'count'] = $this->
msg(
'listfiles_count' )->text();
194 if ( $this->mShowAll ) {
195 $this->mFieldNames[
'top'] = $this->
msg(
'listfiles-latestversion' )->text();
203 if ( $this->mIncluding ) {
206 $sortable = [
'img_timestamp',
'img_name',
'img_size' ];
215 if ( $this->
getConfig()->
get(
'MiserMode' ) && !is_null( $this->mUserName ) ) {
217 if ( $field ===
'img_timestamp' ) {
222 } elseif ( $this->
getConfig()->
get(
'MiserMode' )
226 if ( $field ===
'img_name' ) {
233 return in_array( $field, $sortable );
257 $prefix = $table ===
'oldimage' ?
'oi' :
'img';
261 $fields = array_combine( $fields, $fields );
262 unset( $fields[
'img_description'] );
263 unset( $fields[
'img_user_text'] );
265 if ( $table ===
'oldimage' ) {
266 foreach ( $fields
as $id => $field ) {
267 if ( substr( $id, 0, 4 ) ===
'img_' ) {
268 $fields[$id] = $prefix . substr( $field, 3 );
271 $fields[
'top'] =
$dbr->addQuotes(
'no' );
272 } elseif ( $this->mShowAll ) {
273 $fields[
'top'] =
$dbr->addQuotes(
'yes' );
275 $fields[
'thumb'] = $prefix .
'_name';
281 $tables += $commentQuery[
'tables'];
282 $fields += $commentQuery[
'fields'];
283 $join_conds += $commentQuery[
'joins'];
284 $fields[
'description_field'] =
$dbr->addQuotes(
"{$prefix}_description" );
288 $tables += $actorQuery[
'tables'];
289 $join_conds += $actorQuery[
'joins'];
290 $fields[
'img_user'] = $actorQuery[
'fields'][$prefix .
'_user'];
291 $fields[
'img_user_text'] = $actorQuery[
'fields'][$prefix .
'_user_text'];
292 $fields[
'img_actor'] = $actorQuery[
'fields'][$prefix .
'_actor'];
294 # Depends on $wgMiserMode
295 # Will also not happen if mShowAll is true.
296 if ( isset( $fields[
'count'] ) ) {
297 $fields[
'count'] =
$dbr->buildSelectSubquery(
299 'COUNT(oi_archive_name)',
300 'oi_name = img_name',
310 'join_conds' => $join_conds
328 $this->mTableName =
'image';
332 $this->mTableName = $prevTableName;
334 if ( !$this->mShowAll ) {
338 $this->mTableName =
'oldimage';
342 if ( substr( $this->mIndexField, 0, 4 ) !==
'img_' ) {
343 throw new MWException(
"Expected to be sorting on an image table field" );
345 $this->mIndexField =
'oi_' . substr( $this->mIndexField, 4 );
351 $this->mTableName = $prevTableName;
352 $this->mIndexField = $oldIndex;
354 return $this->
combineResult( $imageRes, $oldimageRes, $limit, $order );
371 $topRes1 = $res1->next();
372 $topRes2 = $res2->next();
374 for ( $i = 0; $i < $limit && $topRes1 && $topRes2; $i++ ) {
375 if ( strcmp( $topRes1->{$this->mIndexField}, $topRes2->{$this->mIndexField} ) > 0 ) {
377 $resultArray[] = $topRes1;
378 $topRes1 = $res1->next();
380 $resultArray[] = $topRes2;
381 $topRes2 = $res2->next();
383 } elseif ( !$ascending ) {
384 $resultArray[] = $topRes2;
385 $topRes2 = $res2->next();
387 $resultArray[] = $topRes1;
388 $topRes1 = $res1->next();
392 for ( ; $i < $limit && $topRes1; $i++ ) {
393 $resultArray[] = $topRes1;
394 $topRes1 = $res1->next();
397 for ( ; $i < $limit && $topRes2; $i++ ) {
398 $resultArray[] = $topRes2;
399 $topRes2 = $res2->next();
406 if ( $this->mShowAll && $this->getConfig()->
get(
'MiserMode' ) && is_null( $this->mUserName ) ) {
410 return 'img_timestamp';
416 $this->mResult->seek( 0 );
417 foreach ( $this->mResult
as $row ) {
418 $userIds[] = $row->img_user;
420 # Do a link batch query for names and userpages
439 $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
442 $opt = [
'time' =>
wfTimestamp( TS_MW, $this->mCurrentRow->img_timestamp ) ];
446 $thumb =
$file->transform( [
'width' => 180,
'height' => 360 ] );
448 return $thumb->toHtml( [
'desc-link' =>
true ] );
450 return $this->msg(
'thumbnail_error',
'' )->escaped();
453 return htmlspecialchars(
$value );
455 case 'img_timestamp':
457 return htmlspecialchars( $this->getLanguage()->userTimeAndDate(
$value, $this->getUser() ) );
459 static $imgfile =
null;
460 if ( $imgfile ===
null ) {
461 $imgfile = $this->msg(
'imgfile' )->text();
475 $download = $this->msg(
'parentheses' )->rawParams( $download )->escaped();
479 if ( $filePage->userCan(
'delete', $this->getUser() ) ) {
480 $deleteMsg = $this->msg(
'listfiles-delete' )->text();
483 $filePage, $deleteMsg, [], [
'action' =>
'delete' ]
485 $delete = $this->msg(
'parentheses' )->rawParams( $delete )->escaped();
487 return "$link $download $delete";
490 return "$link $download";
492 return htmlspecialchars(
$value );
494 case 'img_user_text':
495 if ( $this->mCurrentRow->img_user ) {
507 return htmlspecialchars( $this->getLanguage()->formatSize(
$value ) );
508 case 'img_description':
509 $field = $this->mCurrentRow->description_field;
513 return $this->getLanguage()->formatNum( intval(
$value ) + 1 );
516 return $this->msg(
'listfiles-latestversion-' .
$value );
527 'label-message' =>
'table_pager_limit_label',
528 'options' => $this->getLimitSelectList(),
529 'default' => $this->mLimit,
532 if ( !$this->getConfig()->
get(
'MiserMode' ) ) {
535 'name' =>
'ilsearch',
536 'id' =>
'mw-ilsearch',
537 'label-message' =>
'listfiles_search_for',
538 'default' => $this->mSearch,
540 'maxlength' =>
'255',
547 'id' =>
'mw-listfiles-user',
548 'label-message' =>
'username',
549 'default' => $this->mUserName,
551 'maxlength' =>
'255',
556 'name' =>
'ilshowall',
557 'id' =>
'mw-listfiles-show-all',
558 'label-message' =>
'listfiles-show-all',
559 'default' => $this->mShowAll,
562 $query = $this->getRequest()->getQueryValues();
565 unset(
$query[
'ilsearch'] );
566 unset(
$query[
'ilshowall'] );
572 ->setId(
'mw-listfiles-form' )
573 ->setTitle( $this->getTitle() )
574 ->setSubmitTextMsg(
'table_pager_limit_submit' )
575 ->setWrapperLegendMsg(
'listfiles' )
576 ->addHiddenFields(
$query )
582 return parent::getTableClass() .
' listfiles';
586 return parent::getNavClass() .
' listfiles_nav';
590 return parent::getSortHeaderClass() .
' listfiles_sort';
594 $queries = parent::getPagingQueries();
595 if ( !is_null( $this->mUserName ) ) {
596 # Append the username to the query string
599 $query[
'user'] = $this->mUserName;
608 $queries = parent::getDefaultQuery();
609 if ( !isset(
$queries[
'user'] ) && !is_null( $this->mUserName ) ) {
610 $queries[
'user'] = $this->mUserName;