Magento - перенаправление клиента из метода наблюдателя - PullRequest
8 голосов
/ 17 марта 2012

В этом случае 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/.

Что я хочу:

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

Ответы [ 3 ]

17 голосов
/ 17 марта 2012

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/');
}

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

2 голосов
/ 09 мая 2013

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

public function moduleMethod($observer) {
  $observer->getEvent()->getFront()->getResponse()->setRedirect('http://www.google.com');
}
1 голос
/ 24 августа 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...