我正在开发一个模块来列出部件配件并遇到产品收集问题,并出现以下错误:
具有相同ID“1150”的项目(Mage_Catalog_Model_Product)已存在
我的问题的独特之处在于我想要在产品系列中不止一次拥有该产品,因为我列出了适合特定机器的所有产品,而某些产品(轴承)将会适合不同地方的机器。
我正在将配件信息附加到集合中,以便每个产品都会显示它在机器上的位置并按照装配进行分类,但重要的是要为包含它的每个配件单独列出产品。
但是,Magento不喜欢这个,我也无法提出解决方案。我将错误追溯到lib \ Varien \ Data \ Collection.php
if (isset($this->_items[$itemId])) {
throw new Exception('Item ('.get_class($item).') with the same id "'.$item->getId().'" already exist');
}
从这里我看到使用id作为数组键将产品设置到数组中,所以我不确定是否有一种很好的方法可以避免在我的集合中多次使用产品。
编辑: 这是我的代码,按要求加载集合。它适用于大多数选择,所以我对代码获得正确的产品没有问题,而是某些选择导致同一产品在集合中多次列出,我想要发生,但是Magento不喜欢。
$layer = Mage::getSingleton('catalog/layer');
$layer->setCurrentCategory(3);
$collection = $layer->getProductCollection();
$atvvalues = $session->getData($name);
$atv_id = $db->select()
->from(array('fm'=>$collection->getTable('mcdfinder/vehicle')), 'id')
->where('fm.make = ? ', $atvvalues['make'])
->Where('fm.description = ?', $atvvalues['model'])
->Where('fm.year = ?', $atvvalues['year']);
$collection->getSelect()->join(array('mmy' => $collection->getTable('mcdfinder/product')), 'mmy.product_id=e.sku', array('mmy.*'))
->where('mmy.vehicle_id = ?', $atv_id);
$collection->getSelect()->join(array('atvcat' => $collection->getTable('mcdfinder/category')), 'atvcat.id=mmy.category_id', array('atvcat.*'));
$collection->getSelect()->order( array('atvcat.category_gparent', 'atvcat.category_parent', 'atvcat.category_name', 'e.sku') );
所以,我可能有一个带有'差异'的atvcat的产品BG1,还有一个带有'前轮'的atvcat的BG1,所以我需要它在有序集合的不同位置出现两次
答案 0 :(得分:0)
所以我通过覆盖本地文件夹中的lib \ Varien \ Data \ Collection.php来实现这一点。
我将问题中的第一个片段更改为:
if (isset($this->_items[$itemId])) {
$this->_items[] = $item;
//throw new Exception('Item ('.get_class($item).') with the same id "'.$item->getId().'" already exist');
}
这一行“$ this-> _items [] = $ item;”借用_addItem中的逻辑,其中没有id的项被添加到集合中(因为之前的问题是具有相同id的重复项之间的冲突)。
我很想知道为什么这是一个糟糕的解决方案(除了直接覆盖Varien)或者可能会导致问题,但到目前为止事情仍然很完美。