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