我正在自定义一页结帐,并希望在计费步骤中添加新字段的验证。为了进行此验证,我不想重写控制器或模型,但要使用观察者 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归因
scroll top