1

我试图在登录后将 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 - 从观察者方法重定向客户帖子我没有得到什么(很有可能我只是因为是一个相当新的用户而忘记了某些事情)?观察者位于 controller_action_postdispatch 下的相关配置文件中,并且位于观察者模型中。让 setParam 正确运行的上下文是什么?

感谢您的帮助!

4

2 回答 2

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参数设置为您想要的 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);           
      }
    }
  } 
于 2014-05-19T14:09:46.577 回答
0

当您在使用 实例化对象时遇到问题时$observer->getRequest(),请尝试使用$observer->getEvent()->getFront()->getResponse()。我相信这取决于观察者正在听什么事件。

于 2013-05-29T23:26:50.700 回答