0

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

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

我发现了这个Magento:如何将两个产品集合合并为一个?这似乎是我想要的,但我似乎无法弄清楚应该在哪里实施。

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

我尝试在 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'的最大函数嵌套级别,正在中止!”

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

4

1 回答 1

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);
于 2012-06-05T20:29:37.830 回答