Перенаправление Magento со всех страниц, если вы не вошли в систему


Итак, мне нужно перенаправить пользователя на какую-то страницу (это может быть CMS или клиент/учетная запись), если он не вошел в систему. И на этой странице (CMS или клиент/учетная запись) У меня будет форма для входа/регистрации. Итак, я сделал наблюдателя для события controller_action_predispatch и метода, который будет его реализован, я сделал:

public function redirectNotLogged(Varien_Event_Observer $observer)
    {
        if(! Mage::helper('customer')->isLoggedIn()){
            Mage::app()->getFrontController()->getResponse()->setRedirect(Mage::getUrl('customer/account'));
        }
    }

Но у меня проблема, я не могу попасть на эту страницу, потому что она бесконечно перенаправляет меня. Какие-нибудь советы?

Author: Marius, 2014-02-28

2 answers

Вы получаете бесконечный цикл, потому что при перенаправлении на Mage::getUrl('customer/account') ваш наблюдатель вызывается снова и перенаправляет вас на ту же страницу.
Вам нужно добавить правило для случаев, когда перенаправление не выполняется.
Что-то вроде этого.

public function redirectNotLogged(Varien_Event_Observer $observer)
{
    $action = strtolower(Mage::app()->getRequest()->getActionName());
    $controller = strtolower(Mage::app()->getRequest()->getControllerName());
    $openActions = array(
        'create',
        'createpost',
        'login',
        'loginpost',
        'logoutsuccess',
        'forgotpassword',
        'forgotpasswordpost',
        'resetpassword',
        'resetpasswordpost',
        'confirm',
        'confirmation'
    );
    if ($controller == 'account' && in_array($action, $openActions)) {
         return $this; //if in allowed actions do nothing.
    }
    if(! Mage::helper('customer')->isLoggedIn()){
        Mage::app()->getFrontController()->getResponse()->setRedirect(Mage::getUrl('customer/account/login'));
    }
}
 10
Author: Marius, 2014-02-28 08:18:26

Улучшенное решение:

  • перенаправление для каждого маршрута, кроме "клиента". Это не помешает войти в систему, создать учетную запись, сбросить пароль... и другие действия клиента в любом случае уже перенаправляют на вход в систему.
  • установите флаг no-dispatch. Это важно, потому что в противном случае действие выполняется и страница отображается, даже если она не будет показана пользователю
  • используйте Mage_Customer_Model_Session::authenticate() для проверки входа и перенаправления. Это также сохранит текущий запрошенный URL-адрес в сеанс и перенаправление обратно после входа в систему

Код:

public function redirectNotLogged(Varien_Event_Observer $observer)
{
    $controller = $observer->getControllerAction();
    if ($controller->getRouteName() === 'customer') {
        return;
    }
    if (! Mage::getSingleton('customer/session')->authenticate($controller)) {
        $controller->setFlag('', 'no-dispatch', true);
    }
}

Если вы хотите использовать пользовательскую страницу входа вместо customer/account/login, вы можете передать этот пользовательский URL-адрес в качестве второго параметра authenticate(), но вам также необходимо дополнительно проверить это действие, чтобы снова не получить бесконечный цикл перенаправления:

if ($controller->getFullActionName() === 'your_custom_page') {
    return;
}

И

authenticate($controller, Mage::getUrl('your/custom/page'))
 3
Author: Fabian Schmengler, 2020-06-15 08:30:17