我知道有很多帖子都有这个问题,但我猜他们每个都有不同的根源(至少从我检查的内容 - 没有帮助我)。
我试图在点击用户的按钮时触发该事件,但我在浏览器警报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');
}
}
该按钮应该触发甚至检查/保存订单,因此该事件应该是正确的。
有什么建议吗?
答案 0 :(得分: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也将无法实现(并且在通过一些步骤触发你的观察者之前更容易测试它)。
答案 1 :(得分: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”/“观察者”,因为未配置“my_module”类组节点,因此结果相同。这个样本的正确用法是“mymodule / observer”。
因此,如果您遇到此错误,请重新读取您的config.xml。
答案 2 :(得分:0)
确保config.xml models部分包含
<!-- 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>
否则您将无法制作新的模型实例。