2

我是 Magento 的新手。我想建立一个观察者,在取消订单时将对我的数据库执行查询,并决定订单是否可以取消(这是根据某个状态决定的。)。如果无法取消,则应中断取消事件并显示订单无法取消的消息。

我应该选择哪个事件,order_cancel_after或者sales_order_item_cancel,我怎样才能在这两者之间跳出这个事件?

提前致谢。:)

4

1 回答 1

2

对此没有一般性的答案,这取决于触发事件的上下文以及之后发生的情况。

这些事件没有“停止”它们的接口,并且它们与实际的“事件”(即订单取消)无关,只是通过名称。

因此,您将不得不查看触发位置的代码(显然是错误的Mage_Sales_Model_Order_Item位置,因为此时订单已被取消):sales_order_item_cancelorder_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。

于 2013-05-10T17:35:58.067 回答