1

我知道有很多关于这个问题的帖子,但我猜每个帖子都有不同的根源(至少从我检查的内容来看 - 没有任何帮助)。

我试图在单击用户的按钮时触发事件,但我在浏览器警报中得到了上面提到的异常Mage registry key "_singleton/" already exists

config.xml 的一部分:

.....
     <models>
        <packagecustomernumber>
            <class>Package_CustomerNumber_Model</class>
        </packagecustomernumber>
    </models>

</global>
<frontend>
        <events>
            <checkout_type_onepage_save_order>
                <observers>
                    <type>singleton</type>
                    <class>packageName/customernumber/observer</class>
                    <method>setCustomerNumber</method>
                </observers>
            </checkout_type_onepage_save_order>
        </events>
    </frontend>

和班级本身:

class Package_CustomerNumber_Model_Observer
{
    public function setCutomerNumber($observer)
    {
        die('setCutomerNumber');
    }
}

即使它检查/保存订单也应该触发的按钮,因此事件应该是正确的。

有什么建议么 ?

4

3 回答 3

8

首先跳出来的是这个

<class>packageName/customernumber/observer</class>

那是无效的。这是您告诉 Magento 为您的观察者使用什么类的节点。因此,<class/>节点应该是观察者的完整 PHP 类名

<class>Package_CustomerNumber_Model_Observer</class>

或模型的类别名

<class>packagecustomernumber/observer</class>

此外,在运行你的观察者之前,它有助于确保你可以实例化你的模型类。尝试在 Magento 加载的环境中运行以下代码(脚本、控制器操作、phtml模板等)

$model = new Package_CustomerNumber_Model_Observer;
var_dump(get_class($model));

$model = Mage::getModel('packagecustomernumber/observer');
var_dump(get_class($model));

如果你不能实例化这个类,那么 Magento 也不能(而且在运行一些步骤来触发你的观察者之前先测试它会更容易)。

于 2013-10-02T17:14:22.913 回答
2

是的,“packageName/customernumber/observer”是问题的根源。

虽然此类引用的结构完全不正确,但当您的类引用与您的 global/models/modulename 定义不匹配时,问题实际上就出现了。即使参考“看起来”正确。

配置:

<config>
<global>
    <models>
        <mymodule>
            <class>My_Module_Model</class>
        </mymodule>
    </models>
    <events>
        <some_event_tag>
            <observers>
                <my_event_observer_method>
                    <class>my_module/observer</class>
                    <method>myEventObserverMethod</method>
                </my_event_observer_method>
            </observers>
        </some_event_tag>
    </events>
</global>
</config>

将具有相同的结果,因为未找到“my_module/observer”,因为未配置“my_module”类组节点。此示例的正确用法是“mymodule/observer”。

因此,如果您遇到此错误,请重新阅读您的 config.xml。

于 2013-11-25T19:00:40.077 回答
0

确保您的 config.xml 模型部分包含

        <!-- This says that string 'company_module' corresponds to Company_Module_Model pseudo-namespace in getModel() and getSingleton() calls. -->
        <company_module>
            <class>Company_Module_Model</class>
        </company_module>

否则你将无法创建新的模型实例。

于 2017-10-04T09:18:26.020 回答