2013-05-10 3 views
2

Я новичок в Magento. Я хочу создать наблюдателя, который при аннулировании заказа выполнит запрос к моей базе данных и решит, отменен ли заказ или нет (это определяется на основе определенного состояния.). Если он не может быть отменен, он должен разорвать событие отмены и отобразить сообщение о том, что заказ не может быть отменен.Может ли наблюдатель сломать Событие в Мадженто?

Какое событие я должен выбрать, order_cancel_after или sales_order_item_cancel, и как я могу выйти из этого события между ними?

Заранее спасибо. :)

+0

ли вы имеете в виду вы хотите, чтобы остановить любой другой наблюдатели от обработки события после вас? – Andrew

+0

Нет. Я хочу, чтобы, когда наблюдатель обнаруживает какое-либо событие, перед тем, как это событие выполняется, наблюдатель проверяет определенные условия и может остановить событие от выполнения. (Пример - использование «break» in для цикла или цикла while.) – Gurpreet

ответ

2

Общего ответа на этот вопрос нет, это зависит от контекста, в котором происходит событие, и что происходит после этого.

События не имеют интерфейса, чтобы «остановить» их, и они не привязаны к фактическому «событию» (то есть отмену заказа), кроме имени.

Таким образом, вы должны смотреть на код 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.

+0

Я полностью согласен с вами. Но, совершив удары и испытания, я пришел с этим решением, которое, если в процессе наблюдения находится в процессе, и я перенаправляю его на другую страницу, я могу остановить это событие между ними. – Gurpreet

+0

Перенаправление в основном выходит из текущего скрипта. Так что да, это тоже работает, но это своего рода метод грубой силы, который не всегда будет задуман. –

+0

Да. Но после того, как он слишком много искал его, я, наконец, занялся этим, и это выполнит мою работу. :) Спасибо тоже :) – Gurpreet

Смежные вопросы