我有一个销售汽车零件的网站。我已将我的类别设置为Make - >型号 - >年,从这里过滤由属性完成。制动器,车轮,发动机等......
这会像我期望的那样过滤收藏品,但是一旦我到了这一年,我想要包括通用类别中的项目。 I.E.该系列应包括特定车型的物品,以及所有车辆的“通用”物品。
我发现这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'的最大功能嵌套级别,正在中止!”
如果有人能提出任何建议,我们将不胜感激。
答案 0 :(得分: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);