HY
在一页结账后,在Magento,我收到以下电子邮件错误消息 ... 付款交易失败。 原因 Mage注册表项" _singleton / model / observer"已经存在 结账类型 一页 ....
在管理页面上,当尝试删除此行为时,同样的错误,再次:
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)
..等等
这仅适用于包含多个商品的订单。
任何帮助都将受到赞赏,特别是因为该网站现已投入生产。
非常感谢
答案 0 :(得分:1)
这是一个奇怪的错误 - 我的猜测是你正在处理你的app/Mage.php
文件的“核心黑客”/ edut(可能是无意的)。
如果查看堆栈跟踪,Magento会调用
Mage::getSingleton('model/observer')
这是Magento的说法“实例化一个model/observer
对象,并使其成为一个单例实例”,如果你不熟悉它们,单例是一个只能实例化一次的“全局”对象。如果您尝试再次实例化单例,则会获得原始实例。
如果你看一下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
调用。但是,您还可以通过if (!self::registry($registryKey)) {
条件查看Magento 检查以确保注册表项不存在。
我猜是有人更改了getSingleton
文件中registry
或register
或app/Mage.php
的定义。在袜子Magento系统中,不应该收到您在此处发布的确切错误。
答案 1 :(得分:1)
让我在Alan的回答中添加一点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))
class:Mage_CatalogInventory_Model_Observer
model:cataloginventory / observer
方法: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('model / observer')时,它会从Alan的回答中调用getSingleton()函数。
2)注册表没有'_singleton / model / observer'所以它尝试注册它:
self::register($registryKey, self::getModel($modelClass, $arguments));
3)它调用self :: getModel('model / observer',array()))进行注册,此方法失败,因为你没有这样的模型。
同样,你的一个xml配置文件中有'model / observer'模型,但是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>
部分设置正确的值。