Как перенаправить от наблюдателя и отправить сообщение клиенту


Я использую наблюдателя, чтобы поймать это событие: 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() или Ответ() или Тело().. Кто-нибудь знает, почему??

Author: vbak, 2013-11-26

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 правильное время.

 3
Author: Kristof at Fooman, 2013-11-28 01:49:20

Вы можете перенаправлять из любого места, используя

Mage::app()->getResponse()
   ->setRedirect('[ your url ]')
   ->sendResponse();

Вы можете добавить свои проверки в свой наблюдатель и перенаправить обратно на предыдущую/текущую страницу, если проверки завершатся неудачей, или перенаправить на какую-либо страницу успеха, если проверки будут пройдены

 6
Author: Sander Mangel, 2013-11-26 18:40:40

От Наблюдателя вы можете:-

$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
);
 3
Author: Dallas Clarke, 2016-09-24 09:06:07