Question

J'ai des événements que je veux exécuter quand un registre des clients ou enregistre leurs détails. Pour cela, je me sers de deux événements: customer_register_success et customer_save_after. Le problème que j'ai est que je finis par exécution de la tâche deux fois plus customer_save_after est toujours appelé dans la même exécution que customer_register_success.

J'ai essayé de détecter si le client est nouveau en vérifiant les données d'origine et appelé isObjectNew, mais les deux données de retour qui implique l'objet est en fait pas nouveau. Comment puis-je vérifier si le client est juste enregistrait à court de mettre événement customer_save_after quelque chose dans le registre en cas de customer_register_success?

Était-ce utile?

La solution

Tout d'abord, vous pouvez définir votre observateur singleton pour les deux événements

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

Dans ce cas, le même objet d'observateur sera utilisé pour les deux événements. Ainsi, vous pouvez créer votre drapeau dans l'observateur et avant de faire des actions vérifier.

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

Maintenant, votre code sera exécuté qu'une seule fois.

Autres conseils

meilleure façon de prévenir est d'utiliser une valeur de Registre. Votre méthode d'observation ressemblerait à quelque chose comme ce qui suit

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

La première fois que la méthode est appelée il registeres une clé, ce qui signifie que la deuxième fois qu'il est déclenché ce n'est pas plus vide et la méthode retourne au début

Une autre approche consiste à vérifier le contrôleur et l'action a déclenché l'événement.

Dans l'observateur, vous pouvez obtenir le module, le contrôleur et le nom action.

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

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

Et vérifier plus tard dans votre méthode qui est l'envoi de l'événement.

Dans un stock magento installer, lors de la création d'un utilisateur à partir de la zone utilisateur la valeur de myURI $ serait customer_account_createpost.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top