Перенаправление 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'));
}
}
Но у меня проблема, я не могу попасть на эту страницу, потому что она бесконечно перенаправляет меня. Какие-нибудь советы?
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'));
}
}
Улучшенное решение:
- перенаправление для каждого маршрута, кроме "клиента". Это не помешает войти в систему, создать учетную запись, сбросить пароль... и другие действия клиента в любом случае уже перенаправляют на вход в систему.
- установите флаг
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'))