- function view() {
- global $wgRequest, $wgUser;
-
- $diff = $wgRequest->getVal( 'diff' );
- $diffOnly = $wgRequest->getBool( 'diffonly', $wgUser->getOption( 'diffonly' ) );
-
- if ( isset( $diff ) && $diffOnly )
- return parent::view();
-
- if ( !wfRunHooks( 'CategoryPageView', array( &$this ) ) )
- return;
-
- if ( NS_CATEGORY == $this->mTitle->getNamespace() ) {
- $this->openShowCategory();
- }
-
- parent::view();
-
- if ( NS_CATEGORY == $this->mTitle->getNamespace() ) {
- $this->closeShowCategory();
- }
- }
-
- /**
- * Don't return a 404 for categories in use.
- */
- function hasViewableContent() {
- if ( parent::hasViewableContent() ) {
- return true;
- } else {
- $cat = Category::newFromTitle( $this->mTitle );
- return $cat->getId() != 0;
- }
- }
-
- function openShowCategory() {
- # For overloading
- }
-
- function closeShowCategory() {
- global $wgOut;
-
- $from = $until = array();
- foreach ( array( 'page', 'subcat', 'file' ) as $type ) {
- # Use $_GET instead of $wgRequest, because the latter helpfully
- # normalizes Unicode, which removes nulls. TODO: do something
- # smarter than passing nulls in URLs. :/
- $from[$type] = isset( $_GET["{$type}from"] ) ? $_GET["{$type}from"] : null;
- $until[$type] = isset( $_GET["{$type}until"] ) ? $_GET["{$type}until"] : null;
- }
-
- $viewer = new $this->mCategoryViewerClass( $this->mTitle, $from, $until, $_GET );
- $wgOut->addHTML( $viewer->getHTML() );
- }
-}
-
-class CategoryViewer {
- var $title, $limit, $from, $until,
- $articles, $articles_start_char,
- $children, $children_start_char,
- $showGallery, $gallery,
- $skin;
- # Category object for this page
- private $cat;
- # The original query array, to be used in generating paging links.
- private $query;
-
- function __construct( $title, $from = '', $until = '', $query = array() ) {
- global $wgCategoryPagingLimit;
- $this->title = $title;
- $this->from = $from;
- $this->until = $until;
- $this->limit = $wgCategoryPagingLimit;
- $this->cat = Category::newFromTitle( $title );
- $this->query = $query;
- unset( $this->query['title'] );
- }
-
- /**
- * Format the category data list.
- *
- * @return string HTML output
- * @private
- */
- function getHTML() {
- global $wgOut, $wgCategoryMagicGallery, $wgContLang;
- wfProfileIn( __METHOD__ );
-
- $this->showGallery = $wgCategoryMagicGallery && !$wgOut->mNoGallery;
-
- $this->clearCategoryState();
- $this->doCategoryQuery();
- $this->finaliseCategoryState();
-
- $r = $this->getSubcategorySection() .
- $this->getPagesSection() .
- $this->getImageSection();
-
- if ( $r == '' ) {
- // If there is no category content to display, only
- // show the top part of the navigation links.
- // FIXME: cannot be completely suppressed because it
- // is unknown if 'until' or 'from' makes this
- // give 0 results.
- $r = $r . $this->getCategoryTop();
- } else {
- $r = $this->getCategoryTop() .
- $r .
- $this->getCategoryBottom();
- }
-
- // Give a proper message if category is empty
- if ( $r == '' ) {
- $r = wfMsgExt( 'category-empty', array( 'parse' ) );
- }
-
- wfProfileOut( __METHOD__ );
- return $wgContLang->convert( $r );
- }
-
- function clearCategoryState() {
- $this->articles = array();
- $this->articles_start_char = array();
- $this->children = array();
- $this->children_start_char = array();
- if ( $this->showGallery ) {
- $this->gallery = new ImageGallery();
- $this->gallery->setHideBadImages();
- }
- }
-
- function getSkin() {
- if ( !$this->skin ) {
- global $wgUser;
- $this->skin = $wgUser->getSkin();
- }
- return $this->skin;
- }
-
- /**
- * Add a subcategory to the internal lists, using a Category object
- */
- function addSubcategoryObject( Category $cat, $sortkey, $pageLength ) {
- // Subcategory; strip the 'Category' namespace from the link text.
- $this->children[] = $this->getSkin()->link(
- $cat->getTitle(),
- null,
- array(),
- array(),
- array( 'known', 'noclasses' )
- );
-
- $this->children_start_char[] = $this->getSubcategorySortChar( $title, $sortkey );
- }
-