У меня есть код в кассе, где я устанавливаю ключ в сеансе, если этот ключ установлен в false в любом месте проверки, которую мне нужно отправить на страницу фактурирования. У меня есть код для него, но у меня также не может быть кода, который обычно запускается после наблюдателя, потому что он вызовет стороннюю службу и вернется как неверный из-за этого ключа, отсутствующего в сеансе
Вот мой код, у меня есть все, что я хочу, но мне нужно, чтобы ответ был незамедлительным и бесполезным после того, как отправленная строка события была запущена только в ответ, отправленный обратно в браузер.
public function checkForOrdKey(Varien_Event_Observer $observer) { $controllerAction = $observer->getControllerAction(); $request = $controllerAction->getRequest(); $controllerName = $request->getControllerName(); $stepData = $this->_getCheckoutSession()->getStepData(); $ordKeyRemoved = $this->_getCheckoutSession()->getOrdKeyRemoved(); // if it is the checkout onepage controller or inventory controller don't do anything if (isset($controllerName) && $controllerName === "onepage" && $stepData['shipping']['complete'] && $ordKeyRemoved) { $this->_getCheckoutSession()->setStepData('shipping', 'complete', false); $result['goto_section'] = 'billing'; Mage::app()->getResponse()->setBody(Mage::helper('core')->jsonEncode($result)); $this->_getCheckoutSession()->setOrdKeyRemoved(false); } }
В основном вам необходимо взять на себя управление созданием и отправкой объекта Response. Нормальный поток контроллера будет обрабатывать всю встроенную логику метода, запускать его События и собирать дополнения к ответу на этом пути, тогда инфраструктура Magento завершит и отправит ответ.
Вы можете закоротить этот поток в Observer, присоединившись к событию preDispatch ( controller_action_predispatch_checkout_onepage_savebilling
), а затем выполните следующее:
$request = Mage::app()->getRequest(); $action = $request->getActionName(); Mage::app()->getFrontController()->getAction()->setFlag($action, Mage_Core_Controller_Varien_Action::FLAG_NO_DISPATCH, true);
Строки, приведенные выше, Mage_Core_Controller_Varien_Action
(прародителю всех контроллеров) на обход действия, которое было Mage_Core_Controller_Varien_Action
(обзорная строка 414 в CE 1.4.2, чтобы увидеть, как это работает). Затем приступайте к созданию собственного ответа и отправке его обратно в браузер. Вам нужно будет исследовать правильный формат JSON для проверки класса JS для визуализации любых сообщений об ошибках, но что-то в этом направлении …
$response = Mage::app()->getResponse(); $response->setHttpResponseCode(500); //adjust to be whatever code is relevant $json = Mage::helper('core')->jsonEncode($this->__('Your message here')); //adjust $response->setBody($json); //don't need to sendResponse() as the framework will do this later
Таким образом, вы работаете в рамках Zend / Magento, и вам не нужно переопределять CheckoutController ( пожалуйста, никогда … ) или использовать « exit/die()
» взлома. Причина, по которой выход / смерть плоха, заключается в том, что она препятствует любым последующим Наблюдателям, которые зарегистрировали интерес к этому Событию, способному действовать. Было бы очень неприятно, если разработчик зарегистрировал Observer, который никогда не будет вызван, потому что у другого разработчика есть выход из-за того, как вы попадаете!
Обратите внимание, что установка флага no-dispatch
будет работать, только если вы подключены к событию предварительной отправки.
Для получения дополнительной информации просмотрите диаграмму последовательности Magento , чтобы узнать, как вы обходите разделы Layout / Block / Template потока.