Magento: Displaying Categories and Current Subcategories

I started “skinning” Magento today with a design that I was given. The functionality called for was a left category navigation (on every page but customer pages and cart/checkout pages) that always displayed the main categories – but when you click on a category, Magento should take you to that category’s listing, but also display the current subcategories.

So – since we all know that the Magento documentation is pretty crappy at this time, I had to do a lot of digging through core files, and a lot of time just with trial and error. But, I finally did come up with something that works. I’m willing to bet that there is a better, more proper way to do it, but regardless, this seems to be working perfectly.

What I did was create a new PHTML file, created the proper block call in page.xml, and now I’ve got a great working (and looking!) left-navigation. Here’s the home page (left), and a category page (right):


 

And the code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<h3>Browse by Category:</h3>
 
<ul>
<?php
$obj = new Mage_Catalog_Block_Navigation();
$store_cats	= $obj->getStoreCategories();
$current_cat 	= $obj->getCurrentCategory();
 
$current_cat	= (is_object($current_cat) ? $current_cat->getName() : '');
 
foreach ($store_cats as $cat) {
	if ($cat->getName() == $current_cat) {
		echo '<li class="current"><a href="'.$this->getCategoryUrl($cat).'">'.$cat->getName()."</a>\n<ul>\n";
		foreach ($obj->getCurrentChildCategories() as $subcat) {
			echo '<li><a href="'.$this->getCategoryUrl($subcat).'">'.$subcat->getName()."</a></li>\n";
		}
		echo "</ul>\n</li>\n";
	} else {
		echo '<li><a href="'.$this->getCategoryUrl($cat).'">'.$cat->getName()."</a></li>\n";
	}
}
?>
</ul>

If you know of a better way to do this – please let me know!

7 Comments

MikeJanuary 17th, 2009 at 5:42 pm

Looks good, but if i click on an subcategory the menu is closing the subcategory:
Take a look:
http://www.spleen-art.com/spleen

shakirFebruary 25th, 2009 at 7:07 am

it helped me alot ….. great work buddy… ;)

LerentechAugust 17th, 2009 at 9:52 am

Great work! I’ve been looking for this. Thanks so much!

MoniAugust 19th, 2009 at 6:16 am

its working fine.. cheers!!

chris gNovember 5th, 2009 at 11:59 pm

cheers mate, you are a gun!

MariusNovember 11th, 2009 at 2:40 am

I looks good, but what if I want to overwrite the Mage_Catalog_Block_Navigation class?
Then I won’t be able to use my custom methods in this code.
A better way to initialize the block is
$obj = $this->getLayout()->createBlock(’catalog/navigation’);

AdeelJanuary 16th, 2010 at 3:02 am

use full code thanks to Magento

Leave a comment

Your comment