Magento — перенаправление при входе через Observer

Я пытаюсь перенаправить определенных пользователей в Magento на страницу products.html после входа в систему. Почти каждый способ, которым я пытаюсь это сделать (setRedirect, заголовок), приводит к зацикливанию из-за слишком большого количества перенаправлений.

В настоящее время я пытаюсь использовать наблюдателя для setParam('return_url', "$customerRedirectUrl"), как описано в этом довольно популярном сообщении - Magento – перенаправление клиента из метода наблюдателя. Переменная $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?

Спасибо всем и каждому за вашу помощь!


person ooblek6000    schedule 29.05.2013    source источник


Ответы (2)


Я знаю, что этот пост немного устарел, но я вижу, что он сработал для моего собственного модуля.

Я запускаю перенаправление на 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);           
      }
    }
  } 
person Shawn Abramson    schedule 19.05.2014

Если у вас возникли проблемы с созданием экземпляра объекта с помощью $observer->getRequest(), попробуйте вместо этого использовать $observer->getEvent()->getFront()->getResponse(). Я считаю, что это зависит от того, какое событие слушает наблюдатель.

person Francis Kim    schedule 29.05.2013
comment
Спасибо, Фрэнсис, но я получаю ту же ошибку, что и раньше, что интересно тем, что ни один из новых методов, названных в вашем предложении, не сработал. Но да, все еще фатальная ошибка: вызов функции-члена setParam() для не-объекта. - person ooblek6000; 30.05.2013
comment
Можете ли вы попробовать var_dump($observer), $var_dump($observer->getRequest()) и т. д.? - person Francis Kim; 30.05.2013
comment
Ну, var_dump($observer) возвращает много разных вещей, но var_dump($observer->getRequest()) возвращает NULL. - person ooblek6000; 30.05.2013