MediaWiki REL1_31
AbstractContent.php
Go to the documentation of this file.
1<?php
34abstract class AbstractContent implements Content {
43 protected $model_id;
44
50 public function __construct( $modelId = null ) {
51 $this->model_id = $modelId;
52 }
53
60 public function getModel() {
61 return $this->model_id;
62 }
63
72 protected function checkModelID( $modelId ) {
73 if ( $modelId !== $this->model_id ) {
74 throw new MWException(
75 "Bad content model: " .
76 "expected {$this->model_id} " .
77 "but got $modelId."
78 );
79 }
80 }
81
88 public function getContentHandler() {
89 return ContentHandler::getForContent( $this );
90 }
91
98 public function getDefaultFormat() {
99 return $this->getContentHandler()->getDefaultFormat();
100 }
101
108 public function getSupportedFormats() {
109 return $this->getContentHandler()->getSupportedFormats();
110 }
111
121 public function isSupportedFormat( $format ) {
122 if ( !$format ) {
123 return true; // this means "use the default"
124 }
125
126 return $this->getContentHandler()->isSupportedFormat( $format );
127 }
128
136 protected function checkFormat( $format ) {
137 if ( !$this->isSupportedFormat( $format ) ) {
138 throw new MWException(
139 "Format $format is not supported for content model " .
140 $this->getModel()
141 );
142 }
143 }
144
154 public function serialize( $format = null ) {
155 return $this->getContentHandler()->serializeContent( $this, $format );
156 }
157
165 public function isEmpty() {
166 return $this->getSize() === 0;
167 }
168
178 public function isValid() {
179 return true;
180 }
181
191 public function equals( Content $that = null ) {
192 if ( is_null( $that ) ) {
193 return false;
194 }
195
196 if ( $that === $this ) {
197 return true;
198 }
199
200 if ( $that->getModel() !== $this->getModel() ) {
201 return false;
202 }
203
204 return $this->getNativeData() === $that->getNativeData();
205 }
206
230 public function getSecondaryDataUpdates( Title $title, Content $old = null,
231 $recursive = true, ParserOutput $parserOutput = null
232 ) {
233 if ( $parserOutput === null ) {
234 $parserOutput = $this->getParserOutput( $title, null, null, false );
235 }
236
237 $updates = [
238 new LinksUpdate( $title, $parserOutput, $recursive )
239 ];
240
241 Hooks::run( 'SecondaryDataUpdates', [ $title, $old, $recursive, $parserOutput, &$updates ] );
242
243 return $updates;
244 }
245
253 public function getRedirectChain() {
254 global $wgMaxRedirects;
255 $title = $this->getRedirectTarget();
256 if ( is_null( $title ) ) {
257 return null;
258 }
259 // recursive check to follow double redirects
260 $recurse = $wgMaxRedirects;
261 $titles = [ $title ];
262 while ( --$recurse > 0 ) {
263 if ( $title->isRedirect() ) {
264 $page = WikiPage::factory( $title );
265 $newtitle = $page->getRedirectTarget();
266 } else {
267 break;
268 }
269 // Redirects to some special pages are not permitted
270 if ( $newtitle instanceof Title && $newtitle->isValidRedirectTarget() ) {
271 // The new title passes the checks, so make that our current
272 // title so that further recursion can be checked
273 $title = $newtitle;
274 $titles[] = $newtitle;
275 } else {
276 break;
277 }
278 }
279
280 return $titles;
281 }
282
292 public function getRedirectTarget() {
293 return null;
294 }
295
305 public function getUltimateRedirectTarget() {
306 $titles = $this->getRedirectChain();
307
308 return $titles ? array_pop( $titles ) : null;
309 }
310
318 public function isRedirect() {
319 return $this->getRedirectTarget() !== null;
320 }
321
334 public function updateRedirect( Title $target ) {
335 return $this;
336 }
337
346 public function getSection( $sectionId ) {
347 return null;
348 }
349
360 public function replaceSection( $sectionId, Content $with, $sectionTitle = '' ) {
361 return null;
362 }
363
374 public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
375 return $this;
376 }
377
386 public function addSectionHeader( $header ) {
387 return $this;
388 }
389
400 public function preloadTransform( Title $title, ParserOptions $popts, $params = [] ) {
401 return $this;
402 }
403
415 public function prepareSave( WikiPage $page, $flags, $parentRevId, User $user ) {
416 if ( $this->isValid() ) {
417 return Status::newGood();
418 } else {
419 return Status::newFatal( "invalid-content-data" );
420 }
421 }
422
433 public function getDeletionUpdates( WikiPage $page, ParserOutput $parserOutput = null ) {
434 return [
435 new LinksDeletionUpdate( $page ),
436 ];
437 }
438
451 public function matchMagicWord( MagicWord $word ) {
452 return false;
453 }
454
466 public function convert( $toModel, $lossy = '' ) {
467 if ( $this->getModel() === $toModel ) {
468 // nothing to do, shorten out.
469 return $this;
470 }
471
472 $lossy = ( $lossy === 'lossy' ); // string flag, convert to boolean for convenience
473 $result = false;
474
475 Hooks::run( 'ConvertContent', [ $this, $toModel, $lossy, &$result ] );
476
477 return $result;
478 }
479
500 public function getParserOutput( Title $title, $revId = null,
501 ParserOptions $options = null, $generateHtml = true
502 ) {
503 if ( $options === null ) {
504 $options = $this->getContentHandler()->makeParserOptions( 'canonical' );
505 }
506
507 $po = new ParserOutput();
508
509 if ( Hooks::run( 'ContentGetParserOutput',
510 [ $this, $title, $revId, $options, $generateHtml, &$po ] )
511 ) {
512 // Save and restore the old value, just in case something is reusing
513 // the ParserOptions object in some weird way.
514 $oldRedir = $options->getRedirectTarget();
515 $options->setRedirectTarget( $this->getRedirectTarget() );
516 $this->fillParserOutput( $title, $revId, $options, $generateHtml, $po );
517 $options->setRedirectTarget( $oldRedir );
518 }
519
520 Hooks::run( 'ContentAlterParserOutput', [ $this, $title, $po ] );
521
522 return $po;
523 }
524
545 protected function fillParserOutput( Title $title, $revId,
547 ) {
548 // Don't make abstract, so subclasses that override getParserOutput() directly don't fail.
549 throw new MWException( 'Subclasses of AbstractContent must override fillParserOutput!' );
550 }
551}
$wgMaxRedirects
Max number of redirects to follow when resolving redirects.
Base implementation for content objects.
checkModelID( $modelId)
getParserOutput(Title $title, $revId=null, ParserOptions $options=null, $generateHtml=true)
Returns a ParserOutput object containing information derived from this content.
equals(Content $that=null)
getSection( $sectionId)
__construct( $modelId=null)
preSaveTransform(Title $title, User $user, ParserOptions $popts)
convert( $toModel, $lossy='')
This base implementation calls the hook ConvertContent to enable custom conversions.
updateRedirect(Title $target)
This default implementation always returns $this.
isSupportedFormat( $format)
fillParserOutput(Title $title, $revId, ParserOptions $options, $generateHtml, ParserOutput &$output)
Fills the provided ParserOutput with information derived from the content.
prepareSave(WikiPage $page, $flags, $parentRevId, User $user)
isValid()
Subclasses may override this to implement (light weight) validation.
serialize( $format=null)
addSectionHeader( $header)
matchMagicWord(MagicWord $word)
This default implementation always returns false.
getDeletionUpdates(WikiPage $page, ParserOutput $parserOutput=null)
$model_id
Name of the content model this Content object represents.
getSecondaryDataUpdates(Title $title, Content $old=null, $recursive=true, ParserOutput $parserOutput=null)
Returns a list of DataUpdate objects for recording information about this Content in some secondary d...
preloadTransform(Title $title, ParserOptions $popts, $params=[])
replaceSection( $sectionId, Content $with, $sectionTitle='')
getRedirectTarget()
Subclasses that implement redirects should override this.
Update object handling the cleanup of links tables after a page was deleted.
Class the manages updates of *_link tables as well as similar extension-managed tables.
MediaWiki exception.
This class encapsulates "magic words" such as "#redirect", NOTOC, etc.
Definition MagicWord.php:59
Set options of the Parser.
Represents a title within MediaWiki.
Definition Title.php:39
isValidRedirectTarget()
Check if this Title is a valid redirect target.
Definition Title.php:4863
The User object encapsulates all of the user-specific settings (user_id, name, rights,...
Definition User.php:53
Class representing a MediaWiki article and history.
Definition WikiPage.php:37
namespace being checked & $result
Definition hooks.txt:2323
static configuration should be added through ResourceLoaderGetConfigVars instead can be used to get the real title after the basic globals have been set but before ordinary actions take place $output
Definition hooks.txt:2255
null means default in associative array with keys and values unescaped Should be merged with default with a value of false meaning to suppress the attribute in associative array with keys and values unescaped & $options
Definition hooks.txt:2001
namespace and then decline to actually register it file or subcat img or subcat $title
Definition hooks.txt:964
Base interface for content objects.
Definition Content.php:34
getNativeData()
Returns native representation of the data.
getSize()
Returns the content's nominal size in "bogo-bytes".
linkcache txt The LinkCache class maintains a list of article titles and the information about whether or not the article exists in the database This is used to mark up links when displaying a page If the same link appears more than once on any page then it only has to be looked up once In most cases link lookups are done in batches with the LinkBatch class or the equivalent in so the link cache is mostly useful for short snippets of parsed and for links in the navigation areas of the skin The link cache was formerly used to track links used in a document for the purposes of updating the link tables This application is now deprecated To create a you can use the following $titles
Definition linkcache.txt:17
$params
$header