示例#1
0
 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();
 }
示例#2
0
 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');
 }