В этом случае 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/
вместо этого.
Что я хочу:
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.