我正在处理现有的magento页面。登录用户可以更改其个人资料信息(名字,姓氏,电子邮件等),他们可以更改其帐单和送货地址。
我需要做的是每当客户更改基本信息或其中一个地址时发送通知电子邮件。我为两个事件创建了一个观察者:
<frontend>
<events>
<customer_save_after>
<observers>
<ext_customer_save_after>
<type>singleton</type>
<class>ext/observer</class>
<method>customerSaveAfter</method>
</ext_customer_save_after>
</observers>
</customer_save_after>
<customer_address_save_after>
<observers>
<ext_customer_save_after>
<type>singleton</type>
<class>ext/observer</class>
<method>customerAddressSaveAfter</method>
</ext_customer_save_after>
</observers>
</customer_address_save_after>
</events>
</frontend>
在customerSave中发送电子邮件后,在customerAddressSaveAfter中检查当前ID是否与defaultbillingaddress或defaultshipping地址相同,并相应地发送通知。这工作正常,直到用户检查&#34;设置为默认送货地址&#34;复选框。在这种情况下,我突然收到5封电子邮件:
因此,突然多次触发事件并且customer_address_save_after以某种方式触发customer_save_after事件。有没有办法防止这种情况或检查哪个事件触发了另一个事件或类似的事件?还是有其他方法来处理这个问题?
我非常感谢任何提示,非常感谢你。
答案 0 :(得分:0)
我无法真正解决问题,使用mage_registry我alawys出错了所以我决定采用完全不同的方法。
在我的扩展中,我移除了观察者,而是创建了2个新的控制器,AccountController和AddressController,以覆盖Magentos标准控制器以处理客户和地址保存。
在我的config.xml中,我添加了这个:
<frontend>
<routers>
<customer>
<args>
<modules>
<my_ext before="Mage_Customer_AccountController">My_Ext</my_ext>
<my_ext before="Mage_Customer_AddressController">My_Ext</my_ext>
</modules>
</args>
</customer>
</routers>
</frontend>
例如,我的AccountController看起来像这样:
<?php
require_once Mage::getModuleDir('controllers','Mage_Customer').DS."AccountController.php";
class My_Ext_AccountController extends Mage_Customer_AccountController{
public function editPostAction(){
//I copied the code from the Magento AccountController here and at the proper line I added my own code
}
}
我的AddressController也一样。这非常好用。
感谢大家的帮助。