MediaWiki  master
ApiFeedRecentChanges.php
Go to the documentation of this file.
1 <?php
28 
29  private $params;
30 
36  public function getCustomPrinter() {
37  return new ApiFormatFeedWrapper( $this->getMain() );
38  }
39 
44  public function execute() {
45  $config = $this->getConfig();
46 
47  $this->params = $this->extractRequestParams();
48 
49  if ( !$config->get( 'Feed' ) ) {
50  $this->dieWithError( 'feed-unavailable' );
51  }
52 
53  $feedClasses = $config->get( 'FeedClasses' );
54  if ( !isset( $feedClasses[$this->params['feedformat']] ) ) {
55  $this->dieWithError( 'feed-invalid' );
56  }
57 
58  $this->getMain()->setCacheMode( 'public' );
59  if ( !$this->getMain()->getParameter( 'smaxage' ) ) {
60  // T65249: This page gets hit a lot, cache at least 15 seconds.
61  $this->getMain()->setCacheMaxAge( 15 );
62  }
63 
64  $feedFormat = $this->params['feedformat'];
65  $specialClass = $this->params['target'] !== null
66  ? SpecialRecentChangesLinked::class
67  : SpecialRecentChanges::class;
68 
69  $formatter = $this->getFeedObject( $feedFormat, $specialClass );
70 
71  // Parameters are passed via the request in the context… :(
72  $context = new DerivativeContext( $this );
73  $context->setRequest( new DerivativeRequest(
74  $this->getRequest(),
75  $this->params,
76  $this->getRequest()->wasPosted()
77  ) );
78 
79  // The row-getting functionality should be factored out of ChangesListSpecialPage too…
80  $rc = new $specialClass();
81  $rc->setContext( $context );
82  $rows = $rc->getRows();
83 
84  $feedItems = $rows ? ChangesFeed::buildItems( $rows ) : [];
85 
86  ApiFormatFeedWrapper::setResult( $this->getResult(), $formatter, $feedItems );
87  }
88 
97  public function getFeedObject( $feedFormat, $specialClass ) {
98  if ( $specialClass === SpecialRecentChangesLinked::class ) {
99  $title = Title::newFromText( $this->params['target'] );
100  if ( !$title ) {
101  $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $this->params['target'] ) ] );
102  }
103 
104  $feed = new ChangesFeed( $feedFormat );
105  $feedObj = $feed->getFeedObject(
106  $this->msg( 'recentchangeslinked-title', $title->getPrefixedText() )
107  ->inContentLanguage()->text(),
108  $this->msg( 'recentchangeslinked-feed' )->inContentLanguage()->text(),
109  SpecialPage::getTitleFor( 'Recentchangeslinked' )->getFullURL()
110  );
111  } else {
112  $feed = new ChangesFeed( $feedFormat );
113  $feedObj = $feed->getFeedObject(
114  $this->msg( 'recentchanges' )->inContentLanguage()->text(),
115  $this->msg( 'recentchanges-feed-description' )->inContentLanguage()->text(),
116  SpecialPage::getTitleFor( 'Recentchanges' )->getFullURL()
117  );
118  }
119 
120  return $feedObj;
121  }
122 
123  public function getAllowedParams() {
124  $config = $this->getConfig();
125  $feedFormatNames = array_keys( $config->get( 'FeedClasses' ) );
126 
127  $ret = [
128  'feedformat' => [
129  ApiBase::PARAM_DFLT => 'rss',
130  ApiBase::PARAM_TYPE => $feedFormatNames,
131  ],
132 
133  'namespace' => [
134  ApiBase::PARAM_TYPE => 'namespace',
135  ],
136  'invert' => false,
137  'associated' => false,
138 
139  'days' => [
140  ApiBase::PARAM_DFLT => 7,
141  ApiBase::PARAM_MIN => 1,
142  ApiBase::PARAM_TYPE => 'integer',
143  ],
144  'limit' => [
145  ApiBase::PARAM_DFLT => 50,
146  ApiBase::PARAM_MIN => 1,
147  ApiBase::PARAM_MAX => $config->get( 'FeedLimit' ),
148  ApiBase::PARAM_TYPE => 'integer',
149  ],
150  'from' => [
151  ApiBase::PARAM_TYPE => 'timestamp',
152  ],
153 
154  'hideminor' => false,
155  'hidebots' => false,
156  'hideanons' => false,
157  'hideliu' => false,
158  'hidepatrolled' => false,
159  'hidemyself' => false,
160  'hidecategorization' => false,
161 
162  'tagfilter' => [
163  ApiBase::PARAM_TYPE => 'string',
164  ],
165 
166  'target' => [
167  ApiBase::PARAM_TYPE => 'string',
168  ],
169  'showlinkedto' => false,
170  ];
171 
172  return $ret;
173  }
174 
175  protected function getExamplesMessages() {
176  return [
177  'action=feedrecentchanges'
178  => 'apihelp-feedrecentchanges-example-simple',
179  'action=feedrecentchanges&days=30'
180  => 'apihelp-feedrecentchanges-example-30days',
181  ];
182  }
183 }
const PARAM_TYPE
(string|string[]) Either an array of allowed value strings, or a string type as described below...
Definition: ApiBase.php:94
wfEscapeWikiText( $text)
Escapes the given text so that it may be output using addWikiText() without any linking, formatting, etc.
getResult()
Get the result object.
Definition: ApiBase.php:640
static setResult( $result, $feed, $feedItems)
Call this method to initialize output data.
const PARAM_DFLT
(null|boolean|integer|string) Default value of the parameter.
Definition: ApiBase.php:55
getMain()
Get the main module.
Definition: ApiBase.php:536
const PARAM_MAX
(integer) Max value allowed for the parameter, for PARAM_TYPE &#39;integer&#39; and &#39;limit&#39;.
Definition: ApiBase.php:97
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...
dieWithError( $msg, $code=null, $data=null, $httpCode=null)
Abort execution with an error.
Definition: ApiBase.php:2006
extractRequestParams( $options=[])
Using getAllowedParams(), this function makes an array of the values provided by the user...
Definition: ApiBase.php:761
Feed to Special:RecentChanges and Special:RecentChangesLinked.
Definition: ChangesFeed.php:31
IContextSource $context
getParameter( $paramName, $parseLimit=true)
Get a value for the given parameter.
Definition: ApiBase.php:876
Recent changes feed.
execute()
Format the rows (generated by SpecialRecentchanges or SpecialRecentchangeslinked) as an RSS/Atom feed...
getCustomPrinter()
This module uses a custom feed wrapper printer.
static getTitleFor( $name, $subpage=false, $fragment='')
Get a localised Title object for a specified special page name If you don&#39;t need a full Title object...
Definition: SpecialPage.php:83
msg( $key,... $params)
Get a Message object with context set Parameters are the same as wfMessage()
This abstract class implements many basic API functions, and is the base of all API classes...
Definition: ApiBase.php:42
const PARAM_MIN
(integer) Lowest value allowed for the parameter, for PARAM_TYPE &#39;integer&#39; and &#39;limit&#39;.
Definition: ApiBase.php:106
static buildItems( $rows)
Generate the feed items given a row from the database.
Definition: ChangesFeed.php:71
This printer is used to wrap an instance of the Feed class.
getFeedObject( $feedFormat, $specialClass)
Return a ChannelFeed object.
static newFromText( $text, $defaultNamespace=NS_MAIN)
Create a new Title from text, such as what one would find in a link.
Definition: Title.php:317