Pregunta

Estoy personalizando un pago de una página y quiero agregar la validación del nuevo campo durante el paso de facturación. Para hacer esta validación, no quiero reescribir el controlador o el modelo, pero quiero usar Observer controller_action_predispatch_checkout_onepage_saveBilling Haga toda la validación aquí y guarde el campo para Mage::getSingleton('customer/session') Si está bien o activa un error. Pero no veo ninguna forma de agregar error y mostrarlo en el frente. Lo estoy intentando:

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'))));

Puedo lanzar una excepción:

 Mage::throwException('Error'); 

Que la ejecución se detiene, pero no puedo mostrar un mensaje de error.

¿Hay alguna forma de resolverlo?

¿Fue útil?

Solución

En su método Observador, esencialmente necesita decirle al despachador que detenga la solicitud y no la envíe a la acción del controlador para que el cuerpo de respuesta que establezca se envíe al navegador y el controlador no haga nada. Hacer esto es bastante simple de lograr y se puede hacer configurando una bandera en la acción del controlador antes de que su observador regrese:

$action = $observer->getEvent()->getControllerAction();
$action->setFlag('', Mage_Core_Controller_Varien_Action::FLAG_NO_DISPATCH, true);

Para una breve exploración de por qué esto funciona, eche un vistazo a Mage_Core_Controller_Varien_Action::dispatch y tenga en cuenta la lógica que rodea la llamada al método de acción en el objeto del controlador.

Otros consejos

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));
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top