customer_save_afterの新規顧客かどうかを判別


9

顧客が詳細を登録または保存したときに実行したいイベントがあります。このため、customer_register_successとcustomer_save_afterの2つのイベントを使用しています。私が抱えている問題は、customer_save_afterが常にと同じ実行で呼び出されるため、タスクが2回実行されることcustomer_register_successです。

元のデータを確認してを呼び出すことisObjectNewで、顧客が新しいかどうかを検出しようとしましたが、どちらもオブジェクトが実際には新しいものではないことを示すデータを返します。イベントのレジストリに何かを設定する前に、customer_save_afterイベントに顧客が登録しているかどうかを確認するにはどうすればよいcustomer_register_successですか?

回答:


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

これで、コードは1回だけ実行されます。


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

メソッドが最初に呼び出されると、キーが登録されます。つまり、2回目にトリガーされると、キーは空ではなくなり、メソッドは最初に戻ります。


そう私はこのことについて考えたが、それはかなり汚い:(を感じていた私は、オブジェクトがちょうどmodel_save_afterイベントで作成されている場合、私は見つけることができないことに驚いています。
マシュー・ハワースを

データがまだ保存されていない限り、私が知る限り、beforeイベントだけがisObjectNewデータを持っています。限り汚れが行くように、私はもっとエレガントな方法が存在することになると思いますが、それは確かではないハック
サンダーMangel

$customer->save(); $this->_dispatchRegisterSuccess($customer);残念ながら、ここでは、登録イベントがトリガーされる前に顧客が保存されているため、オブザーバーメソッドは機能しません:(
Matthew Haworth

0

別のアプローチは、イベントをトリガーしたコントローラーとアクションを確認することです。

オブザーバーでは、モジュール、コントローラー、アクション名を取得できます。

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

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

そして、後でイベントをディスパッチするメソッドをチェックインします。

ストックmagentoインストールでは、ユーザー領域からユーザーを作成するときに$ myURIの値はになりますcustomer_account_createpost

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.