2013-05-10 47 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