protected function showDeleteTagForm($tag) { $user = $this->getUser(); if (!$user->isAllowed('deletechangetags')) { throw new PermissionsError('deletechangetags'); } $out = $this->getOutput(); $out->setPageTitle($this->msg('tags-delete-title')); $out->addBacklinkSubtitle($this->getPageTitle()); // is the tag actually able to be deleted? $canDeleteResult = ChangeTags::canDeleteTag($tag, $user); if (!$canDeleteResult->isGood()) { $out->addWikiText("<div class=\"error\">\n" . $canDeleteResult->getWikiText() . "\n</div>"); if (!$canDeleteResult->isOK()) { return; } } $preText = $this->msg('tags-delete-explanation-initial', $tag)->parseAsBlock(); $tagUsage = ChangeTags::tagUsageStatistics(); if (isset($tagUsage[$tag]) && $tagUsage[$tag] > 0) { $preText .= $this->msg('tags-delete-explanation-in-use', $tag, $tagUsage[$tag])->parseAsBlock(); } $preText .= $this->msg('tags-delete-explanation-warning', $tag)->parseAsBlock(); // see if the tag is in use $this->extensionActivatedTags = array_fill_keys(ChangeTags::listExtensionActivatedTags(), true); if (isset($this->extensionActivatedTags[$tag])) { $preText .= $this->msg('tags-delete-explanation-active', $tag)->parseAsBlock(); } $fields = []; $fields['Reason'] = ['type' => 'text', 'label' => $this->msg('tags-delete-reason')->plain(), 'size' => 50]; $fields['HiddenTag'] = ['type' => 'hidden', 'name' => 'tag', 'default' => $tag, 'required' => true]; $form = new HTMLForm($fields, $this->getContext()); $form->setAction($this->getPageTitle('delete')->getLocalURL()); $form->tagAction = 'delete'; // custom property on HTMLForm object $form->setSubmitCallback([$this, 'processTagForm']); $form->setSubmitTextMsg('tags-delete-submit'); $form->setSubmitDestructive(); // nasty! $form->addPreText($preText); $form->show(); }
public function execute() { $params = $this->extractRequestParams(); $prop = array_flip($params['prop']); $fld_displayname = isset($prop['displayname']); $fld_description = isset($prop['description']); $fld_hitcount = isset($prop['hitcount']); $fld_defined = isset($prop['defined']); $fld_source = isset($prop['source']); $fld_active = isset($prop['active']); $limit = $params['limit']; $result = $this->getResult(); $extensionDefinedTags = array_fill_keys(ChangeTags::listExtensionDefinedTags(), 0); $explicitlyDefinedTags = array_fill_keys(ChangeTags::listExplicitlyDefinedTags(), 0); $extensionActivatedTags = array_fill_keys(ChangeTags::listExtensionActivatedTags(), 0); $definedTags = array_merge($extensionDefinedTags, $explicitlyDefinedTags); # Fetch defined tags that aren't past the continuation if ($params['continue'] !== null) { $cont = $params['continue']; $tags = array_filter(array_keys($definedTags), function ($v) use($cont) { return $v >= $cont; }); $tags = array_fill_keys($tags, 0); } else { $tags = $definedTags; } # Merge in all used tags $this->addTables('change_tag'); $this->addFields('ct_tag'); $this->addFields(array('hitcount' => $fld_hitcount ? 'COUNT(*)' : '0')); $this->addOption('LIMIT', $limit + 1); $this->addOption('GROUP BY', 'ct_tag'); $this->addWhereRange('ct_tag', 'newer', $params['continue'], null); $res = $this->select(__METHOD__); foreach ($res as $row) { $tags[$row->ct_tag] = (int) $row->hitcount; } # Now make sure the array is sorted for proper continuation ksort($tags); $count = 0; foreach ($tags as $tagName => $hitcount) { if (++$count > $limit) { $this->setContinueEnumParameter('continue', $tagName); break; } $tag = array(); $tag['name'] = $tagName; if ($fld_displayname) { $tag['displayname'] = ChangeTags::tagDescription($tagName); } if ($fld_description) { $msg = $this->msg("tag-{$tagName}-description"); $tag['description'] = $msg->exists() ? $msg->text() : ''; } if ($fld_hitcount) { $tag['hitcount'] = $hitcount; } $isExtension = isset($extensionDefinedTags[$tagName]); $isExplicit = isset($explicitlyDefinedTags[$tagName]); if ($fld_defined) { $tag['defined'] = $isExtension || $isExplicit; } if ($fld_source) { $tag['source'] = array(); if ($isExtension) { $tag['source'][] = 'extension'; } if ($isExplicit) { $tag['source'][] = 'manual'; } } if ($fld_active) { $tag['active'] = $isExplicit || isset($extensionActivatedTags[$tagName]); } $fit = $result->addValue(array('query', $this->getModuleName()), null, $tag); if (!$fit) { $this->setContinueEnumParameter('continue', $tagName); break; } } $result->addIndexedTagName(array('query', $this->getModuleName()), 'tag'); }