MediaWiki  master
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 ) )->text();
122  }, $this->mediaTypes );
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  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 }
Helper class to keep track of options when mixing links and form elements.
Definition: FormOptions.php:35
$context
Definition: load.php:45
getContext()
Gets the context this SpecialPage is executed in.
including( $x=null)
Whether the special page is being evaluated via transclusion.
static rawElement( $element, $attribs=[], $contents='')
Returns an HTML element in a string.
Definition: Html.php:209
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...
buildForm(IContextSource $context)
addHelpLink( $to, $overrideBaseUrl=false)
Adds help link with an icon via page indicators.
getOutput()
Get the OutputPage being used for this instance.
static getInstance()
Returns the global default instance of the top level service locator.
add( $name, $default, $type=self::AUTO)
Add an option to be handled by this FormOptions instance.
Definition: FormOptions.php:83
validateIntBounds( $name, $min, $max)
fetchValuesFromRequest(WebRequest $r, $optionKeys=null)
Fetch values for all options (or selected options) from the given WebRequest, making them available f...
msg( $key,... $params)
Wrapper around wfMessage that sets the current context.
static factory( $displayFormat,... $arguments)
Construct a HTMLForm object for given display type.
Definition: HTMLForm.php:307
Shortcut to construct an includable special page.
setTopText()
Send the text to be displayed above the options.
string [] $mediaTypes
setHeaders()
Sets headers - this should be called from the execute() method of all derived classes! ...
setValue( $name, $value, $force=false)
Use to set the value of an option.
FormOptions $opts
getUser()
Shortcut to get the User executing this instance.
getConfig()
Shortcut to get main config object.
getRequest()
Get the WebRequest being used for this instance.
outputHeader( $summaryMessageKey='')
Outputs a summary message on top of special pages Per default the message key is the canonical name o...
getValue( $name)
Get the value for the given option name.