【问题标题】:Filter a Magento Category Collection by a Product Attribute?按产品属性过滤 Magento 类别集合?
【发布时间】:2013-01-04 05:31:02
【问题描述】:

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

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

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

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

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

根据我的研究,不可能直接按产品属性过滤类别集合。

假设这是真的: 最好的方法是什么?我已经想到并初步尝试了几个想法:

  • 创建一个按品牌过滤的产品集合并循环遍历它以获取所有相关类别并构建树(看起来效率极低)
  • 尝试利用分层导航来输出类别(如果我们只查看一个级别,这将起作用 - 我无法获得过滤后的“第二个”级别。)
  • 放弃过滤想法,在新的“按品牌浏览”类别下复制类别树(我想远离这种情况,以便更新产品不需要更新两个重复的树。)

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

【问题讨论】:

    标签: magento


    【解决方案1】:

    如果有人在路上遇到类似的问题,我通过使用上面的第二个要点来实现这一点。

    /* 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 等问题。

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

    【讨论】:

    • 如何根据属性过滤得到结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 2014-09-19
    • 2012-03-05
    • 1970-01-01
    相关资源
    最近更新 更多