Magento在尝试订购/取消包含多个商品的订单时出错

时间:2014-12-13 14:39:34

标签: magento

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)

..等等

这仅适用于包含多个商品的订单。

任何帮助都将受到赞赏,特别是因为该网站现已投入生产。

非常感谢

2 个答案:

答案 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文件中registryregisterapp/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>部分设置正确的值。