Page Menu
Home
WickedGov Phorge
Search
Configure Global Search
Log In
Files
F5956298
SpecialChangeContentModel.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
8 KB
Referenced Files
None
Subscribers
None
SpecialChangeContentModel.php
View Options
<?php
namespace
MediaWiki\Specials
;
use
ErrorPageError
;
use
LogEventsList
;
use
LogPage
;
use
MediaWiki\Collation\CollationFactory
;
use
MediaWiki\CommentStore\CommentStore
;
use
MediaWiki\Content\ContentHandler
;
use
MediaWiki\Content\IContentHandlerFactory
;
use
MediaWiki\EditPage\SpamChecker
;
use
MediaWiki\HTMLForm\HTMLForm
;
use
MediaWiki\Language\RawMessage
;
use
MediaWiki\Page\ContentModelChangeFactory
;
use
MediaWiki\Page\WikiPageFactory
;
use
MediaWiki\Revision\RevisionLookup
;
use
MediaWiki\Revision\RevisionRecord
;
use
MediaWiki\Revision\SlotRecord
;
use
MediaWiki\SpecialPage\FormSpecialPage
;
use
MediaWiki\Status\Status
;
use
MediaWiki\Title\Title
;
use
MediaWiki\Xml\Xml
;
use
SearchEngineFactory
;
/**
* @ingroup SpecialPage
*/
class
SpecialChangeContentModel
extends
FormSpecialPage
{
private
IContentHandlerFactory
$contentHandlerFactory
;
private
ContentModelChangeFactory
$contentModelChangeFactory
;
private
SpamChecker
$spamChecker
;
private
RevisionLookup
$revisionLookup
;
private
WikiPageFactory
$wikiPageFactory
;
private
SearchEngineFactory
$searchEngineFactory
;
private
CollationFactory
$collationFactory
;
/**
* @param IContentHandlerFactory $contentHandlerFactory
* @param ContentModelChangeFactory $contentModelChangeFactory
* @param SpamChecker $spamChecker
* @param RevisionLookup $revisionLookup
* @param WikiPageFactory $wikiPageFactory
* @param SearchEngineFactory $searchEngineFactory
* @param CollationFactory $collationFactory
*/
public
function
__construct
(
IContentHandlerFactory
$contentHandlerFactory
,
ContentModelChangeFactory
$contentModelChangeFactory
,
SpamChecker
$spamChecker
,
RevisionLookup
$revisionLookup
,
WikiPageFactory
$wikiPageFactory
,
SearchEngineFactory
$searchEngineFactory
,
CollationFactory
$collationFactory
)
{
parent
::
__construct
(
'ChangeContentModel'
,
'editcontentmodel'
);
$this
->
contentHandlerFactory
=
$contentHandlerFactory
;
$this
->
contentModelChangeFactory
=
$contentModelChangeFactory
;
$this
->
spamChecker
=
$spamChecker
;
$this
->
revisionLookup
=
$revisionLookup
;
$this
->
wikiPageFactory
=
$wikiPageFactory
;
$this
->
searchEngineFactory
=
$searchEngineFactory
;
$this
->
collationFactory
=
$collationFactory
;
}
public
function
doesWrites
()
{
return
true
;
}
/**
* @var Title|null
*/
private
$title
;
/**
* @var RevisionRecord|bool|null
*
* A RevisionRecord object, false if no revision exists, null if not loaded yet
*/
private
$oldRevision
;
protected
function
setParameter
(
$par
)
{
$par
=
$this
->
getRequest
()->
getVal
(
'pagetitle'
,
$par
);
$title
=
Title
::
newFromText
(
$par
);
if
(
$title
)
{
$this
->
title
=
$title
;
$this
->
par
=
$title
->
getPrefixedText
();
}
else
{
$this
->
par
=
''
;
}
}
protected
function
postHtml
()
{
$text
=
''
;
if
(
$this
->
title
)
{
$contentModelLogPage
=
new
LogPage
(
'contentmodel'
);
$text
=
Xml
::
element
(
'h2'
,
null
,
$contentModelLogPage
->
getName
()->
text
()
);
$out
=
''
;
LogEventsList
::
showLogExtract
(
$out
,
'contentmodel'
,
$this
->
title
);
$text
.=
$out
;
}
return
$text
;
}
protected
function
getDisplayFormat
()
{
return
'ooui'
;
}
protected
function
alterForm
(
HTMLForm
$form
)
{
$this
->
addHelpLink
(
'Help:ChangeContentModel'
);
if
(
$this
->
title
)
{
$form
->
setFormIdentifier
(
'modelform'
);
}
else
{
$form
->
setFormIdentifier
(
'titleform'
);
}
// T120576
$form
->
setSubmitTextMsg
(
'changecontentmodel-submit'
);
if
(
$this
->
title
)
{
$this
->
getOutput
()->
addBacklinkSubtitle
(
$this
->
title
);
}
}
public
function
validateTitle
(
$title
)
{
// Already validated by HTMLForm, but if not, throw
// an exception instead of a fatal
$titleObj
=
Title
::
newFromTextThrow
(
$title
);
$this
->
oldRevision
=
$this
->
revisionLookup
->
getRevisionByTitle
(
$titleObj
)
?:
false
;
if
(
$this
->
oldRevision
)
{
$oldContent
=
$this
->
oldRevision
->
getContent
(
SlotRecord
::
MAIN
);
if
(
!
$oldContent
->
getContentHandler
()->
supportsDirectEditing
()
)
{
return
$this
->
msg
(
'changecontentmodel-nodirectediting'
)
->
params
(
ContentHandler
::
getLocalizedName
(
$oldContent
->
getModel
()
)
)
->
escaped
();
}
}
return
true
;
}
protected
function
getFormFields
()
{
$fields
=
[
'pagetitle'
=>
[
'type'
=>
'title'
,
'creatable'
=>
true
,
'name'
=>
'pagetitle'
,
'default'
=>
$this
->
par
,
'label-message'
=>
'changecontentmodel-title-label'
,
'validation-callback'
=>
[
$this
,
'validateTitle'
],
],
];
if
(
$this
->
title
)
{
$options
=
$this
->
getOptionsForTitle
(
$this
->
title
);
if
(
!
$options
)
{
throw
new
ErrorPageError
(
'changecontentmodel-emptymodels-title'
,
'changecontentmodel-emptymodels-text'
,
[
$this
->
title
->
getPrefixedText
()
]
);
}
$fields
[
'pagetitle'
][
'readonly'
]
=
true
;
$fields
+=
[
'model'
=>
[
'type'
=>
'select'
,
'name'
=>
'model'
,
'default'
=>
$this
->
title
->
getContentModel
(),
'options'
=>
$options
,
'label-message'
=>
'changecontentmodel-model-label'
],
'reason'
=>
[
'type'
=>
'text'
,
'maxlength'
=>
CommentStore
::
COMMENT_CHARACTER_LIMIT
,
'name'
=>
'reason'
,
'validation-callback'
=>
function
(
$reason
)
{
if
(
$reason
===
null
||
$reason
===
''
)
{
// Null on form display, or no reason given
return
true
;
}
$match
=
$this
->
spamChecker
->
checkSummary
(
$reason
);
if
(
$match
)
{
return
$this
->
msg
(
'spamprotectionmatch'
,
$match
)->
parse
();
}
return
true
;
},
'label-message'
=>
'changecontentmodel-reason-label'
,
],
];
}
return
$fields
;
}
/**
* @return array $options An array of data for an OOUI drop-down list. The array keys
* correspond to the human readable text in the drop-down list. The array values
* correspond to the <option value="">.
*/
private
function
getOptionsForTitle
(
?
Title
$title
=
null
)
{
$models
=
$this
->
contentHandlerFactory
->
getContentModels
();
$options
=
[];
foreach
(
$models
as
$model
)
{
$handler
=
$this
->
contentHandlerFactory
->
getContentHandler
(
$model
);
if
(
!
$handler
->
supportsDirectEditing
()
)
{
continue
;
}
if
(
$title
)
{
if
(
!
$handler
->
canBeUsedOn
(
$title
)
)
{
continue
;
}
}
$options
[
ContentHandler
::
getLocalizedName
(
$model
)]
=
$model
;
}
// Put the options in the drop-down list in alphabetical order.
// Sort by array key, case insensitive.
$collation
=
$this
->
collationFactory
->
getCategoryCollation
();
uksort
(
$options
,
static
function
(
$a
,
$b
)
use
(
$collation
)
{
$a
=
$collation
->
getSortKey
(
$a
);
$b
=
$collation
->
getSortKey
(
$b
);
return
strcmp
(
$a
,
$b
);
}
);
return
$options
;
}
public
function
onSubmit
(
array
$data
)
{
$this
->
title
=
Title
::
newFromText
(
$data
[
'pagetitle'
]
);
$page
=
$this
->
wikiPageFactory
->
newFromTitle
(
$this
->
title
);
$changer
=
$this
->
contentModelChangeFactory
->
newContentModelChange
(
$this
->
getContext
()->
getAuthority
(),
$page
,
$data
[
'model'
]
);
$permissionStatus
=
$changer
->
authorizeChange
();
if
(
!
$permissionStatus
->
isGood
()
)
{
$out
=
$this
->
getOutput
();
$wikitext
=
$out
->
formatPermissionStatus
(
$permissionStatus
);
// Hack to get our wikitext parsed
return
Status
::
newFatal
(
new
RawMessage
(
'$1'
,
[
$wikitext
]
)
);
}
$status
=
$changer
->
doContentModelChange
(
$this
->
getContext
(),
$data
[
'reason'
],
true
);
return
$status
;
}
public
function
onSuccess
()
{
$out
=
$this
->
getOutput
();
$out
->
setPageTitleMsg
(
$this
->
msg
(
'changecontentmodel-success-title'
)
);
$out
->
addWikiMsg
(
'changecontentmodel-success-text'
,
$this
->
title
);
}
/**
* Return an array of subpages beginning with $search that this special page will accept.
*
* @param string $search Prefix to search for
* @param int $limit Maximum number of results to return (usually 10)
* @param int $offset Number of results to skip (usually 0)
* @return string[] Matching subpages
*/
public
function
prefixSearchSubpages
(
$search
,
$limit
,
$offset
)
{
return
$this
->
prefixSearchString
(
$search
,
$limit
,
$offset
,
$this
->
searchEngineFactory
);
}
protected
function
getGroupName
()
{
return
'pagetools'
;
}
}
/** @deprecated class alias since 1.41 */
class_alias
(
SpecialChangeContentModel
::
class
,
'SpecialChangeContentModel'
);
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Sat, Oct 3, 04:19 (3 w, 3 d ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
ae/af/84e63c0d48d8211656d2792e0933
Default Alt Text
SpecialChangeContentModel.php (8 KB)
Attached To
Mode
rMWPROD MediaWiki Production
Attached
Detach File
Event Timeline
Log In to Comment