2014-12-13 2 views
0

HyMagento Ошибки при попытке сделать заказ/отменить заказ, который имеет более чем один элемент

После OnePage проверки, в Magento, я получил сообщение об ошибке следующего адреса электронной ... сделки оплаты не удалась. Причина Mage ключ реестра "_singleton/модель/наблюдатель" уже существует заказ Тип OnePage ....

А на странице администратора, при попытке удалить этот oreder, та же ошибка, опять-таки:

There has been an error processing your request 

Mage registry key "_singleton/model/observer" already exists 

Trace: 
#0 /app/Mage.php(223): Mage::throwException('Mage registry k...') 
#1 /app/Mage.php(478): Mage::register('_singleton/mode...', false) 
#2 /app/code/core/Mage/Core/Model/App.php(1316): Mage::getSingleton('model/observer') 
#3 /app/Mage.php(448): Mage_Core_Model_App->dispatchEvent('cataloginventor...', Array) 
#4 /app/code/core/Mage/Core/Model/Abstract.php(466): Mage::dispatchEvent('cataloginventor...', Array) 
#5 /app/code/core/Mage/CatalogInventory/Model/Stock/Item.php(787): Mage_Core_Model_Abstract->_afterSave() 
#6 /app/code/core/Mage/Core/Model/Abstract.php(319): Mage_CatalogInventory_Model_Stock_Item->_afterSave() 
#7 l/app/code/core/Mage/CatalogInventory/Model/Stock.php(210): Mage_Core_Model_Abstract->save() 
#8 /app/code/core/Mage/CatalogInventory/Model/Observer.php(809): Mage_CatalogInventory_Model_Stock->backItemQty('542', 1) 
#9 /app/code/core/Mage/Core/Model/App.php(1338): Mage_CatalogInventory_Model_Observer->cancelOrderItem(Object(Varien_Event_Observer)) 
#10 /app/code/core/Mage/Core/Model/App.php(1317): Mage_Core_Model_App->_callObserverMethod(Object(Mage_CatalogInventory_Model_Observer), 'cancelOrderItem', Object(Varien_Event_Observer)) 
#11 /app/Mage.php(448): Mage_Core_Model_App->dispatchEvent('sales_order_ite...', Array) 

..и так далее

Это happends только к заказам, которые имеют более чем один элемент.

Любая помощь будет оценена, особенно потому, что сайт сейчас находится в стадии производства.

Большое спасибо

ответ

1

Позвольте мне добавить немного Magento 'анатомии' в ответ Алана:

Из протокола ошибок:

#10 /app/code/core/Mage/Core/Model/App.php(1317): `Mage_Core_Model_App->_callObserverMethod(Object(Mage_CatalogInventory_Model_Observer), 'cancelOrderItem', Object(Varien_Event_Observer)) 

класс: Mage_CatalogInventory_Model_Observer

модель: cataloginventory/наблюдателя

метод: cancelOrderItem

Это значит, что # 2 должно быть:

#2 /app/code/core/Mage/Core/Model/App.php(1316): Mage::getSingleton('cataloginventory/observer') 

Но у вас есть:

#2 /app/code/core/Mage/Core/Model/App.php(1316): Mage::getSingleton('model/observer') 

Почему это не удалось:

1) при Magento попытке выполнить Mage :: getSingleton ('модель/observer '), он вызывает функцию getSingleton() из ответа Алана.

2) реестра не '_singleton/модель/наблюдателя' поэтому пытаются зарегистрировать:

self::register($registryKey, self::getModel($modelClass, $arguments)); 

3) его называют само :: getModel ('модель/наблюдателя, массив())) для регистрации, и этот метод терпит неудачу, потому что у вас нет такой модели.

Опять же, у вас есть модель «модель/наблюдатель» в одном из ваших конфигурационных файлов xml, но Magento не может найти физический файл с этой моделью.

Что делать? Это происходит на мероприятии 'sales_order_item_cancel', поэтому попробуйте найти эту строку в файлах config.xml в сторонних папках.

Если в одном из config.xml вы найдете что-то вроде:

... 
    <events> 
    ... 
    <sales_order_item_cancel> 
     <observers> 
      <inventory> 
       <class>model/observer</class> 
       <method>cancelOrderItem</method> 
      </inventory> 
     </observers> 
    </sales_order_item_cancel> 
    ... 
    </events> 
... 

Просто комментарий <sales_order_item_cancel> раздел. Если вы хотите заставить его работать, установите правильное значение в разделе <class>model/observer</class>.

+0

Yap .. вот и все ... Я установил расширение «Low Qty Notification», которое мешало процессу по умолчанию. Бесконечно благодарен. – Andrei

+0

, пожалуйста, примите ответ, если он решит вашу проблему – WonderLand

1

Это любопытная ошибка - моя догадка вы имеете дело с «ядро-хак»/edut (возможно, непреднамеренно) вашего файла app/Mage.php.

Если вы посмотрите на ваш трассировки стека, Magento называет

Mage::getSingleton('model/observer') 

Это способы Magento сказать «Инстанцировать на model/observer объект, и сделать его одноэлементно экземпляр», если вы не знакомы с ними, singletons - это «глобальный» объект, который может быть создан только один раз. Если вы попытаетесь создать экземпляр синглтона снова, вы получите исходный экземпляр.

Если посмотреть на реализацию getSingleton

#File: app/Mage.php 
public static function getSingleton($modelClass='', array $arguments=array()) 
{ 
    $registryKey = '_singleton/'.$modelClass; 
    if (!self::registry($registryKey)) { 
     self::register($registryKey, self::getModel($modelClass, $arguments)); 
    } 
    return self::registry($registryKey); 
} 

Вы можете увидеть вызов self::registry из вашей трассировки стека, который вызывает ошибку. Однако вы также можете увидеть, что Magento проверяет, не существует ли ключа реестра через if (!self::registry($registryKey)) { условный.

Я думаю, кто-то изменил определение getSingleton, или registry или register в вашем app/Mage.php файле. В системе носков Magento не должно быть возможности получить точную ошибку, которую вы разместили здесь.

+0

Hello Allen. Спасибо за ваш ответ, но, к сожалению, это не решение моей проблемы. Я дважды проверил метод ** getSingleton **, и все в порядке. У меня все еще не хватает идей, поэтому, если у вас есть другое решение, пожалуйста, поделитесь. Спасибо – Andrei

+0

@ user2110973 Надеюсь, это не оскорбительно, но вы не проверили, что все в порядке. В приведенном выше коде проверяется, есть ли что-то в реестре, прежде чем добавлять его, чтобы избежать ошибки. Ваша система пропускает эту проверку по неизвестным причинам. Изложите это, и вы решите свою проблему. –

Смежные вопросы