Magento-从Observer方法重定向客户


Magento - Redirect Customer from Observer Method

在此事件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;
}

我对这两个变量"$response1"answers"$response2"都使用了"setRedirect()"方法,但它们都显示了Shopping Cart页面,而我希望看到这个页面http://www.example.com/

我想要什么:

  • 当我可以有效地使用Event Observer进程时,我不想覆盖Controller类,只是为了重定向Customer
  • 我不想使用PHP内置函数"header()",因为Magento框架以一种有效的方式提供了这种功能

tl;dr:在底部更正观察者代码。

在我回答之前需要注意:确保观察者被触发;逐步完成代码或使用die('here');。正如所写的,您的示例方法没有正确的原型来接收事件观察器数据(缺少一个参数)

在这种情况下,使用事件观察器进行重定向逻辑是完全合适的,正如核心团队明确地将请求和响应对象传递给观察器所表明的那样。你的尝试很好,但我认为你有条件和配置,可以使执行流到Mage_Checkout_CartController::_goBack(),特别是行

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

因此,我们需要修改我们的方法。现在,您可以通过操纵响应并调用Front Controller的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事件执行到cart控制器的_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重定向到外部网站。