Intereting Posts
Лучший способ дезинформировать контент с помощью PHP? Нужно ли в любом случае переносить значение в php на вторую страницу? Как динамически писать имя свойства объекта PHP? Как загрузить шаблон из полного пути в движок шаблонов TWIG PHP – Заменить цвет в изображении Как создать языковые файлы Codeigniter из базы данных? Вызов функции-члена bind_param () для не-объекта (неспособный решить, несмотря на исследование) строка состояния facebook SQL pivot с dayValue MYSQL-решение Вызов статического метода с именем класса, хранящимся как переменная экземпляра Не удалось открыть поток при чтении содержимого из URL-адреса Пропустить URL-адрес в качестве параметра для XSL Laravel: метод загрузки в другом контроллере без изменения URL-адреса Подтвердить регулярное выражение для почтового индекса Канады Настройка Laravel на Mac php artisan migrate error: Нет такого файла или каталога

В методе Observer, как вы сообщаете Magento не обрабатывать код после отправленного события

У меня есть код в кассе, где я устанавливаю ключ в сеансе, если этот ключ установлен в 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 потока.