Question

I've been able to instantiate a category object to retrieve its name, but when I use the getUrl method it isn't returning a URL to the category listing page, or anything at all

<?php
$children = Mage::getModel('catalog/category')->getCategories(3);
foreach ($children as $category):
            echo '<li><a href="' . $category->getUrl() . '">' . $category->getName() . '</a></li>';
        endforeach;
?> 

The code above results in HTML output of

<li><a href="">name of sub-cat</a></li>`

Does anyone know how I can get the URL for a category page from a catalog/category object?

Was it helpful?

Solution

Replace

$children = Mage::getModel('catalog/category')->getCategories(3);

with

$children = Mage::getModel('catalog/category')->load(3)->getChildrenCategories();

OTHER TIPS

The problem is getCategories() normally returns a Varien_Data_Tree_Node_Collection rather than a collection of categories. Instead, you can do this:

$children = Mage::getModel('catalog/category')->getCategories(3, 0, false, true);

The fourth parameter is $asCollection, passing a true means you are returned a Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Collection which you were probably expecting. The rest should work now.

You may load every category within the foreach loop and then get the category URL.

<?php
$children = Mage::getModel('catalog/category')->getCategories(3);
foreach ($children as $category): 
        $categoryUrl = Mage::getModel('catalog/category')->load($category->getEntityId())->getUrl();
        echo '<li><a href="' . $categoryUrl . '">' . $category->getName() . '</a></li>';
endforeach;
?>

This might work fine for less number of categories. However, this might take more time if you have large number of categories.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top