Товар (правило модели Mage SalesRule) с тем же идентификатором "5" уже существует


Я пытаюсь устранить эту ошибку, которая возникает всякий раз, когда вошедший в систему клиент добавляет код купона во время оформления заказа.

a:5:{i:0;s:67:"Item (Mage_SalesRule_Model_Rule) with the same id "5" already exist";i:1;s:1977:"#0 /var/www/vhosts/test.devcom/httpdocs/lib/Varien/Data/Collection/Db.php(576): Varien_Data_Collection->addItem(Object(Mage_SalesRule_Model_Rule))
#1 /var/www/vhosts/test.dev.com/httpdocs/app/code/core/Mage/SalesRule/Model/Validator.php(117): Varien_Data_Collection_Db->load()
#2 /var/www/vhosts/test.dev.com/httpdocs/app/code/core/Mage/SalesRule/Model/Quote/Freeshipping.php(60): Mage_SalesRule_Model_Validator->init('1', '1', 'INSTA20')
#3 /var/www/vhosts/test.dev.com/httpdocs/app/code/core/Mage/Sales/Model/Quote/Address.php(1013): Mage_SalesRule_Model_Quote_Freeshipping->collect(Object(Mage_Sales_Model_Quote_Address))
#4 /var/www/vhosts/test.dev.com/httpdocs/app/code/core/Mage/Sales/Model/Quote.php(1331): Mage_Sales_Model_Quote_Address->collectTotals()
#5 /var/www/vhosts/test.dev.com/httpdocs/app/code/core/Mage/Checkout/Model/Cart.php(458): Mage_Sales_Model_Quote->collectTotals()
#6 /var/www/vhosts/test.dev.com/httpdocs/app/code/core/Mage/Checkout/controllers/CartController.php(127): Mage_Checkout_Model_Cart->save()
#7 /var/www/vhosts/test.dev.com/httpdocs/app/code/core/Mage/Core/Controller/Varien/Action.php(418): Mage_Checkout_CartController->indexAction()
#8 /var/www/vhosts/test.dev.com/httpdocs/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('index')
#9 /var/www/vhosts/test.dev.com/httpdocs/app/code/core/Mage/Core/Controller/Varien/Front.php(172): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#10 /var/www/vhosts/test.dev.com/httpdocs/app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
#11 /var/www/vhosts/test.dev.com/httpdocs/app/Mage.php(683): Mage_Core_Model_App->run(Array)
#12 /var/www/vhosts/test.dev.com/httpdocs/index.php(87): Mage::run('', 'store')
#13 {main}";s:3:"url";s:15:"/checkout/cart/";s:11:"script_name";s:10:"/index.php";s:4:"skin";s:7:"default";}

Я не уверен, что вызывает ошибку, так как код купона работает при выезде в качестве гостя.

Кто-нибудь сталкивался с этой ошибкой раньше и знает, в чем может быть причина? Я был бы признателен за любую помощь, пожалуйста...

Author: user1704524, 2014-05-09

2 answers

Пожалуйста, сделайте резервную копию кода:

Перейти к файлу

Lib/Varien/Data/Collection.php

Измените этот метод

public function addItem

Со следующим кодом

public function addItem(Varien_Object $item)
    {
        $itemId = $this->_getItemId($item);
        if (!is_null($itemId)) {
            if (isset($this->_items[$itemId])) {
              //  throw new Exception('Item ('.get_class($item).') with the same id "'.$item->getId().'" already exist');
            } else {
                $this->_items[$itemId] = $item;
            }
        }
        else {
            $this->_items[] = $item;
        }
        return $this;
    } 
 4
Author: TBI Infotech, 2014-05-09 11:04:16

Вы также можете переопределить свою коллекцию calss Mage_Sales_Model_Resource_Order_Grid_Collection::addItem, которая выдает следующее исключение:

<?php
class Fixed_Order_Grid_Collection extends Mage_Sales_Model_Resource_Order_Grid_Collection{

    public function addItem(Varien_Object $item)
    {
        $itemId = $this->_getItemId($item);

        if (!is_null($itemId)) {
            if (isset($this->_items[$itemId])) {
                //throw new Exception('Item ('.get_class($item).') with the same id "'.$item->getId().'" already exist');
            }
            $this->_items[$itemId] = $item;
        } else {
            $this->_addItem($item);
        }
        return $this;
    }
}
class MyCompony_MyExtention_Block_Adminhtml_OrderGrid extends Mage_Adminhtml_Block_Widget_Grid
{
     public function __construct()
    {
        parent::__construct();
        $this->setId('sales_order_grid');
        $this->setUseAjax(true);
        $this->setDefaultSort('created_at');
        $this->setDefaultDir('DESC');
        $this->setSaveParametersInSession(true);
    }
    protected function _getCollectionClass()
    {
        return 'sales/order_grid_collection';
    }

    protected function _prepareCollection()
    {
        $collection = new Fixed_Order_Grid_Collection();
        $select = $collection->getSelect();
        $select->join('sales_flat_order_item AS order_item', 'order_item.order_id=main_table.entity_id','quote_item_id',NULL);
        $select->distinct();
        $this->setCollection($collection);
        return parent::_prepareCollection();
    }
...
 -1
Author: Sajjad Shirazy, 2015-04-15 07:05:38