événement sales_order_save_commit_after déclenché deux fois?


8

J'ai enregistré un observateur de l' sales_order_save_commit_afterévénement pour être averti lorsqu'une nouvelle commande arrive. Cela fonctionne bien mais l'événement est déclenché deux fois de suite avec la même commande.

Mon config.xml

        <sales_order_save_commit_after>
            <observers>
                <unique_sales_order_save_commit_after>
                    <type>singleton</type>
                    <class>mymodule/observer</class>
                    <method>export</method>
                </unique_sales_order_save_commit_after>
            </observers>
        </sales_order_save_commit_after>

Comment puis-je vérifier si c'est la première fois ou quel autre événement serait mieux?

Mise à jour

J'ai également essayé l' sales_order_invoice_payévénement (trouvé sur SO ) mais ce n'est pas déclenché pour moi.

Réponses:


9

Essayez d'utiliser à la sales_order_save_afterplace, il est déclenché juste après l'enregistrement d'une commande dans la base de données et retourne l'objet de commande complet

Pourquoi cet événement est déclenché deux fois, je ne suis pas sûr. C'est un événement déclenché par la Core/Model/Abstract.phpméthode afterCommitCallback, semble que Magento enregistre / valide 2 ensembles de données différents sur le modèle Order. Peut-être une fois l'ordre lui-même et une fois l'historique du statut.

Y a-t-il une différence entre les données analysées sur les 2 événements qui pourraient donner un indice d'où elles sont appelées?


1
Merci sales_order_save_after, mais je vais l'utiliser sales_order_place_aftercar il n'est pas déclenché à nouveau par des changements de back-end.
PiTheNumber

7

Si quelqu'un a toujours un problème avec cela, j'ai découvert comment magento gère cela.

Dans la méthode appelée, vous pouvez prendre la commande et définir un indicateur dessus.

Ex:

public function export(Varien_Event_Observer $observer) {
    $order = $observer->getEvent()->getOrder();
    if($order->getExportProcessed()){ //check if flag is already set.
        return;
    }

    // your part of code

    //"setExportProcessed" can be called anything you want as it's getting set magically by magento on our $order object.
    $order->setExportProcessed(true); 
}

Dans l'application / code / core / Mage / Cataloginventory / Model / Observer.php

fonction subtractQuoteInventory (Varien_Event_Observer $ observer)

est un exemple de la façon dont magento gère cela.


5

J'ai changé l'événement en sales_order_place_after. Cela fonctionne bien.


0
public function sendEmail(Varien_Event_Observer $observer) {
    if(!Mage::registry('varien_event')){

        //your code here...

        Mage::register('varien_event',true);

    }
}

Le code Bove fonctionne pour moi.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.