Magento - 通过Observer重定向登录

时间:2013-05-29 21:54:12

标签: magento redirect observers

我正在尝试在登录后将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正常运行的上下文是什么?

感谢您的帮助!

2 个答案:

答案 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()。我认为这取决于观察者正在听什么事件。