2013-01-04 108 views
1

我有一个Magento网站,有一个广泛的目录(10,000个产品)和一个相当深的类别树。按产品属性过滤Magento类别集合?

该产品的所有类别均源自顶级“所有产品”类别。
所有产品的下拉属性均为“品牌”。

我想要做的是允许访问者从类别树顶部开始,然后导航到“所有产品”树,选择或不选择品牌。顺便提一句,我们需要显示每个级别的子类别的下一级别,如果品牌不适用,我不想显示空的类别。

例如,如果树看起来像这样,一个在“螺丝刀页面”上,我们希望类型和长度类别都可见。

  1. 所有产品
    • 起子
      • 菲利普斯
        • 2"
        • 3"
        • 5"
      • 平头
        • 1"
        • 3"
        • 5"

我能做到这一点没有通过创建一个类集合担心滤清器品牌:

$_category = $this->getCurrentCategory(); 
    $current_level = $_category->getLevel(); 
    $collection = $_category->getCollection(); 

    $collection->addAttributeToSelect('url_key') 
       ->addAttributeToSelect('name') 
       ->addAttributeToSelect('parent_id') 
       ->addAttributeToFilter('is_active', 1) 
       ->addAttributeToFilter('level',array('in'=>array($current_level+1,$current_level+2))) 
       ->setOrder('position','ASC') 
       ->load(); 

根据我的研究,它似乎是而不是可能通过产品属性直接筛选类别集合。

假设这是真的: 完成此操作的最佳方法是什么?我想过的,初步尝试了一些想法:

  • 创建产品收集通过它的品牌和循环过滤,得到所有相关类别和构建树(看起来这是很没效率)
  • 尝试利用分层导航输出类别(如果我们仅查看一个级别,则无法工作 - 我无法获得过滤的“第二”级别)。
  • 放弃过滤方法并复制类别树下新的“浏览品牌”类别(我想远离这一点,以便更新产品不需要更新两个重复的树。)

在此先感谢您的帮助。如果您需要澄清问题,请告诉我。

回答

5

如果任何人有类似的问题,我通过使用上面的第二个项目符号完成了这一点。

/* Get Current Filters by loading catalog/layer_view Block */ 
     $layout = Mage::getSingleton('core/layout'); 
     $block = $layout->createBlock('catalog/layer_view');   
/* Get Current Category */ 
     $_category = $this->getCurrentCategory(); 
     $current_level = $_category->getLevel(); 
/* Get Layer Filter Category Model */ 
     $category_filter = Mage::getModel('catalog/layer_filter_category'); 
/* Generate the collection based on the current category */ 
     $categories = $_category->getCollection(); 
     $categories->addAttributeToSelect('url_key') 
        ->addAttributeToSelect('name') 
        ->addAttributeToSelect('parent_id') 
        ->addAttributeToSelect('thumbnail') 
        ->addAttributeToFilter('is_active', 1) 
        ->addAttributeToFilter('path', array('like'=>'%/'.$_category->getId().'/%')) 
        ->addAttributeToFilter('level',array('in'=>array($current_level+1,$current_level+2))) 
        ->setOrder('position','ASC') 
        ->load(); 

/* Using current filters, add product counts to collection so we can hide categories with 0 products */ 
     $category_filter->getLayer()->getProductCollection() 
      ->addCountToCategories($categories); 

此之后,它是通过收集和循环显示的名称,类别的URL,等等的问题..

这可能不是绝对的最佳方式 - 我当然欢迎其他解决方案。

+1

如何根据属性过滤器获取结果 –

相关问题