2013-05-10 44 views
2

我是Magento的新手。我想建立一個觀察者,在取消訂單時將對我的數據庫執行查詢,並將決定訂單是否可以取消(這是根據某個狀態決定的)。如果它不能被取消,那麼它應該中斷取消事件並顯示一條消息,指出訂單不能被取消。觀察員可以打破Magento中的事件嗎?

我應該選擇哪一個事件,order_cancel_aftersales_order_item_cancel,我該如何擺脫這個事件呢?

在此先感謝。 :)

+0

你的意思是要停止任何其他觀察員在你之後處理事件? – Andrew 2013-05-10 10:38:19

+0

號我想,當觀察者發現任何事件,在此之前的事件執行,觀察者檢查一定條件下,可以停止執行該事件。 (例如: - 使用在for循環或while循環「破」的) – Gurpreet 2013-05-10 17:59:08

回答

2

對此沒有普遍的答案,它取決於事件觸發的上下文以及之後會發生的情況。

的事件沒有一個接口來「停止」他們,他們不依賴於實際的「事件」(即訂單取消)比其他的名字。

所以你必須看看那裏sales_order_item_cancel被觸發的Mage_Sales_Model_Order_Item代碼(order_cancel_after顯然是錯誤的地方,在這一點上,因爲看的訂單已經取消):

/** 
* Cancel order item 
* 
* @return Mage_Sales_Model_Order_Item 
*/ 
public function cancel() 
{ 
    if ($this->getStatusId() !== self::STATUS_CANCELED) { 
     Mage::dispatchEvent('sales_order_item_cancel', array('item'=>$this)); 
     $this->setQtyCanceled($this->getQtyToCancel()); 
     $this->setTaxCanceled($this->getTaxCanceled() + $this->getBaseTaxAmount() * $this->getQtyCanceled()/$this->getQtyOrdered()); 
     $this->setHiddenTaxCanceled($this->getHiddenTaxCanceled() + $this->getHiddenTaxAmount() * $this->getQtyCanceled()/$this->getQtyOrdered()); 
    } 
    return $this; 
} 

你看到有在事件發出後沒有額外的檢查,但可以將qty_to_cancel屬性設置爲0以不影響取消。

你的觀察方法:

public function salesOrderItemCancel(Varien_Event_Observer $observer) 
{ 
    $item = $observer->getEvent()->getItem(); 
    if (!$this->_isCancellable($item->getOrder())) { 
     $item->setQtyToCancel(0); 
     $this->_showErrorMessage(); 
    } 
} 

注意,您不必設置tax_canceledhidden_tax_canceled因爲它們依賴於qty_canceled,因此將保持0

+0

我完全同意你的看法。但是通過實踐和試用,我得到了這個解決方案,即如果在觀察者方法中正在進行並將其重定向到其他頁面時,我可以在其間停止該事件。 – Gurpreet 2013-05-14 10:00:42

+0

重定向基本上退出當前腳本。所以是的,這也適用,但它是一種暴力方法,並不總是有意的。 – 2013-05-14 10:14:24

+0

是的。但經過多次搜索後,我終於做到了這一點,這將是我的工作。 :) 謝謝你:) – Gurpreet 2013-05-14 17:51:07