确定customer_save_after中的顾客是否是新来的


9

我有希望在客户注册或保存他们的详细信息时执行的事件。为此,我正在使用两个事件:customer_register_success和customer_save_after。我遇到的问题是我最终两次运行该任务,因为customer_save_after总是在与相同的执行中被调用customer_register_success

我试图通过检查原始数据并调用来检测客户是否是新客户isObjectNew,但两者均返回暗示该对象实际上不是新客户的数据。我如何检查客户是否只是在customer_save_after事件中注册,而没有在customer_register_success事件中在注册表中进行设置?

Answers:


5

首先,您可以将两个事件的观察者定义为单例

<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;
        }
    }
}

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


0

防止这种情况的最简单方法是使用注册表值。您的观察者方法如下所示

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);
   }
}

第一次调用该方法时,它会注册一个密钥,这意味着第二次触发该方法时,它不再为空,并且该方法将在开始时返回


是的,我曾经考虑过,但是感觉很脏:(。很奇怪,我无法找出是否在model_save_after事件中刚刚创建了一个对象
Matthew Haworth

据我所知,只有一个before事件具有该isObjectNew数据,因为该数据尚未保存。就肮脏而言,我想会有更多优雅的方法,但这当然不是hack
Sander Mangel

$customer->save(); $this->_dispatchRegisterSuccess($customer);不幸的是,这里的客户在触发注册事件之前就已经保存了,因此观察者方法还是行不通的:(
Matthew Haworth 2014年

0

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

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

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

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

然后,检查您的方法是谁调度事件。

在stock magento安装中,从用户区域创建用户时,$ myURI的值为customer_account_createpost

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.