Получил ту же ошибку в том же месте, вот почему и как я это исправил.
Отчеты о заказанных продуктах 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, но вы можете звонить куда хотите.
Извините за мой ржавый английский, у меня не так много времени для обзора, эта ошибка уже заняла у меня много.