【问题标题】:Magento Merge 2 Categories Into 1 CollectionMagento 将 2 个类别合并为 1 个集合
【发布时间】:2012-06-05 14:32:23
【问题描述】:

我有一个销售汽车零件的网站。我已经将我的类别设置为 Make -> Model -> Year,从这里过滤是通过属性完成的。刹车、车轮、发动机等……

这会按照我的预期过滤集合,但是一旦到了年,我还想包含通用类别中的项目。 IE。该集合应包括特定汽车的物品,以及所有汽车的“通用”物品。

我找到了这个Magento: how to merge two product collections into one?,这似乎是我想要的,但我似乎无法弄清楚应该在哪里实现它。

List.php、Layer.php 和 Category.php 中有 getCollection() 方法,我尝试实现上面链接中的代码,但没有成功。如果我将它包含在 List.php 中,则集合似乎已合并,但属性过滤不适用于 Universal 产品。

我尝试在 Category.php 中编辑 getProductCollection 函数,如下所示:

public function getProductCollection()
{
    $collection = Mage::getResourceModel('catalog/product_collection')
        ->setStoreId($this->getStoreId())
        ->addCategoryFilter($this);
    //return $collection;

    $universalCollection = Mage::getModel('catalog/category')->load(18)->getProductCollection();

    $merged_ids = array_merge($collection->getAllIds(), $universalCollection->getAllIds());
    // can sometimes use "getLoadedIds()" as well

    $merged_collection = Mage::getResourceModel('catalog/product_collection')
        ->addFieldToFilter('entity_id', $merged_ids)
        ->addAttributeToSelect('*');

    return $merged_collection;
} 

但这给了我:“致命错误:达到'200'的最大函数嵌套级别,正在中止!”

如果有人可以提供任何建议,将不胜感激。

【问题讨论】:

    标签: magento


    【解决方案1】:

    您遇到了致命错误,因为您正在导致发生无限循环。

    这仅仅是因为您的代码位于 Category 模型的 getProductCollection() 方法中,并且您再次在新的类别模型上调用 getProductCollection()。这会导致无限循环

    因此,您需要将该代码移出那里。 你真的不应该像现在这样编辑这些核心文件。

    如何扩展模型完全取决于您:重写、观察者等。但不要更改 Magento 核心代码。

    我在下面提供了一个工作示例,它在类别模型外部合并了两个类别产品集合:

        $storeId = Mage::app()->getStore()->getId();
        $categoryOneId = 10;
        $categoryTwoId = 13;
    
        $categoryOne = Mage::getModel('catalog/category')->load($categoryOneId);
        $categoryTwo = Mage::getModel('catalog/category')->load($categoryTwoId);
    
        $collectionOne = Mage::getModel('catalog/product')->getCollection()
            ->setStoreId($storeId)
            ->addCategoryFilter($categoryOne);
    
        $collectionTwo = Mage::getModel('catalog/product')->getCollection()
            ->setStoreId($storeId)
            ->addCategoryFilter($categoryTwo);
    
        $merged_ids = array_merge($collectionOne->getAllIds(), $collectionTwo->getAllIds());
    
        $mergedCollection = Mage::getModel('catalog/product')->getCollection()
            ->addFieldToFilter('entity_id', $merged_ids);
    

    【讨论】:

    • 谢谢 Drew,我知道我不应该编辑核心文件。计划是让它以某种形式工作,然后再适当地做。这是否会发生是另一回事...大声笑...感谢您的所有帮助,我相信我可以从中弄清楚。
    • 嗨 Drew,当我使用此代码时,我的属性过滤器似乎不起作用。我得到了一大堆没有名称、成本为 0.00 且缺货的物品,然后是与过滤器相关的物品。有什么想法吗?
    • @JohnCondron - 尝试在合并后的集合上使用 addAttributeToSelect 以及您所需的属性或 * 即 addAttributeToSelect(array('price', 'name')) 或 addAttributeToSelect('*') 等跨度>
    猜你喜欢
    • 2016-05-29
    • 1970-01-01
    • 2013-11-05
    • 2012-01-12
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多