tl; dr:正确的观察员代码在底部。
我回答之前的一个注意事项:确保观察者正在被触发;浏览您的代码或使用die('here');
。正如所写,您的示例方法没有正确的原型来接收事件观察者数据(缺少参数)。
在此上下文中使用事件观察者来完成重定向逻辑,正如核心团队明确将请求和响应对象传递给观察者所证明的那样。您的尝试是好的,但我认为你有这导致执行流向Mage_Checkout_CartController::_goBack()
条件和配置,具体线路
$this->_redirect('checkout/cart');
所以我们需要修改我们的做法。现在,你可以防止处理任何请求/响应逻辑的事件观察后,通过操作响应和调用前端控制器sendResponse()
方法,如下面所示(注:不这样做!):
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
PARAM,完成我们所需要的。
public function moduleMethod(Varien_Event_Observer $observer)
{
$observer->getRequest()->setParam('return_url','http://www.google.com/');
}
我测试了这个,它应该做的窍门!
非常感谢,因为你在这个答案中的可怕细节,这是完美的工作!是的,我错过了在方法定义中提到的论点,所以谢谢你纠正我。如果您能详细说明EDA及其在Magento上的利弊,那将非常棒! – 2012-03-18 17:40:40
Magento具有遍历多个图层的深层调用堆栈。如果没有它的事件架构,许多定制将会非常容易入侵,并且会导致很多繁琐。 – benmarks 2012-03-18 21:37:28
大帮忙,谢谢! – 2013-08-04 00:39:46