MediaWiki REL1_31
SpecialMIMEsearch.php
Go to the documentation of this file.
1<?php
31 protected $major, $minor, $mime;
32
33 function __construct( $name = 'MIMEsearch' ) {
34 parent::__construct( $name );
35 }
36
37 public function isExpensive() {
38 return false;
39 }
40
41 function isSyndicated() {
42 return false;
43 }
44
45 function isCacheable() {
46 return false;
47 }
48
49 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 function getOrderFields() {
109 return [];
110 }
111
115 function getPageHeader() {
116 $formDescriptor = [
117 'mime' => [
118 'type' => 'combobox',
119 'options' => $this->getSuggestionsForTypes(),
120 'name' => 'mime',
121 'label-message' => 'mimetype',
122 'required' => true,
123 'default' => $this->mime,
124 ],
125 ];
126
127 HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
128 ->setSubmitTextMsg( 'ilsubmit' )
129 ->setAction( $this->getPageTitle()->getLocalURL() )
130 ->setMethod( 'get' )
131 ->prepareForm()
132 ->displayForm( false );
133 }
134
135 protected function getSuggestionsForTypes() {
137 $lastMajor = null;
138 $suggestions = [];
139 $result = $dbr->select(
140 [ 'image' ],
141 // We ignore img_media_type, but using it in the query is needed for MySQL to choose a
142 // sensible execution plan
143 [ 'img_media_type', 'img_major_mime', 'img_minor_mime' ],
144 [],
145 __METHOD__,
146 [ 'GROUP BY' => [ 'img_media_type', 'img_major_mime', 'img_minor_mime' ] ]
147 );
148 foreach ( $result as $row ) {
149 $major = $row->img_major_mime;
150 $minor = $row->img_minor_mime;
151 $suggestions[ "$major/$minor" ] = "$major/$minor";
152 if ( $lastMajor === $major ) {
153 // If there are at least two with the same major mime type, also include the wildcard
154 $suggestions[ "$major/*" ] = "$major/*";
155 }
156 $lastMajor = $major;
157 }
158 ksort( $suggestions );
159 return $suggestions;
160 }
161
162 public function execute( $par ) {
163 $this->mime = $par ? $par : $this->getRequest()->getText( 'mime' );
164 $this->mime = trim( $this->mime );
165 list( $this->major, $this->minor ) = File::splitMime( $this->mime );
166
167 if ( $this->major == '' || $this->minor == '' || $this->minor == 'unknown' ||
168 !self::isValidType( $this->major )
169 ) {
170 $this->setHeaders();
171 $this->outputHeader();
172 $this->getPageHeader();
173 return;
174 }
175
176 parent::execute( $par );
177 }
178
184 function formatResult( $skin, $result ) {
185 global $wgContLang;
186
188 $nt = Title::makeTitle( $result->namespace, $result->title );
189 $text = $wgContLang->convert( $nt->getText() );
190 $plink = $linkRenderer->makeLink(
191 Title::newFromText( $nt->getPrefixedText() ),
192 $text
193 );
194
195 $download = Linker::makeMediaLinkObj( $nt, $this->msg( 'download' )->escaped() );
196 $download = $this->msg( 'parentheses' )->rawParams( $download )->escaped();
197 $lang = $this->getLanguage();
198 $bytes = htmlspecialchars( $lang->formatSize( $result->img_size ) );
199 $dimensions = $this->msg( 'widthheight' )->numParams( $result->img_width,
200 $result->img_height )->escaped();
201 $user = $linkRenderer->makeLink(
202 Title::makeTitle( NS_USER, $result->img_user_text ),
203 $result->img_user_text
204 );
205
206 $time = $lang->userTimeAndDate( $result->img_timestamp, $this->getUser() );
207 $time = htmlspecialchars( $time );
208
209 return "$download $plink . . $dimensions . . $bytes . . $user . . $time";
210 }
211
216 protected static function isValidType( $type ) {
217 // From maintenance/tables.sql => img_major_mime
218 $types = [
219 'unknown',
220 'application',
221 'audio',
222 'image',
223 'text',
224 'video',
225 'message',
226 'model',
227 'multipart',
228 'chemical'
229 ];
230
231 return in_array( $type, $types );
232 }
233
234 public function preprocessResults( $db, $res ) {
236 }
237
238 protected function getGroupName() {
239 return 'media';
240 }
241}
wfGetDB( $db, $groups=[], $wiki=false)
Get a Database object.
static splitMime( $mime)
Split an internet media type into its two components; if not a two-part name, set the minor type to '...
Definition File.php:273
static makeMediaLinkObj( $title, $html='', $time=false)
Create a direct link to a given uploaded file.
Definition Linker.php:766
static getQueryInfo(array $options=[])
Return the tables, fields, and join conditions to be selected to create a new localfile object.
Searches the database for files of the requested MIME type, comparing this with the 'img_major_mime' ...
getPageHeader()
Generate and output the form.
isExpensive()
Is this query expensive (for some definition of expensive)? Then we don't let it run in miser mode.
getOrderFields()
The index is on (img_media_type, img_major_mime, img_minor_mime) which unfortunately doesn't have img...
getGroupName()
Under which header this special page is listed in Special:SpecialPages See messages 'specialpages-gro...
formatResult( $skin, $result)
linkParameters()
If using extra form wheely-dealies, return a set of parameters here as an associative array.
preprocessResults( $db, $res)
Do any necessary preprocessing of the result object.
static isValidType( $type)
__construct( $name='MIMEsearch')
getQueryInfo()
Subclasses return an SQL query here, formatted as an array with the following keys: tables => Table(s...
isCacheable()
Is the output of this query cacheable? Non-cacheable expensive pages will be disabled in miser mode a...
execute( $par)
This is the actual workhorse.
isSyndicated()
Sometime we don't want to build rss / atom feeds.
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:34
executeLBFromResultWrapper(IResultWrapper $res, $ns=null)
Creates a new LinkBatch object, adds all pages from the passed ResultWrapper (MUST include title and ...
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!
getContext()
Gets the context this SpecialPage is executed in.
msg( $key)
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.
MediaWiki Linker LinkRenderer null $linkRenderer
$res
Definition database.txt:21
deferred txt A few of the database updates required by various functions here can be deferred until after the result page is displayed to the user For updating the view updating the linked to tables after a etc PHP does not yet have any way to tell the server to actually return and disconnect while still running these but it might have such a feature in the future We handle these by creating a deferred update object and putting those objects on a global list
Definition deferred.txt:11
this class mediates it Skin Encapsulates a look and feel for the wiki All of the functions that render HTML and make choices about how to render it are here and are called from various other places when and is meant to be subclassed with other skins that may override some of its functions The User object contains a reference to a and so rather than having a global skin object we just rely on the global User and get the skin with $wgUser and also has some character encoding functions and other locale stuff The current user interface language is instantiated as and the local content language as $wgContLang
Definition design.txt:57
see documentation in includes Linker php for Linker::makeImageLink & $time
Definition hooks.txt:1795
const NS_FILE
Definition Defines.php:80
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