• Блог
  • Пользователь или гость?

Проверить, авторизован ли пользователь на сайте или нет, можно несколькими способами — с помощью фильтров MODX и с помощью методов класса пользователя MODX. Начнём по порядку.

Фильтры MODX

При загрузке страницы MODX выставляет ряд системных плейсхолдеров, в том числе и плейсхолдеры текущего пользователя — modx.user.id и modx.user.username. В них MODX записывает id текущего пользователя и имя пользователя (используемое для логина), при условии конечно, что пользователь авторизован. Если же нет, то modx.user.id будет равен 0, а modx.user.username — "(anonymous)". Кстати, имя гостя можно изменить в системных настройках. К ним мы и будет применять специальные фильтры для проверки авторизации.

Этот способ отлично подойдёт для администраторов и контент-менеджеров, так как не требует от них знаний языка программирования PHP. Достаточно научиться пользоваться фильтрами MODX.

Начнём с самого простого. В шаблонах, ресурсах или чанках вставляем плейсхолдеры текущего пользователя с фильтрами сравнения.

// Если id пользователя больше 0, значит пользователь авторизован, если равен 0, то это гость
[[!+modx.user.id:gt=`0`:then=`Пользователь авторизован`:else=`Пользователь не авторизован`]]
// Тоже самое, только для другого плейсхолдера. Как правило используется редко
[[!+modx.user.username:is=`(anonymous)`:then=`Пользователь авторизован`:else=`Пользователь не авторизован`]]
// Плейсхолдеры нужно вызывать некешируемыми.

В результате, если пользователь залогинился, то при обработке тега парсер проверит условие фильтра и подставит вместо плейсхолдера блок с содержанием для пользователя. В этом блоке может быть или просто строка, или вызов чанка или вызов сниппета. А если пользователь не авторизовался, то выведется блок с содержанием для гостя.

Это простое решение подойдёт в большинстве случаев. Но у него есть одна тонкость — оно не учитывает контекты. Т.е. если пользователь ещё не авторизовался на сайте (контекст «web»), но авторизовался в админке (контекст «mgr»), то MODX считает пользователя авторизованным и присвоит плейсхолдеру modx.user.id идентификатор пользователя, авторизованного в админке. Из чего следует, что это решение не подойдёт, когда требуется проверка авторизации в конкретном контексте. Для таких случаев в MODX предусмотрены специальные фильтры —

  • isloggedin — возвращает TRUE, если пользователь авторизован в текущем контексте.
  • isnotloggedin — возвращает TRUE, если пользователь не авторизован в текущем контексте.
// Проверяем авторизацию в текущем контексте
[[!+modx.user.id:isloggedin:is=`1`:then=`Вы авторизованы`:else=`Вы не авторизованы`]] 
// Проверяем авторизацию в указанном контексте (web)
[[!+modx.user.id:isloggedin=`web`:is=`1`:then=`Вы авторизованы`:else=`Вы не авторизованы`]] 
Хочу раскрыть небольшой секрет. Два последних фильтра работают с любыми плейсхолдерами. Им не требуется идентификатор пользователя, так как эти фильтры проверяют авторизацию текущего пользователя используя переменную $modx->user. Поэтому можно проверить авторизацию пользователя даже так
[[!+tralala:isloggedin:is=`1`:then=`Вы авторизованы`:else=`Вы не авторизованы`]] 
// Или так
[[!+100500:isloggedin:is=`1`:then=`Вы авторизованы`:else=`Вы не авторизованы`]] 

Но для семантической ясности всё-таки лучше использовать modx.user.id.

Применение фильтров существенно упрощает процесс динамического формирования страницы, но немного нагружает парсер. Кроме того, у них есть один минус — они не работают в ajax режиме.

Программный способ проверки

Для проверки авторизации пользователя в сниппетах и плагинах программистам пригодится метод класса modUser::isAuthenticated(). Он возвращает TRUE, если пользователь авторизован в текущем контексте или в контексте, указанном в качестве аргумента. Как мы видим, он похож на фильтр isloggedin. И это не случайно, так как фильтр как раз и вызывает этот метод для проверки статуса пользователя.

// Проверка авторизации пользователя в текущем контексте
if ($modx->user->isAuthenticated()) { 
    // Выполняем код для пользователя 
}

На этом всё. Надеюсь, этот материал поможет новичкам разобраться как выводить разную информацию для гостей и для пользователей.

0   17674

Комментарии ()

  1. Воеводский Михаил 28 марта 2016 # 0
    Добавлю:
    Есть еще замечательный метод modX::getAuthenticatedUser($contextKey=''), который возвращает текущего авторизованного пользователя. Если не указан контекст, проверка идет для текущего контекста. Особенность $modx->user в том, что это публичное свойство может быть перезаписано в любой момент, а указанный метод берет сохраненный для контекста в сессии id пользователя, если такой существует, получает объект пользователя из БД и возвращает его. Если любой из шагов провалился (нет авторизации или некорректные данные в сессии), будет возвращен null.

    Такая проверка видится мне более корректной. Спасибо Николаю, который описывал работу с пользователями где-то в комментах хабра.
    1. Test 28 марта 2016 # 0
      Можно и так. Всё зависит от задачи. Но все-таки метод modX::getAuthenticatedUser($contextKey='') предназначен немного для другого.
      Пользователь не может переопределить $modx->user. Это может сделать только программист.И если программист программно изменил $modx->user у зарегистрированного пользователя, то он должен быть готов к непредсказуемым результатам. Так как в ядре много проверок $modx->user->isAuthenticated(). А этот метод вернёт false для измененного пользователя. И получается, что пользователь вроде авторизовался, а MODX этого не видит.

      П.С. Случайно под тестовой записью ответил:)

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.