Отчеты Magento - Продукты - Продукты Заказанная проблема: Элемент (Mage_Catalog_Model_Product) с таким идентификатором уже существует - PullRequest
5 голосов
/ 25 декабря 2011

Проблема: в админ-панели Magento при создании отчета через Отчеты - Продукты - Заказанные продукты возникает ошибка:


    Item (Mage_Catalog_Model_Product) with the same id "45" already exist
    #0 /home/glassesm/public_html/app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php(236): Varien_Data_Collection->addItem(Object(Mage_Catalog_Model_Product))
    #1 /home/glassesm/public_html/app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php(964): Mage_Eav_Model_Entity_Collection_Abstract->addItem(Object(Mage_Catalog_Model_Product))
    #2 /home/glassesm/public_html/app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php(794): Mage_Eav_Model_Entity_Collection_Abstract->_loadEntities(false, false)
    #3 /home/glassesm/public_html/lib/Varien/Data/Collection.php(729): Mage_Eav_Model_Entity_Collection_Abstract->load()
    #4 /home/glassesm/public_html/app/code/core/Mage/Reports/Model/Totals.php(53): Varien_Data_Collection->getIterator()
    #5 /home/glassesm/public_html/app/code/core/Mage/Adminhtml/Block/Report/Grid.php(368): Mage_Reports_Model_Totals->countTotals(Object(Mage_Adminhtml_Block_Report_Product_Sold_Grid), '2011-12-10 00:0...', '2011-12-10 23:5...')
    #6 /home/glassesm/public_html/app/design/adminhtml/default/default/template/report/grid.phtml(138): Mage_Adminhtml_Block_Report_Grid->getReport('2011-12-10 00:0...', '2011-12-10 23:5...')
    #7 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Template.php(216): include('/home/glassesm/...')
    #8 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Template.php(247): Mage_Core_Block_Template->fetchView('adminhtml/defau...')
    #9 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Template.php(261): Mage_Core_Block_Template->renderView()
    #10 /home/glassesm/public_html/app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml()
    #11 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Abstract.php(758): Mage_Adminhtml_Block_Template->_toHtml()
    #12 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Abstract.php(525): Mage_Core_Block_Abstract->toHtml()
    #13 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Abstract.php(476): Mage_Core_Block_Abstract->_getChildHtml('grid', true)
    #14 /home/glassesm/public_html/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Container.php(70): Mage_Core_Block_Abstract->getChildHtml('grid')
    #15 /home/glassesm/public_html/app/design/adminhtml/default/default/template/widget/grid/container.phtml(36): Mage_Adminhtml_Block_Widget_Grid_Container->getGridHtml()
    #16 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Template.php(216): include('/home/glassesm/...')
    #17 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Template.php(247): Mage_Core_Block_Template->fetchView('adminhtml/defau...')
    #18 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Template.php(261): Mage_Core_Block_Template->renderView()
    #19 /home/glassesm/public_html/app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml()
    #20 /home/glassesm/public_html/app/code/core/Mage/Adminhtml/Block/Widget/Container.php(295): Mage_Adminhtml_Block_Template->_toHtml()
    #21 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Abstract.php(758): Mage_Adminhtml_Block_Widget_Container->_toHtml()
    #22 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Text/List.php(43): Mage_Core_Block_Abstract->toHtml()
    #23 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Abstract.php(758): Mage_Core_Block_Text_List->_toHtml()
    #24 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Abstract.php(525): Mage_Core_Block_Abstract->toHtml()
    #25 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Abstract.php(476): Mage_Core_Block_Abstract->_getChildHtml('content', true)
    #26 /home/glassesm/public_html/app/design/adminhtml/default/default/template/page.phtml(74): Mage_Core_Block_Abstract->getChildHtml('content')
    #27 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Template.php(216): include('/home/glassesm/...')
    #28 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Template.php(247): Mage_Core_Block_Template->fetchView('adminhtml/defau...')
    #29 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Template.php(261): Mage_Core_Block_Template->renderView()
    #30 /home/glassesm/public_html/app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml()
    #31 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Abstract.php(758): Mage_Adminhtml_Block_Template->_toHtml()
    #32 /home/glassesm/public_html/app/code/core/Mage/Core/Model/Layout.php(529): Mage_Core_Block_Abstract->toHtml()
    #33 /home/glassesm/public_html/app/code/core/Mage/Core/Controller/Varien/Action.php(389): Mage_Core_Model_Layout->getOutput()
    #34 /home/glassesm/public_html/app/code/core/Mage/Adminhtml/controllers/Report/ProductController.php(97): Mage_Core_Controller_Varien_Action->renderLayout()
    #35 /home/glassesm/public_html/app/code/core/Mage/Core/Controller/Varien/Action.php(418): Mage_Adminhtml_Report_ProductController->soldAction()
    #36 /home/glassesm/public_html/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(253): Mage_Core_Controller_Varien_Action->dispatch('sold')
    #37 /home/glassesm/public_html/app/code/core/Mage/Core/Controller/Varien/Front.php(176): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
    #38 /home/glassesm/public_html/app/code/core/Mage/Core/Model/App.php(340): Mage_Core_Controller_Varien_Front->dispatch()
    #39 /home/glassesm/public_html/app/Mage.php(627): Mage_Core_Model_App->run(Array)
    #40 /home/glassesm/public_html/index.php(80): Mage::run('', 'store')
    #41 {main}

