Magento - get filterable attributes by category

wiseguydigital picture wiseguydigital · Jul 1, 2010 · Viewed 19.3k times · Source

I have created a custom navigation module specifically for a website, but I really want to be able to list filterable attributes by a specific category. So for instance my main navigation is:

  • Category 1
  • Category 2
  • Category 3 etc.

I then that when a user mouses over a category, they are then presented with an expanded menu with a few filterable options e.g.:


Category 1

View by manufacturer:

  • Manufacturer 1
  • Manufacturer 2
  • Manufacturer 3 etc.

I am able to get all filterable attributes for the store, but I want this list to pull in only the filterable attributes per category, as for instance Category 1 may have different manufacturers to Category 2. I then need to cache these results as this will not change often.

Answer

Jasper picture Jasper · Jun 23, 2011

The answer that Joe gave was a good starting point, but the attributes didn't returned any options yet. After a lot of frustrations I solved the problem with the following code. Hope it helps all of you out.

$layer = Mage::getModel("catalog/layer");
foreach($categories as $categoryid) {
    $category = Mage::getModel("catalog/category")->load($categoryid);
    $layer->setCurrentCategory($category);
    $attributes = $layer->getFilterableAttributes();

    foreach ($attributes as $attribute) {
        if ($attribute->getAttributeCode() == 'price') {
            $filterBlockName = 'catalog/layer_filter_price';
        } elseif ($attribute->getBackendType() == 'decimal') {
            $filterBlockName = 'catalog/layer_filter_decimal';
        } else {
            $filterBlockName = 'catalog/layer_filter_attribute';
        }

        $result = $this->getLayout()->createBlock($filterBlockName)->setLayer($layer)->setAttributeModel($attribute)->init();

        foreach($result->getItems() as $option) {
            echo $option->getLabel().'<br/>';
            echo $option->getValue();
        }
}

The only thing you'll need to do yourself is create the correct link using the getValue() functions.

This code has been tested in Magento 1.5