Как показать ошибку проверки от Observer на Frontend?
-
16-10-2019 - |
Вопрос
Я настраиваю настройку на одну страницу и хочу добавить проверку нового поля на шаге выставления счетов. Чтобы сделать эту проверку, я не хочу переписать контроллер или модель, но хочу использовать наблюдатель controller_action_predispatch_checkout_onepage_saveBilling
сделать все подтверждение здесь и сохранить поле Mage::getSingleton('customer/session')
Если все в порядке или запускает ошибку. Но я не вижу, как добавить ошибку и показать ее спереди. Я стараюсь:
return array('error' => -1, 'message' => $helper->__('Your card number or zipcode are not correct.'));
Mage::app()->getResponse()->setBody(Mage::helper('core')->jsonEncode(array('error' => -1, 'message' => $helper->__('No card number was found in loyalty request'))));
Я могу бросить исключение:
Mage::throwException('Error');
Чем выполнение останавливается, но я не могу показать сообщение об ошибке.
Есть ли способ решить это?
Решение
В вашем методе наблюдателя вам, по сути, нужно сообщить диспетчеру остановить запрос и не отправлять его на действие контроллера, чтобы тело ответа, которое вы установили, был отправлен в браузер, а контроллер ничего не будет делать. Делать это довольно просто для выполнения и может быть сделано, установив флаг на действие контроллера, прежде чем ваш наблюдатель вернется:
$action = $observer->getEvent()->getControllerAction();
$action->setFlag('', Mage_Core_Controller_Varien_Action::FLAG_NO_DISPATCH, true);
Для краткого изучения того, почему это работает, взгляните на Mage_Core_Controller_Varien_Action::dispatch
и обратите внимание на логику, окружающую вызов, метод действия на объекте контроллера.
Другие советы
public function observerCall($observer)
{
$controller = $observer->getControllerAction();
$controller->setFlag('', Mage_Core_Controller_Varien_Action::FLAG_NO_DISPATCH, true);
$response = array('error' => -1, 'message' => $helper->__('Error'));
return $controller->getResponse()->setBody(Mage::helper('core')->jsonEncode($response));
}