Не могли бы вы помочь мне с этой проблемой?

Ответы [ 6 ]

6 голосов
/ 12 января 2012

На самом деле у меня есть 2 разных магазина на 2 разных серверах, и оба с magento 1.6.У меня есть эта проблема в обоих магазинах.Проверена база данных, и там нет двойных записей.

Мое решение было:

Изменить: /www/app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php
Строка: 256

Заменить: return parent::addItem($object);

С: try { return parent::addItem($object); } catch (Exception $ex) { }

Он отлично работает, но приветствуется любое другое решение.

4 голосов
/ 12 февраля 2015

это потому, что ваша коллекция продуктов возвращает повторяющиеся идентификаторы продуктов, вы можете сгруппировать свою коллекцию продуктов, сгруппировав 'e.entity_id'

попробовать это

$collection = Mage::getModel('catalog/product')
->getCollection()
->joinField('category_id', 'catalog/category_product', 'category_id', 'product_id = entity_id', null, 'left')
->addAttributeToSelect('*')
->addAttributeToFilter('category_id', array('in' => $uniqueIds));

<?php $collection->getSelect()->group('e.entity_id');?>
1 голос
/ 25 декабря 2011

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

Простым решением было бы найти продукт с идентификатором 35 и либо удалить его, поскольку он является дубликатом, либо изменить идентификатор, поскольку он должен быть уникальным.Обратите внимание, что вы должны искать все связанные таблицы, а не только таблицу продуктов.Проблема может быть связана с вашей таблицей атрибутов EAV или любым другим.

0 голосов
/ 06 декабря 2017

Получил ту же ошибку в том же месте, вот почему и как я это исправил.

Отчеты о заказанных продуктах Magento составляют «список» из «sales_flat_order_item», затем присоединяются к «каталогу / продукту» для получения дополнительной информациипродукт (sku, type, options, attribute_set и т. д.).

В моем случае 3 продукта были удалены из магазина, когда Magento сформировал список и включил в каталог / продукт всю информацию, которую яперечисленное выше было NULL.Когда модуль Report строит коллекцию, в методе addItem он пытается установить идентификатор в качестве ключа в массиве коллекции, в этих удаленных продуктах идентификатор отсутствует, поэтому устанавливается NULL.

Представьте себе этот набор элементовдля создания отчета.

ID - Имя: 1, 2, 3, УДАЛЕННЫЙ ПУНКТ, 4

Когда «УДАЛИТЬ ПУНКТ» добавляется в коллекцию, будет выглядеть так:

Array(
    1 => Object,
    2 => Object,
    3 => Object,
    4 => Object (DELETED ITEM)
)

Это связано с тем, что в addItem при отсутствии идентификатора Magento добавляется новая позиция в массив с автоматическим приращением:

if (!is_null($itemId)) {
    .
    .
    .
} else {
    $this->_items[] = $item;
}

Затем, когда в коллекцию добавляется следующий элемент (идентификатор:4) сгенерирует исключение, на которое вы смотрите:

if (isset($this->_items[$itemId])) {
    throw new Exception('Item ('.get_class($item).') with the same id "'.$item->getId().'" already exist');
}

Изменение работы addItem очень опасно !!Коллекции используются повсюду в Magento, добавление блока trycatch определенно повлияет на работу вашего магазина в других местах / модулях.Вот как я это исправил:

Вы можете скопировать на локальный или перезаписать с помощью пользовательского модуля, на ваше усмотрение:

Добавить новый метод в «Reports_Product / Collection» только для фильтрации »существующие продукты "

app / code / local / Mage / Reports / Model / Mysql4 / Product / Collection.php

public function addNotDeletedProductRestrition(){
    $this->getSelect()->where('order_items.product_id is NOT NULL');

    return $this;
}

Вызовите этот метод в коллекции ORDERED.

app / code / local / Mage / Reports / Model / Mysql4 / Product / Ordered / Collection.php

protected function _joinFields($from = '', $to = '')
{
    $this->addAttributeToSelect('*')
        ->addOrderedQty($from, $to)
        ->setOrder('ordered_qty', 'desc')
        ->addNotDeletedProductRestrition();

    return $this;
}

Я поместил в _joinFields, но вы можете звонить куда хотите.

Извините за мой ржавый английский, у меня не так много времени для обзора, эта ошибка уже заняла у меня много.

0 голосов
/ 15 апреля 2015

вы также можете переопределить коллекцию 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();
    }
...
0 голосов
/ 04 февраля 2012

Просто зайдите в админпанель, откройте продукт (первая строка показывает идентификатор) и сохраните его. Сделайте это во всех видах магазина. Теперь проблема должна исчезнуть.

...