【问题标题】:Magento Customer Save EventsMagento 客户保存事件
【发布时间】:2015-09-25 11:48:33
【问题描述】:

我正在处理现有的 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>

在 customerSaveAfter 中我发送一封电子邮件,在 customerAddressSaveAfter 中我检查当前 ID 是否与 defaultbillingaddress 或 defaultshipping address 相同,并相应地发送通知。这工作正常,直到用户选中“设置为默认送货地址”复选框。在这种情况下,我突然收到 5 封邮件:

  • 帐单邮寄地址已更改
  • 收货地址已更改
  • 收货地址已更改
  • 帐单地址已更改
  • 客户信息已更改

所以,突然事件被触发了多次,customer_address_save_after 以某种方式触发了 customer_save_after 事件。有没有办法防止这种情况或检查哪个事件触发了另一个事件或类似的事情?或者有其他方法可以解决这个问题吗?

非常感谢您的任何提示,非常感谢。

【问题讨论】:

  • 您收到 5 封邮件,可能是因为 - 每当客户更改任何数据(包括地址、基本个人资料等)时,都会触发 customer_save_after 事件。而您的第二个 customer_address_save_after 事件专门在地址更改时触发。
  • 但如果客户编辑地址,我只会收到一封电子邮件。 customer_save_event 仅在选中复选框时触发
  • 好的,所以这可能与您的问题有关,可以帮助您stackoverflow.com/questions/5838346/…
  • 非常感谢。我最终采用了不同的方法,但您的链接仍然对我有所帮助。

标签: php magento events


【解决方案1】:

我无法真正解决问题,使用 mage_registry 我一直遇到错误,所以我决定采用完全不同的方法。

在我的扩展中,我删除了观察者,而是创建了 2 个新控制器,AccountController 和 AddressController,以覆盖 Magento 标准控制器以处理客户和地址保存。

在我的 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 也是如此。这非常有效。

感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 2019-10-20
    • 1970-01-01
    • 2013-05-02
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多