Как перенаправить от наблюдателя и отправить сообщение клиенту
Я использую наблюдателя, чтобы поймать это событие: controller_action_postdispatch_checkout_onepage_saveBilling
Мне нужно это событие, чтобы проверить платежный адрес клиента.
Мой вопрос: как я могу отправить сообщение пользователю на этом этапе.При нажатии кнопки продолжить.
Я использовал : Mage::getSingleton('core/session')->addError('My message');
Но сообщение не отображается, пока вы не обновите страницу.И вот второй вопрос.
Как я могу перенаправить страницу с этого момента?
У меня есть использование без удачи: $this->_redirect('*/*/');
и жестко закодированный url-адреса безрезультатно.
В идеале я хочу, чтобы, когда клиент нажимает кнопку "Продолжить", после некоторых проверок, которые я выполняю, процесс был остановлен сообщением.Наблюдатель проверяется, и он работает так, как должен работать.
Надеюсь, это имеет смысл..
РЕДАКТИРОВАТЬ Это мой кодекс.Просто чтобы убедиться, что я все делаю правильно: Модель/Наблюдатель
class Company_Restrictions_Model_Observer {
public function notifyUser($observer) {
//Lot's off lines are tested here.Nothing seems to work..
//$observer->getRequest()->setParam('return_url','http://www.google.com/');
//Edited after comments
$result = array();
$result['error'] = '-1';
$result['message'] = 'YOUR MESSAGE HERE';
$this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result));
}
}
Config.xml
<?xml version="1.0"?>
<config>
<modules>
<Company_Restrictions>
<version>0.1.0</version>
</Company_Restrictions>
</modules>
<global>
<models>
<company_restrictions>
<class>Company_Restrictions_Model</class>
</company_restrictions>
</models>
<helpers>
<company_restrictions>
<class>Company_Restrictions_Helper</class>
</company_restrictions>
</helpers>
<events>
<controller_action_postdispatch_checkout_onepage_saveBilling>
<observers>
<notify_user>
<type>singleton</type>
<class>Company_Restrictions_Model_Observer</class>
<method>notifyUser</method>
</notify_user>
</observers>
</controller_action_postdispatch_checkout_onepage_saveBilling>
</events>
</global>
</config>
ОТРЕДАКТИРУЙТЕ ЕЩЕ РАЗ После дебютирования я обнаружил, что многие функции дают мне ошибку.Не определено метод... например: _redirect() или Ответ() или Тело().. Кто-нибудь знает, почему??
3 answers
Результат сохранения оценивается только как часть вызова Ajax. Взгляните на оригинальную реализацию здесь:
public function saveBillingAction()
{
if ($this->_expireAjax()) {
return;
}
if ($this->getRequest()->isPost()) {
$data = $this->getRequest()->getPost('billing', array());
$customerAddressId = $this->getRequest()->getPost('billing_address_id', false);
if (isset($data['email'])) {
$data['email'] = trim($data['email']);
}
$result = $this->getOnepage()->saveBilling($data, $customerAddressId);
if (!isset($result['error'])) {
/* check quote for virtual */
if ($this->getOnepage()->getQuote()->isVirtual()) {
$result['goto_section'] = 'payment';
$result['update_section'] = array(
'name' => 'payment-method',
'html' => $this->_getPaymentMethodsHtml()
);
} elseif (isset($data['use_for_shipping']) && $data['use_for_shipping'] == 1) {
$result['goto_section'] = 'shipping_method';
$result['update_section'] = array(
'name' => 'shipping-method',
'html' => $this->_getShippingMethodsHtml()
);
$result['allow_sections'] = array('shipping');
$result['duplicateBillingInfo'] = 'true';
} else {
$result['goto_section'] = 'shipping';
}
}
$this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result));
}
}
Поэтому, если вы хотите отправить другой ответ/перенаправление, вам также потребуется использовать ответ в кодировке JSON
$controllerAction = $observer->getEvent()->getControllerAction();
$result = array();
$result['error'] = '-1';
$result['message'] = 'YOUR MESSAGE HERE';
$controllerAction->getResponse()->setBody(Mage::helper('core')->jsonEncode($result));
Еще одна вещь, которую следует изучить, заключается в том, обеспечивает ли использование postDispatch правильное время.
Вы можете перенаправлять из любого места, используя
Mage::app()->getResponse()
->setRedirect('[ your url ]')
->sendResponse();
Вы можете добавить свои проверки в свой наблюдатель и перенаправить обратно на предыдущую/текущую страницу, если проверки завершатся неудачей, или перенаправить на какую-либо страницу успеха, если проверки будут пройдены
От Наблюдателя вы можете:-
$pageId = Mage::getStoreConfig('some/cms/redirect_to'); Mage::app()->getResponse()->setRedirect(Mage::getBaseUrl().$pageId)->sendResponse(); exit;
Или
$pageId = Mage::getStoreConfig('some/cms/redirect_to'); Mage::app()->getResponse()->setRedirect(Mage::getBaseUrl().$pageId)->sendResponse(); $observer->getControllerAction()->setFlag('', Mage_Core_Controller_Varien_Action::FLAG_NO_DISPATCH, true );