Ответ 1
В основном вам нужно взять под контроль создание и отправку объекта 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
(grandparent всех контроллеров) обойти действие, которое было вызвано (обзорная строка 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()
" взлома. Причина, по которой выход/смерть плоха, заключается в том, что она препятствует любым последующим Наблюдателям, которые зарегистрировали интерес к этому Событию, способному действовать. Было бы очень неприятно, если разработчик зарегистрировал Наблюдателя, который никогда не будет вызван, потому что у другого разработчика есть выход из-за того, как вы попадете!
Обратите внимание, что установка флага no-dispatch
выполняется только, если вы подключены к событию предварительной отправки.
Для получения дополнительной информации просмотрите диаграмму последовательности Magento чтобы увидеть, как вы обходите разделы Layout/Block/Template потока.