当客户注册或保存他们的详细信息时,我希望执行我希望执行的活动。为此,我使用两个事件:customer_register_success和customer_save_after。我遇到的问题是,我最终完成了两次任务,因为customer_save_after总是以与 customer_register_success.

我试图通过检查原始数据并调用来检测客户是否是新的 isObjectNew, ,但两者都返回暗示对象的数据实际上并不是新的。我如何检查客户是否仅在Customer_save_fter事件中注册,而在注册表中设置某些内容 customer_register_success 事件?

有帮助吗?

解决方案

首先,您可以将观察者定义为这两个事件的单身人士

<global>
    <events>
        <customer_save_after>
            <observers>
                <namespace_module>
                    <type>singleton</type>
                    <class>namespace_module/observer</class>
                    <method>doSomething</method>
                </namespace_module>
            </observers>
        </customer_save_after>
        <customer_register_success>
            <observers>
                <namespace_module>
                    <type>singleton</type>
                    <class>namespace_module/observer</class>
                    <method>doSomething</method>
                </namespace_module>
            </observers>
        </customer_register_success>
    </events>
</global>

在这种情况下,两个事件都将使用相同的观察者对象。因此,您可以在观察者中创建标志,然后再进行一些操作检查。

class [Namespace]_[Module]_Model_Observer
{
    protected $canDoSomething = false;

    public function doSomething($observer)
    {
        if (!$this->canDoSomething) {

            //here your code

            //now set flag to true to prevent executing your code twice 
            $this->canDoSomething = true;
        }
    }
}

现在,您的代码仅执行一次。

其他提示

防止这种情况的最简单方法是使用注册表值。您的观察者方法看起来像以下内容

class [Namespace]_[Module]_Model_Observer
{
   public function triggeredObserver($observer)
   {
      if (!empty(Mage::registry('[module]_istriggered')) return $this;

      // here you can perform whatever you want to do with your code

      Mage::register('[module]_istriggered', 1);
   }
}

该方法第一次称其为注册键,这意味着第二次触发它不再空了,该方法将在开始时返回

另一种方法是检查哪个控制器和操作触发了事件。

在观察者中,您可以获取模块,控制器和操作名称。

$frontName = Mage::app()->getRequest()->getRouteName();
$controllerName = Mage::app()->getRequest()->getControllerName();
$actionName = Mage::app()->getRequest()->getActionName();

$myURI = $frontName . '_'. $controllerName . '_' . $actionName;

然后检查您正在派遣活动的方法。

在库存Magento安装中,从用户区域创建用户时,$ myuri的值将为 customer_account_createpost.

许可以下: CC-BY-SA归因
scroll top