我正在尝试在登录后将Magento中的特定用户重定向到products.html页面。我尝试执行此操作的大多数方式(setRedirect,header)都会因重定向过多导致循环。
目前,我正在尝试使用观察者设置setParam('return_url',“$ customerRedirectUrl”),如此相当受欢迎的帖子Magento - Redirect Customer from Observer Method中所述。变量$ customerRedirectUrl表示一起可靠地创建我知道我想要页面的URL的逻辑。我的相关代码看起来像这样。
public function redirect(Varien_Event_Observer $observer)
{
$helper = Mage::helper('personal_order');
$isPersonalOrderStore = $helper->isPersonalOrderStore(null);
$session = Mage::getSingleton('customer/session');
if ($isPersonalorderStore){
if(!$session->isLoggedIn()) {
$targetUrl = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB).'customer/account/login';
Mage::app()->getResponse()->setRedirect($targetUrl);
} else {
$baseUrl = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);
$storeName = strtolower(Mage::app()->getStore()->getName());
$storeName = str_replace(' ', '', $storeName);
$customerRedirectUrl = "$baseUrl$storeName/products.html";
$observer->getRequest()->setParam('return_url',"$customerRedirectUrl");
}
}
现在我的目的的重要部分是else语句,函数的其余部分工作正常。但是,调用setParam会导致以下错误:
致命错误:在非对象上调用成员函数setParam()...
我没有得到Magento - Redirect Customer from Observer Method帖子怎么样(我很有可能因为是一个相当新的用户而忘记某些事情)?观察者在controller_action_postdispatch下的相对配置文件中布局,并且在观察者模型中。让setParam正常运行的上下文是什么?
感谢您的帮助!
答案 0 :(得分:1)
我知道这篇文章有点陈旧但是我觉得它适用于我自己的模块。
我在2个不同的事件上运行重定向。当客户注册或客户登录时。
<customer_register_success>
<observers>
<redirectAfterRegister>
<class>businessdirectory/profile_observer</class>
<method>redirectAfterRegister</method>
</redirectAfterRegister>
</observers>
</customer_register_success>
<customer_login>
<observers>
<redirectAfterLogin>
<class>businessdirectory/profile_observer</class>
<method>redirectAfterLogin</method>
</redirectAfterLogin>
</observers>
</customer_login>
我编辑了这个答案,因为在测试之后我意识到这两个事件需要两个独立的观察者。好消息是您不需要覆盖文件或重写控制器。
对于customer_register_success
事件,您需要做的就是将success_url
参数设置为您想要的网址。
对于customer_login
事件,您将在控制器customer / account / _loginPostRedirect中注意到正在客户会话上设置重定向URL。正如您在下面的第二个观察者方法中所看到的,您需要做的就是抓住客户会话并设置URL。为了我的目的,我设置了BeforeAuthUrl和AfterAuthUrl。
public function redirectAfterRegister($observer)
{
if(Mage::app()->getRequest()->getParam('listing_id') || Mage::app()->getRequest()->getParam('directory_id')){
$_session = Mage::getSingleton('customer/session');
$action = $_session->getDirectoryAction();
if(Mage::app()->getRequest()->getParam('listing_id')){
$listingId = Mage::app()->getRequest()->getParam('listing_id');
Mage::app()->getRequest()->setParam('success_url',Mage::getUrl($action,array('listing_id'=>$listingId)));
}elseif(Mage::app()->getRequest()->getParam('directory_id')){
$directoryId = Mage::app()->getRequest()->getParam('directory_id');
Mage::app()->getRequest()->setParam('success_url',Mage::getUrl($action,array('directory_id'=>$directoryId)));
}
}
}
public function redirectAfterLogin($observer)
{
if(Mage::app()->getRequest()->getParam('listing_id') || Mage::app()->getRequest()->getParam('directory_id')){
$_session = Mage::getSingleton('customer/session');
$action = $_session->getDirectoryAction();
if(Mage::app()->getRequest()->getParam('listing_id')){
$listingId = Mage::app()->getRequest()->getParam('listing_id');
$url = Mage::getUrl($action,array('listing_id'=>$listingId));
$_session->setBeforeAuthUrl($url);
$_session->setAfterAuthUrl($url);
}elseif(Mage::app()->getRequest()->getParam('directory_id')){
$directoryId = Mage::app()->getRequest()->getParam('directory_id');
$url = Mage::getUrl($action,array('directory_id'=>$directoryId));
$_session->setBeforeAuthUrl($url);
$_session->setAfterAuthUrl($url);
}
}
}
答案 1 :(得分:0)
如果您在使用$observer->getRequest()
实例化对象时遇到问题,请尝试使用$observer->getEvent()->getFront()->getResponse()
。我认为这取决于观察者正在听什么事件。