MediaWiki REL1_35
SpecialMIMESearch.php
Go to the documentation of this file.
1<?php
31 protected $major, $minor, $mime;
32
33 public function __construct( $name = 'MIMEsearch' ) {
34 parent::__construct( $name );
35 }
36
37 public function isExpensive() {
38 return false;
39 }
40
41 public function isSyndicated() {
42 return false;
43 }
44
45 public function isCacheable() {
46 return false;
47 }
48
49 protected function linkParameters() {
50 return [ 'mime' => "{$this->major}/{$this->minor}" ];
51 }
52
53 public function getQueryInfo() {
54 $minorType = [];
55 if ( $this->minor !== '*' ) {
56 // Allow wildcard searching
57 $minorType['img_minor_mime'] = $this->minor;
58 }
59 $imgQuery = LocalFile::getQueryInfo();
60 $qi = [
61 'tables' => $imgQuery['tables'],
62 'fields' => [
63 'namespace' => NS_FILE,
64 'title' => 'img_name',
65 // Still have a value field just in case,
66 // but it isn't actually used for sorting.
67 'value' => 'img_name',
68 'img_size',
69 'img_width',
70 'img_height',
71 'img_user_text' => $imgQuery['fields']['img_user_text'],
72 'img_timestamp'
73 ],
74 'conds' => [
75 'img_major_mime' => $this->major,
76 // This is in order to trigger using
77 // the img_media_mime index in "range" mode.
78 // @todo how is order defined? use MimeAnalyzer::getMediaTypes?
79 'img_media_type' => [
91 ],
92 ] + $minorType,
93 'join_conds' => $imgQuery['joins'],
94 ];
95
96 return $qi;
97 }
98
108 protected function getOrderFields() {
109 return [];
110 }
111
116 protected function getPageHeader() {
117 $formDescriptor = [
118 'mime' => [
119 'type' => 'combobox',
120 'options' => $this->getSuggestionsForTypes(),
121 'name' => 'mime',
122 'label-message' => 'mimetype',
123 'required' => true,
124 'default' => $this->mime,
125 ],
126 ];
127
128 HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
129 ->setSubmitTextMsg( 'ilsubmit' )
130 ->setAction( $this->getPageTitle()->getLocalURL() )
131 ->setMethod( 'get' )
132 ->prepareForm()
133 ->displayForm( false );
134 return '';
135 }
136
137 protected function getSuggestionsForTypes() {
139 $lastMajor = null;
140 $suggestions = [];
141 $result = $dbr->select(
142 [ 'image' ],
143 // We ignore img_media_type, but using it in the query is needed for MySQL to choose a
144 // sensible execution plan
145 [ 'img_media_type', 'img_major_mime', 'img_minor_mime' ],
146 [],
147 __METHOD__,
148 [ 'GROUP BY' => [ 'img_media_type', 'img_major_mime', 'img_minor_mime' ] ]
149 );
150 foreach ( $result as $row ) {
151 $major = $row->img_major_mime;
152 $minor = $row->img_minor_mime;
153 $suggestions[ "$major/$minor" ] = "$major/$minor";
154 if ( $lastMajor === $major ) {
155 // If there are at least two with the same major mime type, also include the wildcard
156 $suggestions[ "$major/*" ] = "$major/*";
157 }
158 $lastMajor = $major;
159 }
160 ksort( $suggestions );
161 return $suggestions;
162 }
163
164 public function execute( $par ) {
165 $this->addHelpLink( 'Help:Managing_files' );
166 $this->mime = $par ?: $this->getRequest()->getText( 'mime' );
167 $this->mime = trim( $this->mime );
168 list( $this->major, $this->minor ) = File::splitMime( $this->mime );
169
170 if ( $this->major == '' || $this->minor == '' || $this->minor == 'unknown' ||
171 !self::isValidType( $this->major )
172 ) {
173 $this->setHeaders();
174 $this->outputHeader();
175 $this->getPageHeader();
176 return;
177 }
178
179 parent::execute( $par );
180 }
181
187 public function formatResult( $skin, $result ) {
189 $nt = Title::makeTitle( $result->namespace, $result->title );
190
191 $text = $this->getLanguageConverter()->convertHtml( $nt->getText() );
192 $plink = $linkRenderer->makeLink(
193 Title::newFromText( $nt->getPrefixedText() ),
194 new HtmlArmor( $text )
195 );
196
197 $download = Linker::makeMediaLinkObj( $nt, $this->msg( 'download' )->escaped() );
198 $download = $this->msg( 'parentheses' )->rawParams( $download )->escaped();
199 $lang = $this->getLanguage();
200 $bytes = htmlspecialchars( $lang->formatSize( $result->img_size ) );
201 $dimensions = $this->msg( 'widthheight' )->numParams( $result->img_width,
202 $result->img_height )->escaped();
203 $user = $linkRenderer->makeLink(
204 Title::makeTitle( NS_USER, $result->img_user_text ),
205 $result->img_user_text
206 );
207
208 $time = $lang->userTimeAndDate( $result->img_timestamp, $this->getUser() );
209 $time = htmlspecialchars( $time );
210
211 return "$download $plink . . $dimensions . . $bytes . . $user . . $time";
212 }
213
218 protected static function isValidType( $type ) {
219 // From maintenance/tables.sql => img_major_mime
220 $types = [
221 'unknown',
222 'application',
223 'audio',
224 'image',
225 'text',
226 'video',
227 'message',
228 'model',
229 'multipart',
230 'chemical'
231 ];
232
233 return in_array( $type, $types );
234 }
235
236 public function preprocessResults( $db, $res ) {
238 }
239
240 protected function getGroupName() {
241 return 'media';
242 }
243}
wfGetDB( $db, $groups=[], $wiki=false)
Get a Database object.
Marks HTML that shouldn't be escaped.
Definition HtmlArmor.php:30
static makeMediaLinkObj( $title, $html='', $time=false)
Create a direct link to a given uploaded file.
Definition Linker.php:769
This is a class for doing query pages; since they're almost all the same, we factor out some of the f...
Definition QueryPage.php:39
executeLBFromResultWrapper(IResultWrapper $res, $ns=null)
Creates a new LinkBatch object, adds all pages from the passed result wrapper (MUST include title and...
Searches the database for files of the requested MIME type, comparing this with the 'img_major_mime' ...
isCacheable()
Is the output of this query cacheable? Non-cacheable expensive pages will be disabled in miser mode a...
formatResult( $skin, $result)
isSyndicated()
Sometime we don't want to build rss / atom feeds.
preprocessResults( $db, $res)
Do any necessary preprocessing of the result object.
getPageHeader()
Generate and output the form.
linkParameters()
If using extra form wheely-dealies, return a set of parameters here as an associative array.
getQueryInfo()
Subclasses return an SQL query here, formatted as an array with the following keys: tables => Table(s...
isExpensive()
Is this query expensive (for some definition of expensive)? Then we don't let it run in miser mode.
static isValidType( $type)
__construct( $name='MIMEsearch')
getGroupName()
Under which header this special page is listed in Special:SpecialPages See messages 'specialpages-gro...
execute( $par)
This is the actual workhorse.
getOrderFields()
The index is on (img_media_type, img_major_mime, img_minor_mime) which unfortunately doesn't have img...
outputHeader( $summaryMessageKey='')
Outputs a summary message on top of special pages Per default the message key is the canonical name o...
setHeaders()
Sets headers - this should be called from the execute() method of all derived classes!...
getLanguageConverter()
Shortcut to get language's converter.
getContext()
Gets the context this SpecialPage is executed in.
msg( $key,... $params)
Wrapper around wfMessage that sets the current context.
getRequest()
Get the WebRequest being used for this instance.
getPageTitle( $subpage=false)
Get a self-referential title object.
getLanguage()
Shortcut to get user's language.
addHelpLink( $to, $overrideBaseUrl=false)
Adds help link with an icon via page indicators.
MediaWiki Linker LinkRenderer null $linkRenderer
const NS_USER
Definition Defines.php:72
const NS_FILE
Definition Defines.php:76
const MEDIATYPE_DRAWING
Definition defines.php:30
const MEDIATYPE_VIDEO
Definition defines.php:35
const MEDIATYPE_OFFICE
Definition defines.php:39
const MEDIATYPE_UNKNOWN
Definition defines.php:26
const MEDIATYPE_AUDIO
Definition defines.php:32
const MEDIATYPE_TEXT
Definition defines.php:41
const MEDIATYPE_BITMAP
Definition defines.php:28
const MEDIATYPE_MULTIMEDIA
Definition defines.php:37
const MEDIATYPE_EXECUTABLE
Definition defines.php:43
const MEDIATYPE_3D
Definition defines.php:47
const MEDIATYPE_ARCHIVE
Definition defines.php:45
const DB_REPLICA
Definition defines.php:25
if(!isset( $args[0])) $lang