Пример #1
0
 /**
  * Format the category data list.
  *
  * @param string $from -- return only sort keys from this item on
  * @param string $until -- don't return keys after this point.
  * @return string HTML output
  * @private
  */
 function doCategoryMagic($from = '', $until = '')
 {
     global $wgOut;
     global $wgContLang, $wgUser, $wgCategoryMagicGallery, $wgCategoryPagingLimit;
     $fname = 'CategoryPage::doCategoryMagic';
     wfProfileIn($fname);
     $articles = array();
     $articles_start_char = array();
     $children = array();
     $children_start_char = array();
     $showGallery = $wgCategoryMagicGallery && !$wgOut->mNoGallery;
     if ($showGallery) {
         $ig = new ImageGallery();
         $ig->setParsing();
     }
     $dbr =& wfGetDB(DB_SLAVE);
     if ($from != '') {
         $pageCondition = 'cl_sortkey >= ' . $dbr->addQuotes($from);
         $flip = false;
     } elseif ($until != '') {
         $pageCondition = 'cl_sortkey < ' . $dbr->addQuotes($until);
         $flip = true;
     } else {
         $pageCondition = '1 = 1';
         $flip = false;
     }
     $limit = $wgCategoryPagingLimit;
     $res = $dbr->select(array('page', 'categorylinks'), array('page_title', 'page_namespace', 'page_len', 'cl_sortkey'), array($pageCondition, 'cl_from          =  page_id', 'cl_to' => $this->mTitle->getDBKey()), $fname, array('ORDER BY' => $flip ? 'cl_sortkey DESC' : 'cl_sortkey', 'LIMIT' => $limit + 1));
     $sk =& $wgUser->getSkin();
     $r = "<br style=\"clear:both;\"/>\n";
     $count = 0;
     $nextPage = null;
     while ($x = $dbr->fetchObject($res)) {
         if (++$count > $limit) {
             // We've reached the one extra which shows that there are
             // additional pages to be had. Stop here...
             $nextPage = $x->cl_sortkey;
             break;
         }
         $title = Title::makeTitle($x->page_namespace, $x->page_title);
         if ($title->getNamespace() == NS_CATEGORY) {
             // Subcategory; strip the 'Category' namespace from the link text.
             array_push($children, $sk->makeKnownLinkObj($title, $wgContLang->convertHtml($title->getText())));
             // If there's a link from Category:A to Category:B, the sortkey of the resulting
             // entry in the categorylinks table is Category:A, not A, which it SHOULD be.
             // Workaround: If sortkey == "Category:".$title, than use $title for sorting,
             // else use sortkey...
             $sortkey = '';
             if ($title->getPrefixedText() == $x->cl_sortkey) {
                 $sortkey = $wgContLang->firstChar($x->page_title);
             } else {
                 $sortkey = $wgContLang->firstChar($x->cl_sortkey);
             }
             array_push($children_start_char, $wgContLang->convert($sortkey));
         } elseif ($showGallery && $title->getNamespace() == NS_IMAGE) {
             // Show thumbnails of categorized images, in a separate chunk
             if ($flip) {
                 $ig->insert(Image::newFromTitle($title));
             } else {
                 $ig->add(Image::newFromTitle($title));
             }
         } else {
             // Page in this category
             array_push($articles, $sk->makeSizeLinkObj($x->page_len, $title, $wgContLang->convert($title->getPrefixedText())));
             array_push($articles_start_char, $wgContLang->convert($wgContLang->firstChar($x->cl_sortkey)));
         }
     }
     $dbr->freeResult($res);
     if ($flip) {
         $children = array_reverse($children);
         $children_start_char = array_reverse($children_start_char);
         $articles = array_reverse($articles);
         $articles_start_char = array_reverse($articles_start_char);
     }
     if ($until != '') {
         $r .= $this->pagingLinks($this->mTitle, $nextPage, $until, $limit);
     } elseif ($nextPage != '' || $from != '') {
         $r .= $this->pagingLinks($this->mTitle, $from, $nextPage, $limit);
     }
     # Don't show subcategories section if there are none.
     if (count($children) > 0) {
         # Showing subcategories
         $r .= '<h2>' . wfMsg('subcategories') . "</h2>\n";
         $r .= wfMsgExt('subcategorycount', array('parse'), count($children));
         $r .= $this->formatList($children, $children_start_char);
     }
     # Showing articles in this category
     $ti = htmlspecialchars($this->mTitle->getText());
     $r .= '<h2>' . wfMsg('category_header', $ti) . "</h2>\n";
     $r .= wfMsgExt('categoryarticlecount', array('parse'), count($articles));
     $r .= $this->formatList($articles, $articles_start_char);
     if ($showGallery && !$ig->isEmpty()) {
         $r .= $ig->toHTML();
     }
     if ($until != '') {
         $r .= $this->pagingLinks($this->mTitle, $nextPage, $until, $limit);
     } elseif ($nextPage != '' || $from != '') {
         $r .= $this->pagingLinks($this->mTitle, $from, $nextPage, $limit);
     }
     wfProfileOut($fname);
     return $r;
 }
 function generateList()
 {
     if ($this->pager->offset == -1) {
         return '';
         // list has no entries
     }
     # {{{ gallery container template
     $gallery_html = '';
     $gallery_tpl = array('__tag' => 'div', 'class' => 'cb_files_container', 0 => &$gallery_html);
     # }}}
     # create list of files (holder of prev/next AJAX links and generated image gallery)
     $filelist = array();
     # create image gallery
     $gallery = new ImageGallery();
     $gallery->setHideBadImages();
     $gallery->setPerRow(CB_Setup::$imageGalleryPerRow);
     $this->addPrevPageLink($filelist);
     foreach ($this->pager->entries as &$file) {
         $file_title = Title::makeTitle($file->page_namespace, $file->page_title);
         # show the sortkey, when it does not match title name
         $gallery->add($file_title, $this->addSortKey($file_title, $file));
     }
     if (!$gallery->isEmpty()) {
         $gallery_html = $gallery->toHTML();
         $filelist[] = CB_XML::toText($gallery_tpl);
     }
     $this->addNextPageLink($filelist);
     return $filelist;
 }