r36892 - Code Review

From MediaWiki.org

Jump to: navigation, search
Repository:MediaWiki
Revision:r36891 | r36892 (on ViewVC) | r36893 >
Date:09:49, 2 July 2008
Author:daniel
Status:ok
Tags:
Comment:added inverse mode to navigate parent categories
Modified paths:

Diff [purge]

Index: trunk/extensions/CategoryTree/CategoryTreePage.php
===================================================================
--- trunk/extensions/CategoryTree/CategoryTreePage.php	(revision 36891)
+++ trunk/extensions/CategoryTree/CategoryTreePage.php	(revision 36892)
@@ -81,7 +81,7 @@
 				$parents = $this->tree->renderParents( $title );
 
 				if ( $parents == '' ) {
-					$wgOut->addHtml( wfMsgExt( 'categorytree-nothing-found', 'parseinline' ) );
+					$wgOut->addHtml( wfMsgExt( 'categorytree-no-parent-categories', 'parseinline' ) );
 				} else {
 					$wgOut->addHtml( $parents );
 				}
Index: trunk/extensions/CategoryTree/CategoryTree.i18n.php
===================================================================
--- trunk/extensions/CategoryTree/CategoryTree.i18n.php	(revision 36891)
+++ trunk/extensions/CategoryTree/CategoryTree.i18n.php	(revision 36892)
@@ -43,6 +43,7 @@
 	'categorytree-loading'          => 'loading…',
 	'categorytree-nothing-found'    => 'nothing found',
 	'categorytree-no-subcategories' => 'no subcategories',
+	'categorytree-no-parent-categories' => 'no parent categories',
 	'categorytree-no-pages'         => 'no pages or subcategories',
 	'categorytree-not-found'        => 'Category <i>$1</i> not found',
 	'categorytree-error'            => 'Problem loading data.',
@@ -610,6 +611,7 @@
 	'categorytree-nothing-found'    => 'Nichts gefunden',
 	'categorytree-no-subcategories' => 'Keine Unterkategorien',
 	'categorytree-no-pages'         => 'Keine Seite oder Unterkategorien',
+	'categorytree-no-parent-categories' => 'Keine Oberkategorien',
 	'categorytree-not-found'        => "Kategorie „$1“ nicht gefunden",
 	'categorytree-error'            => 'Probleme beim Laden der Daten.',
 	'categorytree-retry'            => 'Bitte warte einen Moment und versuche es dann erneut.',
Index: trunk/extensions/CategoryTree/CategoryTree.php
===================================================================
--- trunk/extensions/CategoryTree/CategoryTree.php	(revision 36891)
+++ trunk/extensions/CategoryTree/CategoryTree.php	(revision 36892)
@@ -22,6 +22,7 @@
 define('CT_MODE_CATEGORIES', 0);
 define('CT_MODE_PAGES', 10);
 define('CT_MODE_ALL', 20);
