Пользователь или гость?
Проверить, авторизован ли пользователь на сайте или нет, можно несколькими способами — с помощью фильтров 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()) { // Выполняем код для пользователя }
На этом всё. Надеюсь, этот материал поможет новичкам разобраться как выводить разную информацию для гостей и для пользователей.
Комментарии ()
Вы должны авторизоваться, чтобы оставлять комментарии.
Есть еще замечательный метод modX::getAuthenticatedUser($contextKey=''), который возвращает текущего авторизованного пользователя. Если не указан контекст, проверка идет для текущего контекста. Особенность $modx->user в том, что это публичное свойство может быть перезаписано в любой момент, а указанный метод берет сохраненный для контекста в сессии id пользователя, если такой существует, получает объект пользователя из БД и возвращает его. Если любой из шагов провалился (нет авторизации или некорректные данные в сессии), будет возвращен null.
Такая проверка видится мне более корректной. Спасибо Николаю, который описывал работу с пользователями где-то в комментах хабра.
Пользователь не может переопределить $modx->user. Это может сделать только программист.И если программист программно изменил $modx->user у зарегистрированного пользователя, то он должен быть готов к непредсказуемым результатам. Так как в ядре много проверок $modx->user->isAuthenticated(). А этот метод вернёт false для измененного пользователя. И получается, что пользователь вроде авторизовался, а MODX этого не видит.
П.С. Случайно под тестовой записью ответил