2010-06-15 5 views
4

Je veux changer via un service web un inventaire à distance, je sais que via Event Observer Method peut triger mon code, mais je ne sais pas quel événement est utile pour terminer ma tâche, comme on_order_complete, est -il une liste mise à jour d'événements ou plus de documentation?Magento statut de la commande changer les événements

Répondre

16

Si vous souhaitez envoyer un événement lorsque l'état d'un changement d'ordre à un statut ou d'état, alors vous aurez besoin d'insérer votre propre écouteur d'événement. Ce n'est pas aussi difficile que cela puisse paraître.

outrepasser simplement la fonction _setStatus dans Mage_Sales_Model_Order comme si ...

/** 
* Order model 
* 
* @category WMG 
* @package  WMG_Sales 
* @author  Lee Bolding <[email protected]> 
* 
* Supported events: 
* sales_order_status_before 
* sales_order_status_after 
* 
* NOTE: Unfortunately, we can't override setState() as the protected _setState() 
* function is used by the registerCancellation() and _checkState() functions 
* 
*/ 
class WMG_Sales_Model_Order extends Mage_Sales_Model_Order 
{ 
    /** 
    * Order state protected setter. 
    * By default allows to set any state. Can also update status to default or specified value 
    * Сomplete and closed states are encapsulated intentionally, see the _checkState() 
    * 
    * @param string $state 
    * @param string|bool $status 
    * @param string $comment 
    * @param bool $isCustomerNotified 
    * @param $shouldProtectState 
    * @return Mage_Sales_Model_Order 
    */ 
    protected function _setState($state, $status = false, $comment = '', $isCustomerNotified = null, $shouldProtectState = false) 
    { 
     // dispatch an event before we attempt to do anything 
     Mage::dispatchEvent('sales_order_status_before', array('order' => $this, 'state' => $state, 'status' => $status, 'comment' => $comment, 'isCustomerNotified' => $isCustomerNotified, 'shouldProtectState' => $shouldProtectState)); 

     // attempt to set the specified state 
     if ($shouldProtectState) { 
      if ($this->isStateProtected($state)) { 
       Mage::throwException(Mage::helper('sales')->__('The Order State "%s" must not be set manually.', $state)); 
      } 
     } 
     $this->setData('state', $state); 

     // add status history 
     if ($status) { 
      if ($status === true) { 
       $status = $this->getConfig()->getStateDefaultStatus($state); 
      } 
      $this->setStatus($status); 
      $history = $this->addStatusHistoryComment($comment, false); // no sense to set $status again 
      $history->setIsCustomerNotified($isCustomerNotified); // for backwards compatibility 
     } 

     // dispatch an event after status has changed 
     Mage::dispatchEvent('sales_order_status_after', array('order' => $this, 'state' => $state, 'status' => $status, 'comment' => $comment, 'isCustomerNotified' => $isCustomerNotified, 'shouldProtectState' => $shouldProtectState)); 

     return $this; 
    } 
} 

Vous pouvez maintenant vous abonner aux observateurs nouvellement créés sales_order_status_before et sales_order_status_after événements

0

Utilisez grep pour trouver la liste des événements, il doit être quelque chose comme

grep -rn -A2 --include="*.php" dispatchEvent /var/www/magento/ 

ou quelque chose comme ça ...

+1

Cela montrera les événements de base par défaut .. il faut en œuvre son propre événement, car il ne fourni par années magento coeur. – Strae

1

Je l'ai fait une blog post à ce sujet (qui contient la liste complète des événements pour Magento CE 1.4) il y a quelques semaines.

Les événements susceptibles de vous intéresser pour un placement de commande sont les suivants: sales_order_place_after, qui est appelé après la commande (sérieusement!).

Espérons que ça aide!

Merci, Joe

+0

Merci Joe, excellent poste mais j'ai quelques questions: Ce sales_order_place_after se déclenche lorsque l'administrateur complète la commande? ou est juste quand l'utilisateur finit le processus de cekout? Je dois changer lorsque l'administrateur termine la commande après l'envoi de la notification à l'utilisateur – Christian

+0

L'événement sales_order_place_after se déclenche lorsqu'une commande est ajoutée au système. Si vous recherchez un événement unique lorsque la commande est placée dans un état "terminé", il n'y a pas d'événement spécifique pour cela. Vous devriez pouvoir utiliser sales_order_save_after à la place et vérifier l'état de la commande. –

+0

merci pour votre réponse Joseph! – Christian

Questions connexes