Вопрос

Я настраиваю настройку на одну страницу и хочу добавить проверку нового поля на шаге выставления счетов. Чтобы сделать эту проверку, я не хочу переписать контроллер или модель, но хочу использовать наблюдатель 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));
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top