Come mostrare errore di convalida da Observer sul frontend?
-
16-10-2019 - |
Domanda
Sono la personalizzazione prima pagina di checkout e si desidera aggiungere la convalida del nuovo campo durante la fase di fatturazione. Per fare questo la convalida Non voglio riscrivere controller o modello, ma si desidera utilizzare osservatore controller_action_predispatch_checkout_onepage_saveBilling
fare tutti convalida qui e campo Salva per Mage::getSingleton('customer/session')
se è ok o attivare un errore. Ma non vedo alcun modo come aggiungere di errore e vederlo sul davanti. Sto cercando:
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'))));
posso buttare eccezione:
Mage::throwException('Error');
Than esecuzione si ferma, ma non posso mostrare il messaggio di errore.
C'è un modo come risolverlo?
Soluzione
Nel vostro metodo di osservatore, è essenzialmente bisogno di dire al dispatcher per fermare la richiesta e non inviare alla azione di controllo in modo che il corpo della risposta impostato verrà inviato al browser e il controller non farà nulla. Fare questo è abbastanza semplice da realizzare e può essere fatto impostando una bandiera sul azione di controllo prima che i rendimenti osservatori:
$action = $observer->getEvent()->getControllerAction();
$action->setFlag('', Mage_Core_Controller_Varien_Action::FLAG_NO_DISPATCH, true);
Per una breve esplorazione del perché questo funziona, diano un'occhiata al Mage_Core_Controller_Varien_Action::dispatch
e notare la logica che circonda la chiamata al metodo di azione sull'oggetto controller.
Altri suggerimenti
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));
}