确定客户是否是新的customer_save_after
-
22-10-2019 - |
题
当客户注册或保存他们的详细信息时,我希望执行我希望执行的活动。为此,我使用两个事件: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
.