MediaWiki REL1_35
SpecialNewFiles.php
Go to the documentation of this file.
1<?php
25
28 protected $opts;
29
31 protected $mediaTypes;
32
33 public function __construct() {
34 parent::__construct( 'Newimages' );
35 }
36
37 public function execute( $par ) {
38 $context = new DerivativeContext( $this->getContext() );
39
40 $this->setHeaders();
41 $this->outputHeader();
42 $mimeAnalyzer = MediaWiki\MediaWikiServices::getInstance()->getMimeAnalyzer();
43 $this->mediaTypes = $mimeAnalyzer->getMediaTypes();
44
45 $out = $this->getOutput();
46 $this->addHelpLink( 'Help:New images' );
47
48 $opts = new FormOptions();
49
50 $opts->add( 'like', '' );
51 $opts->add( 'user', '' );
52 $opts->add( 'showbots', false );
53 $opts->add( 'hidepatrolled', false );
54 $opts->add( 'mediatype', $this->mediaTypes );
55 $opts->add( 'limit', 50 );
56 $opts->add( 'offset', '' );
57 $opts->add( 'start', '' );
58 $opts->add( 'end', '' );
59
61
62 if ( $par !== null ) {
63 $opts->setValue( is_numeric( $par ) ? 'limit' : 'like', $par );
64 }
65
66 // If start date comes after end date chronologically, swap them.
67 // They are swapped in the interface by JS.
68 $start = $opts->getValue( 'start' );
69 $end = $opts->getValue( 'end' );
70 if ( $start !== '' && $end !== '' && $start > $end ) {
71 $temp = $end;
72 $end = $start;
73 $start = $temp;
74
75 $opts->setValue( 'start', $start, true );
76 $opts->setValue( 'end', $end, true );
77
78 // also swap values in request object, which is used by HTMLForm
79 // to pre-populate the fields with the previous input
80 $request = $context->getRequest();
81 $context->setRequest( new DerivativeRequest(
82 $request,
83 [ 'start' => $start, 'end' => $end ] + $request->getValues(),
84 $request->wasPosted()
85 ) );
86 }
87
88 // if all media types have been selected, wipe out the array to prevent
89 // the pointless IN(...) query condition (which would have no effect
90 // because every possible type has been selected)
91 $missingMediaTypes = array_diff( $this->mediaTypes, $opts->getValue( 'mediatype' ) );
92 if ( empty( $missingMediaTypes ) ) {
93 $opts->setValue( 'mediatype', [] );
94 }
95
96 $opts->validateIntBounds( 'limit', 0, 500 );
97
98 $this->opts = $opts;
99
100 if ( !$this->including() ) {
101 $this->setTopText();
102 $this->buildForm( $context );
103 }
104
105 $pager = new NewFilesPager( $context, $opts, $this->getLinkRenderer() );
106
107 $out->addHTML( $pager->getBody() );
108 if ( !$this->including() ) {
109 $out->addHTML( $pager->getNavigationBar() );
110 }
111 }
112
113 protected function buildForm( IContextSource $context ) {
114 $mediaTypesText = array_map( function ( $type ) {
115 // mediastatistics-header-unknown, mediastatistics-header-bitmap,
116 // mediastatistics-header-drawing, mediastatistics-header-audio,
117 // mediastatistics-header-video, mediastatistics-header-multimedia,
118 // mediastatistics-header-office, mediastatistics-header-text,
119 // mediastatistics-header-executable, mediastatistics-header-archive,
120 // mediastatistics-header-3d,
121 return $this->msg( 'mediastatistics-header-' . strtolower( $type ) )->escaped();
123 $mediaTypesOptions = array_combine( $mediaTypesText, $this->mediaTypes );
124 ksort( $mediaTypesOptions );
125
126 $formDescriptor = [
127 'like' => [
128 'type' => 'text',
129 'label-message' => 'newimages-label',
130 'name' => 'like',
131 ],
132
133 'user' => [
134 'class' => 'HTMLUserTextField',
135 'label-message' => 'newimages-user',
136 'name' => 'user',
137 ],
138
139 'showbots' => [
140 'type' => 'check',
141 'label-message' => 'newimages-showbots',
142 'name' => 'showbots',
143 ],
144
145 'hidepatrolled' => [
146 'type' => 'check',
147 'label-message' => 'newimages-hidepatrolled',
148 'name' => 'hidepatrolled',
149 ],
150
151 'mediatype' => [
152 'type' => 'multiselect',
153 'flatlist' => true,
154 'name' => 'mediatype',
155 'label-message' => 'newimages-mediatype',
156 'options' => $mediaTypesOptions,
157 'default' => $this->mediaTypes,
158 ],
159
160 'limit' => [
161 'type' => 'hidden',
162 'default' => $this->opts->getValue( 'limit' ),
163 'name' => 'limit',
164 ],
165
166 'offset' => [
167 'type' => 'hidden',
168 'default' => $this->opts->getValue( 'offset' ),
169 'name' => 'offset',
170 ],
171
172 'start' => [
173 'type' => 'date',
174 'label-message' => 'date-range-from',
175 'name' => 'start',
176 ],
177
178 'end' => [
179 'type' => 'date',
180 'label-message' => 'date-range-to',
181 'name' => 'end',
182 ],
183 ];
184
185 if ( $this->getConfig()->get( 'MiserMode' ) ) {
186 unset( $formDescriptor['like'] );
187 }
188
189 if ( !$this->getUser()->useFilePatrol() ) {
190 unset( $formDescriptor['hidepatrolled'] );
191 }
192
193 HTMLForm::factory( 'ooui', $formDescriptor, $context )
194 // For the 'multiselect' field values to be preserved on submit
195 ->setFormIdentifier( 'specialnewimages' )
196 ->setWrapperLegendMsg( 'newimages-legend' )
197 ->setSubmitTextMsg( 'ilsubmit' )
198 ->setMethod( 'get' )
199 ->prepareForm()
200 ->displayForm( false );
201 }
202
203 protected function getGroupName() {
204 return 'changes';
205 }
206
210 public function setTopText() {
211 $message = $this->msg( 'newimagestext' )->inContentLanguage();
212 if ( !$message->isDisabled() ) {
213 $contLang = MediaWikiServices::getInstance()->getContentLanguage();
214 $this->getOutput()->addWikiTextAsContent(
215 Html::rawElement( 'div',
216 [
217
218 'lang' => $contLang->getHtmlCode(),
219 'dir' => $contLang->getDir()
220 ],
221 "\n" . $message->plain() . "\n"
222 )
223 );
224 }
225 }
226}
An IContextSource implementation which will inherit context from another source but allow individual ...
Similar to FauxRequest, but only fakes URL parameters and method (POST or GET) and use the base reque...
Helper class to keep track of options when mixing links and form elements.
add( $name, $default, $type=self::AUTO)
Add an option to be handled by this FormOptions instance.
setValue( $name, $value, $force=false)
Use to set the value of an option.
fetchValuesFromRequest(WebRequest $r, $optionKeys=null)
Fetch values for all options (or selected options) from the given WebRequest, making them available f...
validateIntBounds( $name, $min, $max)
getValue( $name)
Get the value for the given option name.
Shortcut to construct an includable special page.
MediaWikiServices is the service locator for the application scope of MediaWiki.
buildForm(IContextSource $context)
execute( $par)
Default execute method Checks user permissions.
getGroupName()
Under which header this special page is listed in Special:SpecialPages See messages 'specialpages-gro...
setTopText()
Send the text to be displayed above the options.
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!...
getOutput()
Get the OutputPage being used for this instance.
getUser()
Shortcut to get the User executing this instance.
getContext()
Gets the context this SpecialPage is executed in.
msg( $key,... $params)
Wrapper around wfMessage that sets the current context.
getConfig()
Shortcut to get main config object.
getRequest()
Get the WebRequest being used for this instance.
addHelpLink( $to, $overrideBaseUrl=false)
Adds help link with an icon via page indicators.
including( $x=null)
Whether the special page is being evaluated via transclusion.
Interface for objects which can provide a MediaWiki context on request.