Déterminer si le client est nouveau dans customer_save_after

9

J'ai des événements que je souhaite exécuter lorsqu'un client s'inscrit ou enregistre ses coordonnées. Pour cela, j'utilise deux événements: customer_register_success et customer_save_after. Le problème que j'ai est que je finis par exécuter la tâche deux fois car 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 retournent des données qui impliquent que l'objet n'est en fait pas nouveau. Comment puis-je vérifier si le client s'enregistre simplement dans l'événement customer_save_after avant de définir quelque chose dans le registre de l' customer_register_successévénement?

Matthew Haworth
la source

Réponses:

5

Tout d'abord, vous pouvez définir votre observateur comme 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 observateur sera utilisé pour les deux événements. Vous pouvez donc créer un drapeau dans votre observateur et avant de faire quelques actions, vérifiez-le.

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 ne sera exécuté qu'une seule fois.

oleksii.svarychevskyi
la source
0

Le moyen le plus simple d'empêcher cela est d'utiliser une valeur de registre. Votre méthode d'observation ressemblerait à ceci:

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, elle enregistre une clé, ce qui signifie que la deuxième fois qu'elle est déclenchée, elle n'est plus vide et la méthode reviendra au début

Sander Mangel
la source
Oui, j'y avais pensé, mais c'est assez sale :(. Je suis surpris de ne pas savoir si un objet vient d'être créé dans un événement model_save_after
Matthew Haworth
seul un beforeévénement a les isObjectNewdonnées pour autant que je sache car les données ne sont pas encore enregistrées. En ce qui concerne le sale, je suppose qu'il y aurait des façons plus élégantes mais ce n'est certainement pas un hack
Sander Mangel
$customer->save(); $this->_dispatchRegisterSuccess($customer);malheureusement ici, le client est enregistré avant que l'événement de registre ne soit déclenché, donc la méthode d'observateur ne fonctionnerait pas de toute façon :(
Matthew Haworth
0

Une autre approche consiste à vérifier quel contrôleur et quelle action ont déclenché l'événement.

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

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

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

Et vérifiez plus tard votre méthode qui envoie l'événement.

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

Isaias
la source