+define('CT_MODE_PARENTS', 100);
 
 /**
 * Constants for use with the hideprefix option,
@@ -64,6 +65,7 @@
 
 $wgCategoryTreeExtPath = '/extensions/CategoryTree';
 $wgCategoryTreeVersion = '2';  #NOTE: bump this when you change the CSS or JS files!
+$wgCategoryTreeUseCategoryTable = version_compare( $wgVersion, "1.13", '>=' );
 
 $wgCategoryTreeOmitNamespace = CT_HIDEPREFIX_CATEGORIES;
 $wgCategoryTreeDefaultMode = CT_MODE_CATEGORIES;
Index: trunk/extensions/CategoryTree/CategoryTree.js
===================================================================
--- trunk/extensions/CategoryTree/CategoryTree.js	(revision 36891)
+++ trunk/extensions/CategoryTree/CategoryTree.js	(revision 36892)
@@ -133,6 +133,7 @@
 
                     if ( options.mode == 0 ) result= categoryTreeNoSubcategoriesMsg;
                     else if ( options.mode == 10 ) result= categoryTreeNoPagesMsg;
+                    else if ( options.mode == 100 ) result= categoryTreeNoParentCategoriesMsg;
                     else result= categoryTreeNothingFoundMsg;
 
                     result+= '</i>';
Index: trunk/extensions/CategoryTree/CategoryTreeFunctions.php
===================================================================
--- trunk/extensions/CategoryTree/CategoryTreeFunctions.php	(revision 36891)
+++ trunk/extensions/CategoryTree/CategoryTreeFunctions.php	(revision 36892)
@@ -31,6 +31,11 @@
 		}
 
 		$this->mOptions['mode'] = self::decodeMode( $this->mOptions['mode'] );
+
+		if ( $this->mOptions['mode'] == CT_MODE_PARENTS ) {
+			 $this->mOptions['namespaces'] = false; #namespace filter makes no sense with CT_MODE_PARENTS
+		}
+
 		$this->mOptions['hideprefix'] = self::decodeHidePrefix( $this->mOptions['hideprefix'] );
 		$this->mOptions['showcount']  = self::decodeBoolean( $this->mOptions['showcount'] );
 		$this->mOptions['namespaces']  = self::decodeNamespaces( $this->mOptions['namespaces'] );
@@ -52,6 +57,10 @@
 		return $this->mOptions[$name];
 	}
 
+	function isInverse( ) {
+		return $this->getOption('mode') == CT_MODE_PARENTS;
+	}
+
 	static function decodeNamespaces( $nn ) {
 		global $wgContLang;
 
@@ -99,7 +108,8 @@
 
 		if ( $mode == 'all' ) $mode = CT_MODE_ALL;
 		else if ( $mode == 'pages' ) $mode = CT_MODE_PAGES;
-		else if ( $mode == 'categories' ) $mode = CT_MODE_CATEGORIES;
+		else if ( $mode == 'categories' || $mode == 'sub' ) $mode = CT_MODE_CATEGORIES;
+		else if ( $mode == 'parents' || $mode == 'super' || $mode == 'inverse' ) $mode = CT_MODE_PARENTS;
 		else if ( $mode == 'default' ) $mode = $wgCategoryTreeDefaultOptions['mode'];
 
 		return (int)$mode;
@@ -188,6 +198,7 @@
 			var categoryTreeLoadingMsg = \"".Xml::escapeJsString(wfMsgNoTrans('categorytree-loading'))."\";
 			var categoryTreeNothingFoundMsg = \"".Xml::escapeJsString(wfMsgNoTrans('categorytree-nothing-found'))."\";
 			var categoryTreeNoSubcategoriesMsg = \"".Xml::escapeJsString(wfMsgNoTrans('categorytree-no-subcategories'))."\";
+			var categoryTreeNoParentCategoriesMsg = \"".Xml::escapeJsString(wfMsgNoTrans('categorytree-no-parent-categories'))."\";
 			var categoryTreeNoPagesMsg = \"".Xml::escapeJsString(wfMsgNoTrans('categorytree-no-pages'))."\";
 			var categoryTreeErrorMsg = \"".Xml::escapeJsString(wfMsgNoTrans('categorytree-error'))."\";
 			var categoryTreeRetryMsg = \"".Xml::escapeJsString(wfMsgNoTrans('categorytree-retry'))."\";
@@ -379,7 +390,7 @@
 	* $title must be a Title object
 	*/
 	function renderChildren( &$title, $depth=1 ) {
-		global $wgCategoryTreeMaxChildren, $wgVersion;
+		global $wgCategoryTreeMaxChildren, $wgCategoryTreeUseCategoryTable;
 
 		if( $title->getNamespace() != NS_CATEGORY ) {
 			// Non-categories can't have children. :)
@@ -388,20 +399,30 @@
 
 		$dbr =& wfGetDB( DB_SLAVE );
 
-
+		$inverse = $this->isInverse();
 		$mode = $this->getOption('mode');
 		$namespaces = $this->getOption('namespaces');
 
-		#namespace filter. 
-		if ( $namespaces ) {
-			#NOTE: we assume that the $namespaces array contains only integers!
-			if ( sizeof( $namespaces ) === 1 ) $nsmatch = ' AND cat.page_namespace = ' . $namespaces[0] . ' ';
-			else $nsmatch = ' AND cat.page_namespace IN ( ' . implode( ', ', $namespaces ) . ') ';
+		if ( $inverse ) {
+			$ctJoinCond = ' cl_to = cat.page_title AND cat.page_namespace = ' . NS_CATEGORY;
+			$ctWhere = " cl_from = " . $title->getArticleId();
+			$nsmatch = '';
 		}
 		else {
-			if ( $mode == CT_MODE_ALL ) $nsmatch = '';
-			else if ( $mode == CT_MODE_PAGES ) $nsmatch = ' AND cat.page_namespace != ' . NS_IMAGE;
-			else $nsmatch = ' AND cat.page_namespace = ' . NS_CATEGORY;
+			$ctJoinCond = ' cl_from = cat.page_id ';
+			$ctWhere = " cl_to = " . $dbr->addQuotes( $title->getDBkey() );
+
+			#namespace filter. 
+			if ( $namespaces ) {
+				#NOTE: we assume that the $namespaces array contains only integers! decodeNamepsaces makes it so.
+				if ( sizeof( $namespaces ) === 1 ) $nsmatch = ' AND cat.page_namespace = ' . $namespaces[0] . ' ';
+				else $nsmatch = ' AND cat.page_namespace IN ( ' . implode( ', ', $namespaces ) . ') ';
+			}
+			else {
+				if ( $mode == CT_MODE_ALL ) $nsmatch = '';
+				else if ( $mode == CT_MODE_PAGES ) $nsmatch = ' AND cat.page_namespace != ' . NS_IMAGE;
+				else $nsmatch = ' AND cat.page_namespace = ' . NS_CATEGORY;
+			}
 		}
 
 		#additional stuff to be used if "transaltion" by interwiki-links is desired
@@ -410,7 +431,7 @@
 		$transWhere = '';
 
 		# fetch member count if possible
-		$doCount = version_compare( $wgVersion, "1.12", '>' );
+		$doCount = !$inverse && $wgCategoryTreeUseCategoryTable;
 
 		$countFields = '';
 		$countJoin = '';
@@ -428,10 +449,10 @@
 					  $transFields
 					  $countFields
 				FROM $page as cat
-				JOIN $categorylinks ON cl_from = cat.page_id
+				JOIN $categorylinks ON $ctJoinCond
 				$transJoin
 				$countJoin
-				WHERE cl_to = " . $dbr->addQuotes( $title->getDBkey() ) . "
+				WHERE $ctWhere
 				$nsmatch
 				"./*AND cat.page_is_redirect = 0*/"
 				$transWhere
@@ -527,7 +548,11 @@
 	* $title must be a Title object
 	*/
 	function renderNode( $title, $children = 0, $loadchildren = false ) {
-		if ( $title->getNamespace() == NS_CATEGORY ) $cat = Category::newFromTitle( $title );
+		global $wgCategoryTreeUseCategoryTable;
+
+		if ( $wgCategoryTreeUseCategoryTable && $title->getNamespace() == NS_CATEGORY && !$this->isInverse() ) {
+			$cat = Category::newFromTitle( $title );
+		}
 		else $cat = NULL;
 
 		return $this->renderNodeInfo( $title, $cat, $children, $loadchildren );
@@ -658,6 +683,7 @@
 				$s .= Xml::openElement( 'i', array( 'class' => 'CategoryTreeNotice' ) );
 				if ( $mode == CT_MODE_CATEGORIES ) $s .= wfMsgExt( 'categorytree-no-subcategories', 'parsemag');
 				else if ( $mode == CT_MODE_PAGES ) $s .= wfMsgExt( 'categorytree-no-pages', 'parsemag');
+				else if ( $mode == CT_MODE_PARENTS ) $s .= wfMsgExt( 'categorytree-no-parent-categories', 'parsemag');
 				else $s .= wfMsgExt( 'categorytree-nothing-found', 'parsemag');
 				$s .= Xml::closeElement( 'i' );
 			} else {
Views
Toolbox