Артем, привет. Спасибо за урок. Скажи, пожалуйста, есть ли разница между привязкой этого плагина к OnMODXInit и к OnHandleRequest? И еще: почему нужно проверять $modx->user? Нельзя ли обойтись второй частью условия - $modx->user->hasSessionContext($modx->context->key)?
Привет! OnMODXInit - это самое первое событие, генерируемое в системе. Оно генерируется всегда, когда инициализируется MODX, хоть в админке, хоть на фронте. А событие OnHandleRequest генерируется при инициализации класса modRequest (до обработки запроса, если мне память не изменяет). То есть оно генерируется во-первых только на фронтенде, во-вторых не самым первым в системе. Поэтому, если тебе нужно добавить в систему какую-то функциональность, которую планируешь использовать всегда и везде в разных частях, то эту фунциональность лучше добавлять через событие OnMODXInit. А OnHandleRequest использовать, например, только для работы на фронте. Проверять $modx->user и $modx->user->hasSessionContext лучше в паре, так как если по какой-либо причине в $modx->user будет null, то без первой части условия $modx->user->hasSessionContext вызовет фатальную ошибку.
Очень даже можно. Я в видео показал, как это делается без сторонних дополнений, чтобы зритель мог увидеть, как это работает при использовании нативных функций ядра modx.
Пробовал менять время через ini_set('session.gc_maxlifetime', 1440); Но суть в том что какое бы время не ставил, всегда при закрытии и открытии браузера вход не выполнен. И как я понял плейсхолдера user_authorized при повторном открытии браузера уже нет.
Не забывай о том, что в modx сессии переопределены и хранятся в базе данных, поэтому можешь копнуть в эту сторону. Проверь вообще, сохраняется ли какая-либо другая инофрмация в сессии после закрытия/открытия браузера. Может быть у тебя просто теряется Cookie с названием PHPSESSID. Кстати, проверь еще время жизни этого Cookie - может у тебя время жизни стоит "до закрытия браузера"
У PHPSESSID expires/max age равно Session, а вот value меняется при закрытии и открытии браузера. Точно так же происходит если зайти в админку manager, не ставя галочки Запомнить меня, если же ее поставить то value сохраняется и значение expires/max age уже на неделю вперед.
Пробовал после addSessionContext прописывать. setcookie('PHPSESSID', $_COOKIE["PHPSESSID"], time() + (33600 * 24 * 30)); Теперь вроде бы кука продлевается и сохраняется, но при входе в форму пользователь не авторизуется.
Достаточно внедрить динамическое hidden поле в форму через javascript и делать его проверку на стороне сервера и тогда проблема будет решена в 99% случаев. Как правило боты-авторегистраторы не выполняют javascript на странице и потому данную проверку не проходят.
Артем, привет. Спасибо за урок.
Скажи, пожалуйста, есть ли разница между привязкой этого плагина к OnMODXInit и к OnHandleRequest? И еще: почему нужно проверять $modx->user? Нельзя ли обойтись второй частью условия - $modx->user->hasSessionContext($modx->context->key)?
Привет!
OnMODXInit - это самое первое событие, генерируемое в системе. Оно генерируется всегда, когда инициализируется MODX, хоть в админке, хоть на фронте. А событие OnHandleRequest генерируется при инициализации класса modRequest (до обработки запроса, если мне память не изменяет). То есть оно генерируется во-первых только на фронтенде, во-вторых не самым первым в системе.
Поэтому, если тебе нужно добавить в систему какую-то функциональность, которую планируешь использовать всегда и везде в разных частях, то эту фунциональность лучше добавлять через событие OnMODXInit. А OnHandleRequest использовать, например, только для работы на фронте.
Проверять $modx->user и $modx->user->hasSessionContext лучше в паре, так как если по какой-либо причине в $modx->user будет null, то без первой части условия $modx->user->hasSessionContext вызовет фатальную ошибку.
Почему нельзя использовать сниппет Login?
Очень даже можно. Я в видео показал, как это делается без сторонних дополнений, чтобы зритель мог увидеть, как это работает при использовании нативных функций ядра modx.
А есть ссылка на гитхаб или просто какой то текстовый файл на все вышеперечисленное?
К сожалению, наверное, нет. Видео записывал раньше, чем стал публиковать материалы на GitHub
Как раз то что мне надо
Понабежали Павлы в комментарии )
А как сделать кнопку запомнить меня?
На самом деле кнопка "Запомнить меня" просто ставит увеличенное время хранения сессии пользователя.
Пробовал менять время через ini_set('session.gc_maxlifetime', 1440); Но суть в том что какое бы время не ставил, всегда при закрытии и открытии браузера вход не выполнен. И как я понял плейсхолдера user_authorized при повторном открытии браузера уже нет.
Не забывай о том, что в modx сессии переопределены и хранятся в базе данных, поэтому можешь копнуть в эту сторону. Проверь вообще, сохраняется ли какая-либо другая инофрмация в сессии после закрытия/открытия браузера. Может быть у тебя просто теряется Cookie с названием PHPSESSID. Кстати, проверь еще время жизни этого Cookie - может у тебя время жизни стоит "до закрытия браузера"
У PHPSESSID expires/max age равно Session, а вот value меняется при закрытии и открытии браузера. Точно так же происходит если зайти в админку manager, не ставя галочки Запомнить меня, если же ее поставить то value сохраняется и значение expires/max age уже на неделю вперед.
Пробовал после addSessionContext прописывать. setcookie('PHPSESSID', $_COOKIE["PHPSESSID"], time() + (33600 * 24 * 30));
Теперь вроде бы кука продлевается и сохраняется, но при входе в форму пользователь не авторизуется.
Как обычно, никакой защиты от спама. Гарантирую массу авто регистраций и санкции со стороны хостинга :(
Достаточно внедрить динамическое hidden поле в форму через javascript и делать его проверку на стороне сервера и тогда проблема будет решена в 99% случаев. Как правило боты-авторегистраторы не выполняют javascript на странице и потому данную проверку не проходят.
сыкотно коммент ставить. Павлы одни )))