按产品属性过滤Magento类别集合?

时间:2013-01-04 05:31:03

标签: magento

我有一个Magento网站,其中包含大量目录(10,000个产品)和一个相当深的类别树。

所有产品类别均来自顶级“所有产品”类别 所有产品都有“品牌”的下拉属性。

我要做的是允许访问者从类别树的顶部开始,然后在“所有产品”树中向下导航,无论是否选择了品牌。问题在于我们需要在每个级别显示下一级子类别,如果品牌不适用,我不想显示空白类别。

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

  1. 所有产品
    • 螺丝刀
      • 十字
        • 2"
        • 3"
        • 5"
      • 平头
        • 1"
        • 3"
        • 5"
  2. 通过创建类别集合,我能够在没有担心品牌过滤器的情况下执行此操作

        $_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();
    

    根据我的研究,似乎可以通过产品属性直接过滤类别集合。

    假设这是真的: 实现这一目标的最佳方法是什么?我已经想到并初步尝试了一些想法:

    • 创建一个按品牌过滤的产品系列并循环浏览它以获取所有相关类别并构建树(看起来这样效率非常低)
    • 尝试利用分层导航输出类别(如果我们只查看一个级别,这将有效 - 我无法获得过滤的“第二”级别。)
    • 放弃过滤理念并在新的“按品牌浏览”类别下复制类别树(我希望远离此类,以便更新产品不需要更新两个重复的树。)

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

1 个答案:

答案 0 :(得分: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等等。

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