MediaWiki master
ApiChangeContentModel.php
Go to the documentation of this file.
1<?php
2
3namespace MediaWiki\Api;
4
9
20
21 private IContentHandlerFactory $contentHandlerFactory;
22 private ContentModelChangeFactory $contentModelChangeFactory;
23
24 public function __construct(
25 ApiMain $main,
26 string $action,
27 IContentHandlerFactory $contentHandlerFactory,
28 ContentModelChangeFactory $contentModelChangeFactory
29 ) {
30 parent::__construct( $main, $action );
31 $this->contentHandlerFactory = $contentHandlerFactory;
32 $this->contentModelChangeFactory = $contentModelChangeFactory;
33 }
34
38 public function execute() {
39 $params = $this->extractRequestParams();
40 $wikiPage = $this->getTitleOrPageId( $params );
41 $title = $wikiPage->getTitle();
42 $this->getErrorFormatter()->setContextTitle( $title );
43
44 if ( !$title->exists() ) {
45 $this->dieWithError( 'apierror-changecontentmodel-missingtitle' );
46 }
47
48 $newModel = $params['model'];
49
50 $this->checkUserRightsAny( 'editcontentmodel' );
51 $changer = $this->contentModelChangeFactory->newContentModelChange(
52 $this->getAuthority(),
53 $wikiPage,
54 $newModel
55 );
56 // Status messages should be apierror-*
57 $changer->setMessagePrefix( 'apierror-' );
58 $permissionStatus = $changer->authorizeChange();
59 if ( !$permissionStatus->isGood() ) {
60 $this->dieStatus( $permissionStatus );
61 }
62
63 if ( $params['tags'] ) {
64 $tagStatus = $changer->setTags( $params['tags'] );
65 if ( !$tagStatus->isGood() ) {
66 $this->dieStatus( $tagStatus );
67 }
68 }
69
70 // Everything passed, make the conversion
71 $status = $changer->doContentModelChange(
72 $this->getContext(),
73 $params['summary'] ?? '',
74 $params['bot']
75 );
76
77 if ( !$status->isGood() ) {
78 // Failed
79 $this->dieStatus( $status );
80 }
81 $logid = $status->getValue()['logid'];
82
83 $result = [
84 'result' => 'Success',
85 'title' => $title->getPrefixedText(),
86 'pageid' => $title->getArticleID(),
87 'contentmodel' => $title->getContentModel( IDBAccessObject::READ_LATEST ),
88 'logid' => $logid,
89 'revid' => $title->getLatestRevID( IDBAccessObject::READ_LATEST ),
90 ];
91
92 $this->getResult()->addValue( null, $this->getModuleName(), $result );
93 }
94
96 public function getAllowedParams() {
97 $models = $this->contentHandlerFactory->getContentModels();
98 $modelOptions = [];
99 foreach ( $models as $model ) {
100 $handler = $this->contentHandlerFactory->getContentHandler( $model );
101 if ( !$handler->supportsDirectEditing() ) {
102 continue;
103 }
104 $modelOptions[] = $model;
105 }
106
107 return [
108 'title' => [
109 ParamValidator::PARAM_TYPE => 'string',
110 ],
111 'pageid' => [
112 ParamValidator::PARAM_TYPE => 'integer',
113 ],
114 'summary' => [
115 ParamValidator::PARAM_TYPE => 'string',
116 ],
117 'tags' => [
118 ParamValidator::PARAM_TYPE => 'tags',
119 ParamValidator::PARAM_ISMULTI => true,
120 ],
121 'model' => [
122 ParamValidator::PARAM_TYPE => $modelOptions,
123 ParamValidator::PARAM_REQUIRED => true,
124 ],
125 'bot' => false,
126 ];
127 }
128
130 public function mustBePosted() {
131 return true;
132 }
133
135 public function isWriteMode() {
136 return true;
137 }
138
140 public function needsToken() {
141 return 'csrf';
142 }
143
145 public function getHelpUrls() {
146 return 'https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel';
147 }
148
150 protected function getExamplesMessages() {
151 return [
152 'action=changecontentmodel&title=Main Page&model=text&token=123ABC'
153 => 'apihelp-changecontentmodel-example'
154 ];
155 }
156}
157
159class_alias( ApiChangeContentModel::class, 'ApiChangeContentModel' );
This abstract class implements many basic API functions, and is the base of all API classes.
Definition ApiBase.php:61
dieWithError( $msg, $code=null, $data=null, $httpCode=0)
Abort execution with an error.
Definition ApiBase.php:1511
checkUserRightsAny( $rights)
Helper function for permission-denied errors.
Definition ApiBase.php:1620
getModuleName()
Get the name of the module being executed by this instance.
Definition ApiBase.php:543
getResult()
Get the result object.
Definition ApiBase.php:682
dieStatus(StatusValue $status)
Throw an ApiUsageException based on the Status object.
Definition ApiBase.php:1562
extractRequestParams( $options=[])
Using getAllowedParams(), this function makes an array of the values provided by the user,...
Definition ApiBase.php:823
getTitleOrPageId( $params, $load=false)
Attempts to load a WikiPage object from a title or pageid parameter, if possible.
Definition ApiBase.php:1147
Api module to change the content model of existing pages.
mustBePosted()
Indicates whether this module must be called with a POST request.Implementations of this method must ...
getExamplesMessages()
Returns usage examples for this module.Return value has query strings as keys, with values being eith...
execute()
A lot of this code is based on SpecialChangeContentModel.
getHelpUrls()
Return links to more detailed help pages about the module.1.25, returning boolean false is deprecated...
needsToken()
Returns the token type this module requires in order to execute.Modules are strongly encouraged to us...
__construct(ApiMain $main, string $action, IContentHandlerFactory $contentHandlerFactory, ContentModelChangeFactory $contentModelChangeFactory)
isWriteMode()
Indicates whether this module requires write access to the wiki.API modules must override this method...
getAllowedParams()
Returns an array of allowed parameters (parameter name) => (default value) or (parameter name) => (ar...
This is the main API class, used for both external and internal processing.
Definition ApiMain.php:66
Service for formatting and validating API parameters.
Service for changing the content model of wiki pages.
Interface for database access objects.