質問

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

元のデータをチェックして電話をかけて顧客が新しいかどうかを検出しようとしました isObjectNew, 、しかし、オブジェクトが実際には新しいものではないことを示唆する両方の返品データ。顧客がcustomer_save_afterイベントに登録しているかどうかを確認するにはどうすればよいですか? 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);
   }
}

メソッドが初めて呼ばれるときはキーを登録します。つまり、もう2回目のトリガーがもう空でなく、メソッドは開始時に戻ります。

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

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

$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帰属
所属していません magento.stackexchange
scroll top