/**
  * Main execution function
  * @param $par Parameters passed to the page
  */
 function execute($par)
 {
     global $wgRequest, $wgOut, $wgMakeBotPrivileged, $wgUser;
     $this->setHeaders();
     if ($par) {
         $this->target = $par;
     } else {
         $this->target = $wgRequest->getVal('target', wfMsg('rootcategory'));
     }
     $this->target = trim($this->target);
     #HACK for undefined root category
     if ($this->target == '<rootcategory>' || $this->target == '&lt;rootcategory&gt;') {
         $this->target = NULL;
     }
     $this->mode = $wgRequest->getVal('mode', CT_MODE_CATEGORIES);
     if ($this->mode == 'all') {
         $this->mode = CT_MODE_ALL;
     } else {
         if ($this->mode == 'pages') {
             $this->mode = CT_MODE_PAGES;
         } else {
             if ($this->mode == 'categories') {
                 $this->mode = CT_MODE_CATEGORIES;
             }
         }
     }
     $this->mode = (int) $this->mode;
     $wgOut->addWikiText(wfMsgNoTrans('categorytree-header'));
     $wgOut->addHtml($this->makeInputForm());
     if ($this->target !== '' && $this->target !== NULL) {
         CategoryTree::setHeaders($wgOut);
         $title = CategoryTree::makeTitle($this->target);
         if ($title && $title->getArticleID()) {
             $html = '';
             $html .= wfOpenElement('div', array('class' => 'CategoryTreeParents'));
             $html .= wfElement('span', array('class' => 'CategoryTreeParents'), wfMsg('categorytree-parents')) . ': ';
             $ct = new CategoryTree();
             $parents = $ct->renderParents($title, $this->mode);
             if ($parents == '') {
                 $html .= wfMsg('categorytree-nothing-found');
             } else {
                 $html .= $parents;
             }
             $html .= wfCloseElement('div');
             $html .= wfOpenElement('div', array('class' => 'CategoryTreeResult'));
             $html .= $ct->renderNode($title, $this->mode, true, false);
             $html .= wfCloseElement('div');
             $wgOut->addHtml($html);
         } else {
             $wgOut->addHtml(wfOpenElement('div', array('class' => 'CategoryTreeNotice')));
             $wgOut->addWikiText(wfMsg('categorytree-not-found', $this->target));
             $wgOut->addHtml(wfCloseElement('div'));
         }
     }
 }
 function getSubcategorySection()
 {
     global $wgOut, $wgRequest, $wgCookiePrefix, $wgCategoryTreeCategoryPageMode;
     if ($wgRequest->getCheck('notree')) {
         return parent::getSubcategorySection();
     }
     if ($GLOBALS['wgCategoryTreeUnifiedView']) {
         return parent::getSubcategorySection();
     }
     if (count($this->children) == 0) {
         return '';
     }
     $r = '<h2>' . wfMsg('subcategories') . "</h2>\n" . wfMsgExt('subcategorycount', array('parse'), count($this->children));
     # Use a cookie to save the user's last selection, so that AJAX doesn't
     # keep coming back to haunt them.
     #
     # FIXME: This doesn't work very well with IMS handling in
     # OutputPage::checkLastModified, because when the cookie changes, the
     # category pages are not, at present, invalidated.
     $cookieName = $wgCookiePrefix . 'ShowSubcatAs';
     $cookieVal = @$_COOKIE[$cookieName];
     $reqShowAs = $wgRequest->getVal('showas');
     if ($reqShowAs == 'list') {
         $showAs = 'list';
     } elseif ($reqShowAs == 'tree') {
         $showAs = 'tree';
     } elseif ($cookieVal == 'list' || $cookieVal == 'tree') {
         $showAs = $cookieVal;
     } else {
         $showAs = 'tree';
     }
     if (!is_null($reqShowAs)) {
         global $wgCookieExpiration, $wgCookiePath, $wgCookieDomain, $wgCookieSecure;
         $exp = time() + $wgCookieExpiration;
         setcookie($cookieName, $showAs, $exp, $wgCookiePath, $wgCookieDomain, $wgCookieSecure);
     }
     if ($showAs == 'tree' && count($this->children) > $this->limit) {
         # Tree doesn't page properly
         $showAs = 'list';
         $r .= self::msg('too-many-subcats');
     } else {
         $sk = $this->getSkin();
         $r .= '<p>' . $this->makeShowAsLink('tree', $showAs) . ' | ' . $this->makeShowAsLink('list', $showAs) . '</p>';
     }
     if ($showAs == 'list') {
         $r .= $this->formatList($this->children, $this->children_start_char);
     } else {
         CategoryTree::setHeaders($wgOut);
         $ct = new CategoryTree();
         foreach ($this->child_titles as $title) {
             $r .= $ct->renderNode($title, $wgCategoryTreeCategoryPageMode);
         }
     }
     return $r;
 }
 function getCategoryTree()
 {
     global $wgOut, $wgCategoryTreeCategoryPageOptions, $wgCategoryTreeForceHeaders;
     if (!isset($this->categorytree)) {
         if (!$wgCategoryTreeForceHeaders) {
             CategoryTree::setHeaders($wgOut);
         }
         $this->categorytree = new CategoryTree($wgCategoryTreeCategoryPageOptions);
     }
     return $this->categorytree;
 }
 /**
  * Main execution function
  * @param $par array Parameters passed to the page
  */
 function execute($par)
 {
     global $wgCategoryTreeDefaultOptions, $wgCategoryTreeSpecialPageOptions, $wgCategoryTreeForceHeaders;
     $this->setHeaders();
     $request = $this->getRequest();
     if ($par) {
         $this->target = $par;
     } else {
         $this->target = $request->getVal('target', wfMessage('rootcategory')->text());
     }
     $this->target = trim($this->target);
     # HACK for undefined root category
     if ($this->target == '<rootcategory>' || $this->target == '&lt;rootcategory&gt;') {
         $this->target = null;
     }
     $options = array();
     # grab all known options from the request. Normalization is done by the CategoryTree class
     foreach ($wgCategoryTreeDefaultOptions as $option => $default) {
         if (isset($wgCategoryTreeSpecialPageOptions[$option])) {
             $default = $wgCategoryTreeSpecialPageOptions[$option];
         }
         $options[$option] = $request->getVal($option, $default);
     }
     $this->tree = new CategoryTree($options);
     $output = $this->getOutput();
     $output->addWikiMsg('categorytree-header');
     $this->executeInputForm();
     if ($this->target !== '' && $this->target !== null) {
         if (!$wgCategoryTreeForceHeaders) {
             CategoryTree::setHeaders($output);
         }
         $title = CategoryTree::makeTitle($this->target);
         if ($title && $title->getArticleID()) {
             $output->addHTML(Xml::openElement('div', array('class' => 'CategoryTreeParents')));
             $output->addHTML(wfMessage('categorytree-parents')->parse());
             $output->addHTML(wfMessage('colon-separator')->escaped());
             $parents = $this->tree->renderParents($title);
             if ($parents == '') {
                 $output->addHTML(wfMessage('categorytree-no-parent-categories')->parse());
             } else {
                 $output->addHTML($parents);
             }
             $output->addHTML(Xml::closeElement('div'));
             $output->addHTML(Xml::openElement('div', array('class' => 'CategoryTreeResult')));
             $output->addHTML($this->tree->renderNode($title, 1));
             $output->addHTML(Xml::closeElement('div'));
         } else {
             $output->addHTML(Xml::openElement('div', array('class' => 'CategoryTreeNotice')));
             $output->addHTML(wfMessage('categorytree-not-found', $this->target)->parse());
             $output->addHTML(Xml::closeElement('div'));
         }
     }
 }
/**
* Hook callback that injects messages and things into the <head> tag
* Does nothing if $parserOutput->mCategoryTreeTag is not set
*/
function efCategoryTreeParserOutput($outputPage, $parserOutput)
{
    if (!empty($parserOutput->mCategoryTreeTag)) {
        CategoryTree::setHeaders($outputPage);
    }
    return true;
}
/**
 * BeforePageDisplay hook. This hook is set when $wgCategoryTreeForceHeaders
 * is set.
 * Otherwise similar to efCategoryTreeParserOutput.
 * @param $out OutputPage
 * @param $skin Skin
 * @return bool
 */
function efCategoryTreeAddHeaders(OutputPage $out, Skin $skin)
{
    CategoryTree::setHeaders($out);
    return true;
}