checkPermissions();
$this->checkReadOnly();
$output = $this->getOutput();
$user = $this->getUser();
$request = $this->getRequest();
$this->setHeaders();
$this->outputHeader();
$this->getOutput()->addModules( array( 'mediawiki.special.edittags',
'mediawiki.special.edittags.styles' ) );
$this->submitClicked = $request->wasPosted() && $request->getBool( 'wpSubmit' );
// Handle our many different possible input types
$ids = $request->getVal( 'ids' );
if ( !is_null( $ids ) ) {
// Allow CSV from the form hidden field, or a single ID for show/hide links
$this->ids = explode( ',', $ids );
} else {
// Array input
$this->ids = array_keys( $request->getArray( 'ids', array() ) );
}
$this->ids = array_unique( array_filter( $this->ids ) );
// No targets?
if ( count( $this->ids ) == 0 ) {
throw new ErrorPageError( 'tags-edit-nooldid-title', 'tags-edit-nooldid-text' );
}
$this->typeName = $request->getVal( 'type' );
$this->targetObj = Title::newFromText( $request->getText( 'target' ) );
// sanity check of parameter
switch ( $this->typeName ) {
case 'logentry':
case 'logging':
$this->typeName = 'logentry';
break;
default:
$this->typeName = 'revision';
break;
}
// Allow the list type to adjust the passed target
// Yuck! Copied straight out of SpecialRevisiondelete, but it does exactly
// what we want
$this->targetObj = RevisionDeleter::suggestTarget(
$this->typeName === 'revision' ? 'revision' : 'logging',
$this->targetObj,
$this->ids
);
$this->isAllowed = $user->isAllowed( 'changetags' );
$this->reason = $request->getVal( 'wpReason' );
// We need a target page!
if ( is_null( $this->targetObj ) ) {
$output->addWikiMsg( 'undelete-header' );
return;
}
// Give a link to the logs/hist for this page
$this->showConvenienceLinks();
// Either submit or create our form
if ( $this->isAllowed && $this->submitClicked ) {
$this->submit();
} else {
$this->showForm();
}
// Show relevant lines from the tag log
$tagLogPage = new LogPage( 'tag' );
$output->addHTML( "
" . $tagLogPage->getName()->escaped() . "
\n" );
LogEventsList::showLogExtract(
$output,
'tag',
$this->targetObj,
'', /* user */
array( 'lim' => 25, 'conds' => array(), 'useMaster' => $this->wasSaved )
);
}
/**
* Show some useful links in the subtitle
*/
protected function showConvenienceLinks() {
// Give a link to the logs/hist for this page
if ( $this->targetObj ) {
// Also set header tabs to be for the target.
$this->getSkin()->setRelevantTitle( $this->targetObj );
$links = array();
$links[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'Log' ),
$this->msg( 'viewpagelogs' )->escaped(),
array(),
array(
'page' => $this->targetObj->getPrefixedText(),
'hide_tag_log' => '0',
)
);
if ( !$this->targetObj->isSpecialPage() ) {
// Give a link to the page history
$links[] = Linker::linkKnown(
$this->targetObj,
$this->msg( 'pagehist' )->escaped(),
array(),
array( 'action' => 'history' )
);
}
// Link to Special:Tags
$links[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'Tags' ),
$this->msg( 'tags-edit-manage-link' )->escaped()
);
// Logs themselves don't have histories or archived revisions
$this->getOutput()->addSubtitle( $this->getLanguage()->pipeList( $links ) );
}
}
/**
* Get the list object for this request
* @return ChangeTagsList
*/
protected function getList() {
if ( is_null( $this->revList ) ) {
$this->revList = ChangeTagsList::factory( $this->typeName, $this->getContext(),
$this->targetObj, $this->ids );
}
return $this->revList;
}
/**
* Show a list of items that we will operate on, and show a form which allows
* the user to modify the tags applied to those items.
*/
protected function showForm() {
$userAllowed = true;
$out = $this->getOutput();
// Messages: tags-edit-revision-selected, tags-edit-logentry-selected
$out->wrapWikiMsg( "$1", array(
"tags-edit-{$this->typeName}-selected",
$this->getLanguage()->formatNum( count( $this->ids ) ),
$this->targetObj->getPrefixedText()
) );
$this->addHelpLink( 'Help:Tags' );
$out->addHTML( "
' . $tagSelect[1];
// also output the tags currently applied as a hidden form field, so we
// know what to remove from the revision/log entry when the form is submitted
$html .= Html::hidden( 'wpExistingTags', implode( ',', $tags ) );
$html .= '
';
} else {
// Otherwise, use a multi-select field for adding tags, and a list of
// checkboxes for removing them
$tags = array();
// @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
for ( $list->reset(); $list->current(); $list->next() ) {
// @codingStandardsIgnoreEnd
$currentTags = $list->current()->getTags();
if ( $currentTags ) {
$tags = array_merge( $tags, explode( ',', $currentTags ) );
}
}
$tags = array_unique( $tags );
$html = '