tl; др: Исправьте код наблюдателя внизу.
Примечание, прежде чем я отвечу: убедитесь, что наблюдатель запускается;пошагово пройдитесь по коду или используйте die('here');
.Как написано, ваш пример метода не имеет правильного прототипа для получения данных наблюдателя события (пропущен аргумент).
Использование наблюдателя события для логики перенаправления полностью уместно в этом контексте, о чем свидетельствуетОсновная команда явно передает объекты запроса и ответа наблюдателю.Ваша попытка хороша, но я думаю, что у вас есть условия и конфигурация, которые приводят к тому, что выполнение переходит к Mage_Checkout_CartController::_goBack()
, в частности к строке
$this->_redirect('checkout/cart');
Так что нам нужно пересмотреть наш подход.Теперь вы можете предотвратить обработку любой логики запроса / ответа после того, как ваш наблюдатель событий, манипулируя ответом и вызывая метод sendResponse()
Front Controller, как показано ниже ( 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/');
}
Я проверил это, и это должно сработать!