Общего ответа на этот вопрос нет, это зависит от контекста, в котором происходит событие, и что происходит после этого.
События не имеют интерфейса, чтобы «остановить» их, и они не привязаны к фактическому «событию» (то есть отмену заказа), кроме имени.
Таким образом, вы должны смотреть на код Mage_Sales_Model_Order_Item
где sales_order_item_cancel
сработал (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_canceled
или hidden_tax_canceled
, потому что они зависят от qty_canceled
и, таким образом, останется 0.
ли вы имеете в виду вы хотите, чтобы остановить любой другой наблюдатели от обработки события после вас? – Andrew
Нет. Я хочу, чтобы, когда наблюдатель обнаруживает какое-либо событие, перед тем, как это событие выполняется, наблюдатель проверяет определенные условия и может остановить событие от выполнения. (Пример - использование «break» in для цикла или цикла while.) – Gurpreet