Magento – перенаправление клиента из метода наблюдателя

В этом случае checkout_cart_add_product_complete , я хочу, чтобы клиент был перенаправлен на внешнюю веб-страницу http://www.example.com/ . Для этого я использую этот код, который не работает вообще:

 public function moduleMethod() { /* @var $response1 Mage_Core_Controller_Response_Http */ $response1 = $observer->getEvent()->getResponse(); /* @var $response2 Mage_Core_Controller_Response_Http */ $response2 = Mage::app()->getResponse(); $url = 'http://www.example.com/'; $response1->setRedirect($url); return; } 

Я использовал метод setRedirect() для обеих этих переменных « $response1 » и « $response2 », но оба они показывают мне страницу «Корзина», тогда как я хочу увидеть эту страницу http://www.example.com/ вместо этого.

Что я хочу:

  • Я не хочу переопределять класс контроллера, чтобы перенаправить клиента, когда я могу эффективно использовать процесс Observer.
  • Я не хочу использовать встроенную функцию PHP « header() », когда инфраструктура Magento обеспечивает эту функциональность эффективным образом.

tl; dr: Исправить код наблюдателя внизу.

Примечание перед тем, как я отвечу: убедитесь, что наблюдатель активирован; пройдите через свой код или используйте die('here'); , Как написано, ваш примерный метод не имеет правильного прототипа для получения данных наблюдателя (отсутствует аргумент).

Использование наблюдателя событий для логики переадресации в этом контексте вполне уместно, так как основная команда явно передает объекты запроса и ответа в наблюдателя. Ваша попытка хорошая, но я думаю, что у вас есть условия и конфигурация, которые вызывают выполнение потока в Mage_Checkout_CartController::_goBack() , в частности, на строку

 $this->_redirect('checkout/cart'); 

Поэтому нам нужно пересмотреть наш подход. Теперь вы можете предотвратить обработку любой логики запроса / ответа после наблюдателя событий, манипулируя ответом и вызывая метод sendResponse() переднего контроллера, как показано ниже ( nb: не делайте этого! ):

 public function moduleMethod($observer) //note I added a param { /* @var $response1 Mage_Core_Controller_Response_Http */ $response1 = $observer->getResponse(); // observers have event args $url = 'http://www.example.com/'; $response1->setRedirect($url); /* SHOULDN'T DO THIS */ Mage::app()->getFrontController()->sendResponse(); } 

Это должно работать, но я думаю, что это смешивает проблемы, вызывающие беспокойство, вызывая выход из эфирного компонента системы (EDA). Давайте посмотрим, есть ли что-то в структуре управления командами, которые мы можем использовать …

Сразу же после выполнения checkout_cart_add_product_complete выполнение события происходит с помощью метода _goBack () контроллера тележки. Проблема с этим именем метода заключается в том, что она делает больше, чем ее название:

 /** * Set back redirect url to response * * @return Mage_Checkout_CartController */ protected function _goBack() { $returnUrl = $this->getRequest()->getParam('return_url'); if ($returnUrl) { // clear layout messages in case of external url redirect if ($this->_isUrlInternal($returnUrl)) { $this->_getSession()->getMessages(true); } $this->getResponse()->setRedirect($returnUrl); } //... } 

Похоже, мы можем просто установить параметр return_url на объект запроса и выполнить то, что нам нужно.

 public function moduleMethod(Varien_Event_Observer $observer) { $observer->getRequest()->setParam('return_url','http://www.google.com/'); } 

Я проверил это, и он должен сделать трюк!

Мне пришлось пройти через getFront :

 public function moduleMethod($observer) { $observer->getEvent()->getFront()->getResponse()->setRedirect('http://www.google.com'); } 

Вы можете использовать метод _redirectUrl () , он используется для перенаправления на внешние веб-сайты из magento.