Регистрация пользователей на MODX Login

В этой статье рассмотрим, как с помощью пакета Login реализовать регистрацию новых пользователей на сайте, а также выполнить их активирование по ссылке из письма.
Что такое Login?
Login - это дополнение для MODX Revolution, которое предназначено для реализации на сайте всего того, что необходимо для работы с пользователями.
Пакет Login содержит следующие сниппеты:
Register
- обработка формы регистрации и создание нового пользователя в MODX;ConfirmRegister
- активирование учетной записи пользователя (подтверждение регистрации осуществляется путем перехода пользователя по ссылке из письма);Login
- выполнение аутентификации пользователя, обработки формы входа, а также выход из системы;ForgotPassword
- выполнение действий по восстановлению пароля;ResetPassword
- сброс пароля, используется вместе сForgotPassword
;ChangePassword
- смена пароля, используется вместе сLogin
;UpdateProfile
- редактирование профиля пользователя, вошедшего в систему;Profile
- осуществляет установку всех полей текущего или указанного пользователя в плейсхолдеры (их можно использовать для отображение информации о пользователе в профиле);
В этой статье рассмотрим первые два сниппета: Register
и ConfirmRegister
.
Установка пакета Login
Для установки компонента Login в CMS MODX Revolution открываем админку и переходим на страницу «Менеджер пакетов» (в главном меню пункт «Пакеты -> Установщик»). Нажимаем на кнопку «Загрузить пакеты», в поле поиска вводим «Login». После того как этот пакет будет найден, выполняем его загрузку и установку..

Создание группы пользователей и ресурсов «Users»
Открываем страницу «Контроль доступа» (Шестерёнка -> Контроль доступа). В ней кликаем на кнопку «Создать группу пользователей».

В диалоговом окне «Создать группу пользователей» заполняем следующие поля:
- название - Users;
- описание - Зарегистрированные пользователи;
- создать параллельную группу ресурсов - Да;
- политика системы управления - (нет политики).

После этого нажимаем на кнопку «Сохранить». На странице «Контроль доступа» должна появиться только что созданная группа пользователей, т.е. «Users».

Проверяем, появилась ли новая группа ресурсов «Users». Эта группа ресурсов была создана во время создания группы пользователей «Users» (включенная опция «Создать параллельную группу ресурсов»). Группа ресурсов «Users» необходима для помещения в неё ресурсов, доступ к которым будут иметь пользователи, расположенные в группе «Users». Это будут ресурсы «Личный кабинет», «Смена пароля» и «Редактирование данных». Анонимные пользователи не смогут получить доступ к этим ресурсам.

Настраиваем права группы пользователей «Users». Для этого на странице «Контроль доступа» нажимаем правой кнопкой мыши на группу «Users» и выберем пункт «Редактировать группу пользовател».

На странице «Контроль доступа > Users» нажимаем правой кнопкой мыши на строку «web» и выбираем пункт «Редактировать доступ к контексту».

В диалоговом окне «Доступ групп пользователей к контексту» устанавливаем политику доступа на значение «Load, List and View» и нажимаем на кнопку «Сохранить».

Создание ресурсов и настройка доступа к ним
Создадим следующие страницы (ресурсы):
- Регистрация (2);
- Подтверждение регистрации (3);
- Авторизация (4);
- Восстановление пароля (5);
- Личный кабинет (6);
- Изменение пароля (7);
- Редактирование данных (8).

Настроим доступ к страницам «Личный кабинет», «Изменение пароля» и «Редактирование данных». Они должны быть доступны только зарегистрированным пользователям (т.е., Users).
Откроем страницу «Группы ресурсов» (Сайт -> Группы ресурсов) и перенесём из правого дерева в группу «Users» вышеперечисленные ресурсы.

Кроме этого, группе пользователей (аноним) необходимо установить доступ «Load only». Это необходимо сделать для того чтобы они могли загружать страницы из группы ресурсов Users, проверять права доступа и получать ошибку 403 «Доступ запрещен». Если (аноним) не дать доступ «Load only», то для них эти страницы не будут существовать, и они получат ошибку 404 «Не найдено».
Порядок действий: Шестерёнка -> Контроль Доступа -> (аноним) -> Редактировать группу пользователя (правой кнопкой мыши) -> вкладка «Права доступа» -> Группы ресурсов -> Добавить группу ресурсов.
В диалогово окне «Добавить группу ресурсов»:
- Группа ресурсов : Users;
- Контекст: web;
- Минимальная роль: Member (9999);
- Политика доступа: Load Only.

Последнее что необходимо ещё сделать, это указать в качестве страницы ошибки 403 «Доступ запрещен» ресурс «Авторизация» (id = 4). Осуществляется это в настройках системы с помощью параметра unauthorized_page
. Теперь если анонимный пользователь захочет попасть на закрытые страницы, ему выведется страница «Авторизация».

Регистрация пользователей с использованием Register
Регистрация пользователей будет осуществляться на ресурсе «Регистрация».
Для этого в содержимое ресурса поместим:
- HTML форму;
- вызов сниппета
Register
для обработки этой формы и создания пользователя.
Код формы:
<div class="container pt-3">
<div class="card text-dark bg-white mx-auto mb-3" style="max-width: 30rem;">
<div class="card-header">Регистрация</div>
<div class="card-body">
[[!+error.message:eq=``:then=`
<form class="form" action="[[~[[*id]]]]" method="post">
<input type="hidden" name="nospam" id="nospam" value="[[!+reg.nospam]]" />
<div class="mb-3">
<label for="fullname" class="form-label">Имя</label>
<input type="text" name="fullname" class="form-control[[!+reg.error.fullname:notempty=` is-invalid`]]" value="[[!+reg.fullname]]">
<div class="invalid-feedback">[[!+reg.error.fullname]]</div>
</div>
<div class="mb-3">
<label for="email" class="form-label">Email</label>
<input type="email" name="email" class="form-control[[!+reg.error.email:notempty=` is-invalid`]]" value="[[!+reg.email]]">
<div class="invalid-feedback">[[!+reg.error.email]]</div>
</div>
<div class="mb-3">
<label for="password" class="form-label">Пароль</label>
<input type="password" name="password" class="form-control[[!+reg.error.password:notempty=` is-invalid`]]" value="[[!+reg.password]]">
<div class="invalid-feedback">[[!+reg.error.password]]</div>
</div>
<div class="mb-3">
<label for="password_confirm" class="form-label">Введите пароль ещё раз</label>
<input type="password" name="password_confirm" class="form-control[[!+reg.error.password_confirm:notempty=` is-invalid`]]" value="[[!+reg.password_confirm]]">
<div class="invalid-feedback">[[!+reg.error.password_confirm]]</div>
</div>
<input type="submit" name="login-register-btn" class="btn btn-primary" value="Отправить">
</form>
`:else=`[[!+error.message]]`]]
</div>
</div>
</div>
Структура формы выполнена в соответствии с Bootstrap 5.

Код вызова сниппета Register
:
[[!Register?
&submitVar=`login-register-btn`
&activation=`1`
&activationEmailSubject=`Подтверждение регистрации`
&activationResourceId=`3`
&successMsg=`Спасибо за регистрацию. На вашу электронную почту [[!+reg.email]] отправлено письмо, содержащее ссылку, необходимую для активации аккаунта. Перейдите по ссылке в письме, чтобы завершить процедуру регистрации.`
&usergroups=`Users`
&usernameField=`email`
&passwordField=`password`
&validate=`nospam:blank,
password:required:minLength=^8^,
password_confirm:password_confirm=^password^,
fullname:required,
email:required:email`
&placeholderPrefix=`reg.`
]]
Как это всё работает?
1. После нажатия на кнопку «Отправить» данные отправляются на эту же страницу (указывается это посредством атрибута action
):
<form class="form" action="[[~[[*id]]]]" method="post">
2. Сниппет Register проверяет наличие в $_POST
ключа login-register-btn
, т.е. то что указали в параметре &submitVar
. Так как при этом запросе страницы он есть, то Resister
начинает выполнять валидацию полей.
Этот ключ мы установили в submit с помощью name="login-register-btn"
:
<input type="submit" name="login-register-btn" class="btn btn-primary" value="Отправить">
3. Валидация полей осуществляется в соответствии с требованиями указанными в параметре &validate
:
&validate=`nospam:blank,
password:required:minLength=^8^,
password_confirm:password_confirm=^password^,
fullname:required,
email:required:email`
4a. Если какое-то поле не проходит валидацию, то сообщение с ошибкой помещается в соответствующий плейсхолдер. Например, для поля email
ошибка будет выводиться в [[!+reg.error.email]]
.
Выражение [[!+reg.error.email:notempty=` is-invalid`]]
используем для добавления к полю класса is-invalid
, чтобы применились стили Bootstrap 5:

4b. При успешной валидации и создании объекта modUser
, выполняется отправка пользователю на указанный email письма для завершения регистрации. В этом письме содержится ссылка, по которой ему нужно перейти, и тем самым активировать учетную запись.
Пользователю (объекту modUser
) в качестве значения поля active
устанавливается 0
.
В плейсхолдер [[!+error.message]]
помещается сообщение об успехе. Берётся контент из параметра &successMsg
.
При этом форма уже не выводиться, а только значение [[!+error.message]]
:
[[!+error.message:eq=``:then=`
<form class="form" action="[[~[[*id]]]]" method="post">
...
</form>
`:else=`[[!+error.message]]`]]
5. При переходе по ссылке он попадает на страницу «Подтверждение регистрации». Сниппет ConfirmRegister
получает из ссылки GET-параметры id
и lp
. После этого проверяет их на соответствие, и в случае успеха активирует пользователя, т.е. установки полю active
значения 1
.
Параметры сниппета Register
Параметры, используемые в вызове сниппета Register
:
Имя параметра | Описание |
---|---|
submitVar | Ключ, значение которого проверяется перед тем как сниппет Register начнёт обрабатывать форму. Если в качестве значения этого параметра указать пустую строку или false , то сниппет Register будет обрабатывать форму при получении любого Post запроса. |
activation | Определяет стоит ли подтверждать email, указанный в регистрационной форме, или нет. Т.е. пользователь не будет активированным до тех пор, пока он не подтвердит свой email. Значение: 1 (да, необходимо). |
activationEmailSubject | Тема письма, в котором приходит ссылка для активирования учётной записи. |
activationEmailTpl | Шаблон письма, содержащий информацию и ссылку для активирования учётной записи. Будем использовать шаблон по умолчаию: lgnActivateEmailTpl. |
activationResourceId | Идентификатор ресурса, в котором находится сниппет с помощью которого осуществляется активирование учётной записи пользователя. Значение: 3 (id ресурса "Подтверждение регистрации"). |
successMsg | Отображает указанное сообщение после успешной отправки регистрационной формы. Этот параметр работает тогда, когда не используется параметр submittedResourceId. |
submittedResourceId | Перенаправляет пользователя на указанный ресурс после успешной отправки регистрационной формы. |
usergroups | Список (через запятую) названий групп пользователей или идентификаторов этих групп, в которые необходимо добавить только что зарегистрированного пользователя. Значение: Users. |
usernameField | Имя поля формы, содержащее в качестве значения имя пользователя. Значение: email. |
passwordField | Имя поля формы, содержащее пароль пользователя. Значение: password. |
validate | Список (через запятую) полей для валидации (проверки). Указывается так: имя:валидатор (например, username: required , email:required ). Валидаторы можно соединять. Например, email:email:required . |
placeholderPrefix | Префикс для плейсхолдеров. Например, значения плейсхолдеров для поля email с учётом префикса reg. : [[!+reg.email]] (значения поля), [[!+reg.error.email]] (значение ошибки). |
Активирование аккаунта пользователя
Активирование аккаунта пользователя будем выполнять на странице «Подтверждение регистрации». Осуществлять это будем посредством сниппета ConfirmRegister
. Принцип его работы заключается в том, что он получает параметры URL и проверяет их на соответствие. В случае успеха он устанавливает полю active
значение 1. После этого пользователь может уже авторизоваться на сайте, т.е. войти под своей учётной записью.

Содержимое ресурса «Подтверждение регистрации» (вызов сниппета ConfirmRegister
):
[[!ConfirmRegister?
&authenticate=`1`
&redirectTo=`6`
&errorPage=`6`
]]
Описание используемых параметров сниппета ConfirmRegister
:
Имя параметра | Описание |
---|---|
authenticate | Проверка подлинности и авторизация пользователя в текущем контексте (после подтверждения регистрации). Значение: 1 (да, выполнить). |
redirectTo | После успешного подтверждения, перенаправляет пользователя на ресурс, имеющий id = 6 (личный кабинет). |
errorPage | Перенаправляет пользователя на страницу (id = 6 - личный кабинет), если он попытается получить доступ к ней уже после активирования своего аккаунта. |
Следующий шаг – это создать формы для входа и сброса пароля.
Добрый вечер! Подскажите пожалуйста, как сделать так, чтобы письмо с потдверждением регистрации приходило с заданного адреса, например как у вас no-reply@itchief.ru , а не с адреса хостинга noreply@unverified.beget.ru ?
Здравствуйте! MODX берёт email по умолчанию из параметра mail_smtp_user. Этот параметр находится в системных настройках, в разделе «Почта».
Спасибо большое за помощь)
Успешно все настроил, но не могу понять как сделать параллельную регистрацию.
Нужно чтобы при регистрации аккаунта данные записывались во вторую БД (но тут пароль должен быть захеширован в blowfish). Также при изменении пароля в ЛК, происходила смена пароля и во второй БД.
Можете подсказать?
Использовал &postHooks=`hookRegister`
Добавил его
[[!Register?
&submitVar=`login-register-btn`
&activation=`1`
&activationEmailSubject=`Подтверждение регистрации`
&activationResourceId=`3`
&successMsg=`Спасибо за регистрацию. На вашу электронную почту [[!+reg.email]] отправлено письмо, содержащее ссылку, необходимую для активации аккаунта. Перейдите по ссылке в письме, чтобы завершить процедуру регистрации.`
&usergroups=`Users`
&usernameField=`fullname`
&passwordField=`password`
&validate=`nospam:blank,
password:required:minLength=^8^,
password_confirm:password_confirm=^password^,
fullname:required:minLength=^6^,
email:required:email`
&placeholderPrefix=`reg.`
&postHooks=`hookRegister`
]]
Сниппет hookRegister:
<?php
define('MODX_CORE_PATH', '/path/to/revo/core/');
define('MODX_CONFIG_KEY','config');
require_once MODX_CORE_PATH. 'model/modx/modx.class.php';
$host = '194.***.***.**0';
$username = 'root';
$password = '123456';
$dbname = 'test';
$port = 3306;
$charset = 'utf8mb4';
$dsn = «mysql:host=$host;dbname=$dbname;port=$port;charset=$charset»;
$xpdo = new xPDO($dsn, $username, $password);
$login = $hook->getValue('fullname');
$pass = $hook->getValue('password');
$email = $hook->getValue('email');
$ip = $_SERVER[«REMOTE_ADDR»];
$gamepass = base64_encode(hash('whirlpool', $pass, true));
$results = $xpdo->exec(«INSERT INTO accounts(login, password, lastactive, accessLevel, lastIP, lastServerID, l2email) VALUES('».$login."', '".$gamepass."', '1', '0', '".$ip."', '1', '".$email."')");
$stmt = $modx->prepare($results);
$stmt->execute();
Данные заносятся в обе БД. Это уже радует.
Но столкнулся с очередной трудностью… в кастомную БД данные заносятся сразу после нажатия на кнопку регистрации, без подтверждения активации через почту. Как можно это поправить?
Есть один вопрос, после того как пользователь авторизовался, я его помечаю как «заблокированный» в админке, но у пользователя все равно остается активна сессия и он может дальше перемещаться по сайту и быть при этом авторизованным.
Предусмотрено ли пакетом login такой функционал чтобы заблокированного пользователя выбивало на страницу входа или блокировки?
Я делаю это все в modx revo
А зачем в класс <input> добавляете сообщение об ошибке [[!+reg.error.email]]?
и код формы, выводит просто
prnt.sc/1zlvOmCTi81p
Большое спасибо за вашу информацию! Все понятно и очень хорошо сформулировано!
Такой вопрос: после успешной регистрации — переход на ресурс с ID, прописанным в submittedResourceId.
В этом ресурсе хочу прописать: «Для завершения регистрации отправлено сообщение на ваш email: (и вот тут надо написать email со страницы регистрации).» Не могу сообразить, как можно затянуть на дополнительный ресурс то, что у нас в ресурсе с формой регистрации обозначено как и как
Для этого можно, например, создать сниппет getEmail со следующим содержимым:
А затем в нужном месте ресурса, id которого вы указали в submittedResourceId, вызвать его:
И поняла принцип))
Thanks for registering! To activate your new account, please click on the following link:
If you did not request this message, please ignore it.
Thanks,
Site Administrator
Как думаете, почему ссылка подтверждения отправляется пустой?
Подскажите, пожалуйста, с чём может быть связано такое:
При запросе страниц, доступных только авторизованным пользователям (Группа Users), посетитель (Аноним) получает ошибку 404, а не страницу Авторизации? Хотя этот параметр указан в настройках. Спасибо!
Системные настройки -> Core -> Почта
— SMTP аутентификация — Да
SMTP хосты — smtp.mail.ru
SMTP пароль — пароль от почтового ящика.
SMTP номер порта — 25 или 2525 (либо 465, и в этом случае также нужно указать «ssl» в пункте «SMTP префикс для соединений»). (Этот параметр я взял на странице хостинг провайдера (в моём случае Timeweb))
SMTP пользователь — почтовый ящик, с которого будет происходить отправка.
Использовать SMTP — Да
— Вобщем, частично это помогло: после регистрации, если перейти оттуда на страницу авторизации, а оттуда на страницу восстановления пароля и вбить почту и нажать «восстановить пароль» — письмо приходит на указанную почту. Но при регистрации письмо на почту не отправляется ни в какую, что я только не делал. Я уже удалил последнюю версию пакета Login (версия 1.9.9) и скачал с репозитория версию 1.9.7 — всё равно всё то же самое — снипет регистрации не отправляет письмо на почту после создания пользователя. Никаких ошибок не выдаёт. У кого это заработало? Какая версия Modx и какая версия пактеа Login у вас?) Настраивали ли вы дополнительно что-либо (то что не описано в статье)?
Также желательно настроить DKIM-подпись. Она нужна для того, чтобы подтвердить, что адрес, указанный в поле «От кого», является реальным адресом.
Подскажите пожалуйста, возможно ли реализовать автоматическую авторизацию, по ссылке из письма электронной почты?
Да, для этого можно создать на сайте php-скрипт, на который будет переходить пользователь при нажатии на ссылку в письме и передовать ему необходимые данные для создания и авторизации пользователя.
Например:
Подскажите, пожалуйста, почему могут не приходить уведомления о подтверждении регистрации с сайта (modx rev), если указать mail. ru или yandex (пока сами тестируем, сайт не запущен в массы)?
На адрес Gmail приходит через секунду, а на другие — ничего. В спаме пусто.
Заранее спасибо!
Подскажите пожалуйста, как можно отредактировать введенные при регистрации данные, перед созданием Пользователя.
Допустим в электронной почте все буквы сделать маленькими, если пользователь указал большие
и убрать лишние пробелы в начале и в конце строки.
При редактировании данных, я это реализовал. Не получается это сделать именно при регистрации.
Это можно выполнить через preHooks. Для этого вам нужно создать сниппет и указать его в качестве значения параметру preHooks.
Например:
В этом сниппете (в данном случае в actionBeforeRegister) необходимо написать нужные преобразования.
Например, преобразуем fullname к нижнему регистру:
Принцип работы с пользователями в MODX следующий. При заходе нового пользователя на сайт, ему в базе данных в таблице modx_session создаётся запись, в которую сохраняется id сессии, а также некоторые другие данные. Также id сессии отправляется пользователю в составе ответа сервера в виде cookies, которые его браузер сохраняет в ключе MODSESSID. Когда этот пользователь уже будет запрашивать другую страницу, вместо с запросом на сервер теперь уже отправится его MODSESSID в составе cookies. При получении этого запроса сервер теперь будет уже знать, что это тот же пользователь.
Когда пользователь не авторизирован в MODX, он имеет в качестве id пользователя значение 0. Это значение хранится в таблице modx_session в поле data этого пользователя. Определяется пользователь в этой таблице по id сессии.
При авторизации ищется запись этого пользователя в modx_session по id сессии и записывается в неё (поле data) id пользователя.
При использовании фильтра «modx.user.id:isloggedin:is» MODX смотрит id пользователя в modx_session. Если это значение больше или равно 1, то это значит, что пользователь авторизован. В противном случае – нет.
Данные пользователей находятся в таблицах «modx_users» и «modx_user_attributes».
Добавление новых полей осуществляется через расширенные поля. Эти поля находятся на странице пользователя на вкладке «Дополнительные поля данных».
Работа с ними в коде выполняется так:
Условно говоря есть дополнительное поле у пользователя tipe и вот чтобы при регистрации сразу уходило tipe=«fl», при этом чтобы данная информация не выводилась в форме.
Может кому пригодится — вот текст сниппета, который вызывается в postHooks
под себя нужно поправить наименование дополнительного поля и его значение.
Для того чтобы меню выпадало вправо добавьте к нему соответствующие стили:
Подскажите, пожалуйста, откуда он взялся и почему он должен быть?
If the «submittedResourceId» property is not specified, Register will simply display a success message to the [[+error.message]] placeholder. This is the value of the «successMsg» property. For example:
Copy
Will display «Thanks for registering!» in the [[+error.message]] property in the Resource that your [[Register]] snippet call is in after the User submits a valid registration form.
— А вот и ответ, это связано с работой этого сниппета, а название дали такое, чтобы запутать начинающих разработчиков, что очень «умно»
Но всё равно странно, что вы не объясняете в работе своего плагина такие супер неочевидные вещи, моё пожелание для развития вашего ресурса, не оставлять пробелов по объясняемой теме, толку объяснять что-то не до конца, тем более вы проделали 999% работы, благодарен за понимание и спасибо за ваш труд.
Плейсхолдеры в большинстве случаев в MODX устанавливаются сниппетами. Это такие вставки, которые потом заменяются на что-то определённое (в основном на значения, которые генерирует сниппет в процессе своего выполнения).
В этом случае как вы правильно разобрались это делает сниппет Register. Именно он устанавливает плейсхолдер [[+error.message]]. Значение, которое вместо него будет выведено определяется с помощью параметра successMsg, но только в случае успешной отправки формы. В противном случае (если форма просто выводится или она содержит не корректные значения в полях), то парсер MODX установит в качестве значения плейсхолдера [[+error.message]] пустую строку, т.к. его значение никто не установил.
В коде мы проверяем равен ли плейсхолдер пустой строке и если да, то выводим форму. А если нет, то значит форма успешно отправлена, и значит мы выводим уже не форму, а сообщение, в котором благодарим пользователя за регистрацию. Т.е. само значение плейсхолдера error.message.
А если я новичок в Modx и у меня постоянно полно «дурацких вопросов», не подскажете, где этим сообществом принято обмениваться инфой?)
Столкнулся с такой проблемой: при переходе по ссылке активации аккаунта перекидывает на ресурс который указан в errorPage. Залез в контроллер ConfirmRegister и увидел что на строке метода getUser не может найти пользователя. При регистрации в username записывается email пользователя. При попытке вывести $this->username в журнал ошибок в журнале ошибок при нажатии на «Обновить» просто висит сообщение «В процессе» и всё. Ничего не понимаю, раньше таких проблем с этим login'ом не было, а на этом сайте уже недели 3 бьюсь с личным кабинетом (то авторизация не работала, то теперь активация), хоть самому с нуля аналог login'а пиши…
Не знаю с чем это может быть связано. Попробуйте переустановить MODX и компонент Login.
Даже при пустом поле passwdAgain регистрация происходит.
Делаю всё по инструкции. passwdAgain:passwdAgain=^passwd^ не срабатывает. В чем причина?
Изменила строку на passwdAgain:required:passwdAgain=^passwd^.
Теперь при пустом значении регистрация не происходит, требует заполнить passwdAgain, но не проверяет на равенство с passwd.
Помогите, пожалуйста.
А происходит это потому, что стандартный валидатор Formit имеет имя «password_confirm». т.е. правильная строка будет passwdAgain:password_confirm=^passwd^
Но у меня появилась другая проблема после нажатия на кнопку выход в личном кабинете — сессия не закрывается. Меня просто перебрасывает на главную страницу.
Спасибо за крайне полезный ресурс, много полезной информации. Прошу, по возможности, помочь с авторизацией. Проблема та же, что была у Дмитрия (тема от 03 августа 2018) — письма для подтверждения приходят по два раза. Я перерыл уже всё, что возможно, но так ничего и не нашёл :( Поставил автогенерацию пароля и стало ещё интереснее — пароли в письмах разные (раньше приходило два с одинаковым паролем, но разным параметром «lp»). Срабатывает из них только одно, последнее, первое явный «глюк». Вот RegisterFormTpl:
Вот страница регистрации:
Почтовый темплейт «из коробки», кеши сбрасывал, в логах пусто…
Что с этим можно ещё сделать?
Скорее всего у вас сниппет вызывается 2 раза, проверьте редиректы.
Откройте консоль разработчика в браузере, выберите вкладку Network, поставьте галочку «Preserve log», чтобы лог не очищался при перезагрузке странице и проанализируйте его.
Видимо, не судьба :(
Криво, в общем, но если кому поможет — имейте в виду.
А подскажите пожалуйста, какие-то настройки надо прописывать для почты MODX при реализации этого механизма с регистрацией пользователей? Пока что ничего не отправляет при регистрации тестового пользователя.
Если что-то не работает нужно смотреть журнал ошибок (Управление -> Отчеты -> Журнал ошибок).
У меня встал вопрос. Создал я дополнительную таблицу для пользователей (, а не стал добавлять свойства в user_attribute значения в поле extended или добавлять поля к этой таблице). Посчитал, что так будет лучше, на случай обновления MODx.
Подскажите, пожалуйста, кто знает, куда чего нужно дописать, чтобы ID новосозданного пользователя добавлялся в поле собственной таблицы? Со связью 1-к-1. Как с таблицей user_attributes. Предполагаю, что нужно где-то в файле процессора создания пользователя дописать строки со связями с этой таблицей. И в модель изменения нужно внести. Но вот докумекать пока не могу, где именно эти изменения сделать. Дайте наводку или на водку, пожалуйста))
Спасибо за подробную инструкцию.
У меня почему-то администратор не может получить доступ к страницам из созданной группы.
30 секунд ожидания и далее 502 ошибка.
Пользователь из этой группы страницы видит, полностью неавторизованный перекидывается на вход. С админом что-то ничего не прокатывает, в том числе добавление ему прав доступа на созданную группу ресурсов.
Во-первых спасибо за статьи, мне как начинающему свой путь на данном поприще они очень полезны. Помогите пожалуйста разобраться со следующей проблемой: сайт не отправляет письмо для авторизации пользователя со ссылкой для подтверждения. modUser отрабатывает и неактивный user создается в группе Users, но письмо не отправляется на почту (спам тоже проверял). В чем может быть проблема?
1) И при регистрации и при сбросе пароля сервер (локалка) отправляет 2 одинаковых письма. И при сбросе пароля как то не так работает — ссылки в обоих письмах уже «expaired»
2) Вы не выложили код личного кабинета, я так понял, за него отвечает [[!Profile]], но нужна еще форма какая то. взял ее код с другого ресурса, так у меня поля профайла показываются как пустые поля формы, не заполняются плейсхолдерами. возможно где то рассогласования имен не заметил. Но почему форма? Личный кабинет — это ж не «Изменение данных»… там просто все должно быть указано обычным тескстом…
3) ах да, еще третий вопрос. Почему все в инете создают окно общее для имени и фамилии? это очень неудобно для дальнейшей работы с базами и автоматизацией некоторых процессов. Потом возможны дубли и пр. и пр. Я создавал в форме регистрации еще одну строку, переименовывал обе, старался то же самое сделать в форме профайла… Но они пустые. Может я что то не учел в работе сниппета Profile? Вы о нем не написали.
4) У меня еще задача осложняется тем, что мне нужны три группы разных пользователей, с разным набором полей профиля, а значит — с разными регистрационными формами. При этом пункт в меню «Личный кабинет» — один… Там логику надо писать с переадресацией как я понимаю? На профиль каждого типа?
Про третий пункт… Это зависит от задачи. В MODX поле fullname (полное имя) — это не обязательно имя и фамилия, это вообще может быть ник, под которым будут отображаться записи, созданные этим пользователем.
Про четвёртый пункт… Переадресация никакая не нужна. На этой страницы сначала определите, к какой группе принадлежит авторизированный пользователь, а затем уже формируйте страницу с нужными данными.
1) Сниппетов дублей нет… Скажите, а не может MODX отправлять письмо, и OpenServer тоже? потому что я настроил OpenServer на отправку, но в MODX ничего не настраивал… тем не менее может он берет настройки OpenServer и дублирует сообщения? Хотя с другой стороны, пока я не настроил OpenServer на отправку — сообщения в папке хранились. Что если убрать настройки с сервера, а MODX почту настроить? пока у меня только эта версия.
3) Спасибо, Я так и переопределил это поле — как никнейм… а через «Extended» добавил поля… пока еще не проверял — надо ведь аналогичные поля и в профиле сделать. Как я понимаю… Сразу как решу вопрос с двумя письмами займусь…
4) То есть форма с радио, которая делает активными те поля которые нужно для каждого пользователя? Как лучше? Через модификацию чанков например? или перед каждым блоком какой нибудь сниппет типа IF? И страницу «Профиль» тоже можно одну делать на все типы или на каждую свой? Это же влечет за собой и страницу изменения профиля.
Скажите, я с логикой пока не очень — если есть стандартная радиоформа без логики — какой результат она дает «в чистом виде, без обработки? Что какая то переменная (напр reg.type) равна одному из типов? Или что один из типов имеет статус (атрибут) checked? Просто от этого зависит
2018-08-05 01:07:12
2018-08-05 01:07:13 Debug: Connecting to smtp.mail.ru:587
2018-08-05 01:07:13 Debug: Authenticating as sds19@mail.ru
2018-08-05 01:07:14 Debug: Authentication: OK
2018-08-05 01:07:14 Debug: Sending message…
2018-08-05 01:07:15 Debug: Completed. Send QUIT command.
2018-08-05 01:07:16
2018-08-05 01:07:16 Debug: Connecting to smtp.mail.ru:587
2018-08-05 01:07:16 Debug: Authenticating as sds19@mail.ru
2018-08-05 01:07:17 Debug: Authentication: OK
2018-08-05 01:07:17 Debug: Sending message…
2018-08-05 01:07:18 Debug: Completed. Send QUIT command.
Страницу «Профиль» можно сделать одну для всех пользователей.
Как добавить radio на форму и её обработать, можно посмотреть в комментариях в этой теме и FormIt.
На сайте есть много форм, скачать, заказать, купить
Пользователь все время заполняет одни и те же поля: email, телефон (иногда и имя)
Как сделать чтобы при одном заполнении такой формы пользователь регистрировался и автоматизировался на сайте (одновременно) А пароль ему высылался на email.
А если такой пользователь существует (по email проверяет) то при заполнении такой формы (это если он разлогинется) ему выскакивает сообщение что: вы уже зарегистрированы, проверьте свою почту там будет пароль и вам нужно авторизироваться, что-то в этом роде
А так, если вы используете FormIt, сначала необходимо создать сниппет, который будет создавать пользователя и добавлять его в группу. Поместить данный сниппет, необходимо после отправки сообщения, т.е. после хука email. В своём сниппете создавайте нужные проверки и др.
Для создания пользователя и добавления в группу можно воспользоваться стандартными механизмами MODX:
Если нужно выполнять какие-то проверки и действия до отправки такой формы на email, то делаете всё аналогично, только вызов сниппета помещаете до хука email.
Спасибо большое, буду пробовать.
Установили компонент login. Теперь у нас стоит задача: Мы создали ресурс на сайте «Пройти тест „Самодиагностика“. Войдя на эту вкладку посетитель должен зарегистрироваться прежде чем пройти тесты. Где и как проложить пути?
Если гость (неавторизованный пользователь) захочет попасть на этот ресурс, то MODX его не пустит, и он будет перенаправлен на ресурс, который указан в параметре unauthorized_page. Этот параметр находится по следующему пути: значок «Шестеренка» -> пункт «Системные настройки» -> раздел «core» -> фильтр по разделу «Сайт». В качестве значения этого параметра необходимо указать id ресурса, на который необходимо перевести пользователя, если он попытается получить доступ к ресурсу, на который он не имеет прав.
Использую расширение office как у вас на сайте. В личном кабинете мне очень понравилась таблица статистики. Загорелся, делаю себе такую же, но застопорился. Нигде не нашел информации как вывести общее количество комментариев, сделанное пользователем. Объясните, пожалуйста.
P.S.
У меня на сайте office работает вместе с minishop2. В эту статистику также хотел добавить информацию о количестве заказов, сделанных пользователем на сайте, но также не смог понять. Эта просьба не по теме, извините.
Это можно выполнить, например, с помощью сниппета pdoUsers (из коллекции pdoTools) и дополнительного сниппета prepareUser:
Код сниппета prepareUser:
Для minishop2 вам необходимо написать дополнительный запрос в prepareUser и получить количество записей с помощью функции getCount.
Видимо я что-то делаю не так, но у меня данные не отображаются.
Отдельно сниппет prepareUser частично работает. Если изменить $row['id'] на $modx->user->id] работают $row['totalTickets'] и $row['totalComments'].
Ваш вызов pdoUsers не показывает ничего. Даже нулей. В логах ошибок не пишет.
У меня pdoTools 2.11.1-pl, Modx — 2.6.2.
Вызов pdoUsers с пустым шаблоном:
Решил пока проблему так (коряво, но работает):
Создал два отдельных сниппета — User_orders (выводит количество заказов):
и User_comments:
И их вызываю в таблице статистики.
Дату регистрации получаю через сниппет officeAuth:
В чанке вставляю плейсхолдер [[+createdon:dateAgo]]
Александр, Ваш сайт великолепен. Нахожу на нем ответы на множество вопросов. Спасибо за сайт.
Использую его как учебник и образец.
Подскажите, как по окончании успешного заполнения формы регистрации новым пользователем
сообщить ему в браузере «Уважаемый имярек регистрация проходит успешно, на Ваш емейл отправлено письмо активизации регистрации. Для завершения процесса регистрации осталась сама малость. Обязательно нажмите на ссылку в письме активации регистрации.»
Для этого необходимо создать дополнительный ресурс и разместить на нём приведённое выше сообщение.
После этого необходимо в сниппет Register добавить параметр submittedResourceId и указать в качестве значения id созданного ресурса.
Теперь после отправки регистрационной формы будет происходить перенаправление на ресурс с id, равным 14.
Например, в ссылках можно хранить не путь к файлу, а ссылку на некоторую промежуточную страницу (например, downloads) и GET-параметр.
В админке MODX создать эту промежуточную страницу и дать доступ к ней только авторизированным пользователем. На этой странице необходимо будет написать логику, которая будет в зависимости от значения id выдавать ссылку для кнопки расположенной на этой странице. Т.к. не зарегистрированные пользователи не будут иметь доступ к этой странице, то они не смогут скачать этот файл.
Для надёжности в качестве значения id можете использовать сгенерированный по некоторому алгоритму хэш код.
Другой вариант это использовать фильтры. Например, при каждой генерации страницы проверять, авторизирован ли пользователь, и если да, то подставлять ссылку.
Подскажите как узнать или где найти как формируется id сессии.
Изначально планировали без использования данного снипета и id сессии формировался с помощью функции time();
при создании и активации учетной записи на сайте, страницы авторизации и регистрации перестают загружать.
Если удалить созданную учетную запись из админки, то страницы сразу загружаются, подскажите в чем может быть проблема и пути её решения?
Спасибо.
Не знаю, не сталкивался с этим. Попробуйте посмотреть ошибки в логах.
сделал по вашему уроку страничку регистрации и обнаружил, что все поля, кроме поля «Email:» подвержены XSS уязвимости. Воспроизводится это так, нужно в любое поле вставить
это '" onMouseOver=«alert(1);' В начале стоит двойная кавычка и перед alert тоже двойная
кавычка. Затем нажимаем кнопку „Далее“, теперь если навести мышку на поле в которое ввели этот код, то выскочит окошко с единичкой.
Скажите пожалуйста, как проверять введенные данные?
Кроме этого сейчас все современные браузеры блокируют это (ERR_BLOCKED_BY_XSS_AUDITOR).
Может вы вызываете сниппет кэшированным?
Буду разглядывать код под «микроскопом», может где-то еще ошибки.
[[!ConfirmRegister?
&authenticate=`1`
&redirectTo=`7`
&errorPage=`7`
]]
на следующих скриншотах запечатлен процесс регистрации и активации
itchief.ru/assets/uploadify/4/3/8/438dcef39e5d623e7ab1f95a407a7843.png
itchief.ru/assets/uploadify/a/7/c/a7c3b13bf88d762b0c825b5ef14791de.png
itchief.ru/assets/uploadify/8/7/1/871fbff889a59aeaa5cbdff61cb0d94b.png
itchief.ru/assets/uploadify/b/d/4/bd426c5135db70f8af4c1989bfba9903.png
itchief.ru/assets/uploadify/c/b/2/cb226bc0b43e080b49d58d8f908d9651.png
itchief.ru/assets/uploadify/8/8/4/884412323aa60c57dd43def9fee37784.png
Ещё один момент. Эти действия лучше производить в другом браузере или из режима инкогнито. Чтобы авторизация текущего пользователя в админке (admin), не влияла на эти действия.
Можно также попробывать обновить MODX на эту же версию, которая у вас стоит или на более новую. И переустановить компонент Login.
Спасибо за внятное объяснение и приятный дизайн Вашего сайта!
Подскажите, пожалуйста — как предоставить пользователю выбирать себе группу при регистрации?
Например, мы на форме ставим несколько радиокнопок
Нужно, чтоб значение выбранной радиокнопки отправлялось в параметр &usergroups сниппета Register.
Я пробовал так:
и вот так
Оба варианта отправляют ключ=значение в дополнительные поля данных…
Как вариант, конечно можно на странице сделать табы из этих радиокнопок, выводить на каждой вкладке сниппет с нужными параметрами и форму тоже с нужными полями, но код странички очень громоздкий получается… Может есть более универсальный вариант?
Чтобы получить значение ключа POST нужно написать сниппет или использовать такую конструкцию (если установлен pdoTools):
Т.е.
Кроме этого необходимо ещё написать валидацию, чтобы пользователь мог попасть только в одну из этих групп.
[[#POST.group]] — этот вариант сработал бы в чанке сниппета из pdoTools, на столько я успел разобраться…
У меня же код расположен в contetn ресурса «Регистрация» — у меня этот вариант не сработал…
Спасся простеньким сниппетом:
getPOSTkey
Вызвал так:
Зато теперь знаю, как получить значения ключей $_POST массива в pdoTools.
Спасибо!
Группу, в которую необходимо поместить пользователя, необходимо указать в параметре usergroups:
Подскажите, каким образом в админке сделать сортировку пользователей по id уже изначально, так как сейчас идет по имени???
Заранее спасибо
картинка
itchief.ru/assets/uploadify/f/b/c/fbc907ae3ab331df797860e772e58564.jpg
Необходимо открыть файл \core\model\modx\processors\security\user\getlist.class.php и изменить свойство defaultSortField:
В csv таблице есть стандартные поля типа e-mail, имя и телефон. Написал снипет который разбирает таблицу в массив используя цикл for. Как я понимаю мне нужно в теле цикла при каждой итерации вызывать отработку сниппета [[!Register?]] и передавать ему переменные со значениями полей(e-mail, имя и телефон). Не подскажите как мне это реализовать?
Для данной задачи не вижу смыла использовать компонент Login.
Добавить пользователя в систему можно так:
Для этого необходимо добавить в сниппет Register хук, в котором нужно установить полю пользователя blocked значения 1.
Сниппет rhUserBlocked:
И как осуществить может такую форму регистрации как у Вас на сайте и есть ли возможность это сделать без перехода на другую страницу?
Подскажите пожалуйста.
Задача следующая -при регистрации в определённую таблицу вносятся имя и фамилия пользователя.
после авторизации попадает на страницу с формой обновляющей данные в этой таблице.
При заходе на эту страницу в форму должен подставляться индивидуальный идентификатор пользователя (будет сравниваться с id строки при обновлении таблицы).
Суть задачи — пользователь ввёл данные в форму, в таблице появилась запись, потом (на отдельной форме) эту запись сравнили с определённым числом и если совпало — обновили ячейку таблицы. Пользователей будет много, поэтому спрашиваю совета от чего лучше оттолкнуться.
Могли бы подсказать более подробно?
Как начать это делать, можно посмотреть в этой статье.
Для этого нажимаем в главном меню админки на «Шестерёнку» -> выбираем пункт «Контроль доступа». После этого нажимаем правой кнопкой мыши по группе Users и выбираем пункт «Редактировать». Затем переходим на вкладку «Права доступа» и открываем вкладку «Доступ к контекстам». На данной вкладке нажимаем на кнопку «Добавить контекст». В открывшейся форме «Доступ групп пользователей к контексту» устанавливаем следующее:
- контекст — web;
- минимальная роль — Member 9999;
- политика доступа — TicketUserPolicy.
В итоге вы должны иметь 2 записи в этой вкладке.1. Для комментариев использовать сниппет getComments:
2. Для избранного сниппет getStars:
Большое спасибо за интересную статью.
Хотелось узнать следующее. Допустим, у нас есть форма регистрации. В нее нужно добавить поле-чекбокс «С условиями согласен». Как это можно реализовать в MODX? С MODX начал работать недавно. Спасибо.
Спасибо.
1. В HTML форму регистрации добавить чекбокс (при использовании префикса reg.):
2. Создать сниппет (кастомный валидатор), например, имеющий имя checkAgreed:
3. В сниппете Register (т.к. в формы мы использовали префикс reg.) добавить:
Для выборки данных (с возможностью сортировки и фильтрации) скорее всего придётся писать свой сниппет, т.к. в этом поле данные хранятся в формате JSON.
Если пригодится, то для того чтобы эти данные не сохранять в базу необходимо их указать в параметре excludeExtended:
Необходима ручная активация пользователя на сайте
Ну, и сам сниппет mailToAdministrator:
Использую условие:
Но почему-то ничего не происходит.
itchief.ru/assets/uploadify/9/1/9/919d49859d83067b05bcf71f95c1c772.jpg
Написал у себя:
Теперь у зарегистрированного юзера вместо «Здравствуйте, гость!» появляется «Добрый день, (адрес мейла)!». Если же вместо +modx.user.username написать +modx.user.fullname или просто +fullname, то… имя не появляется, просто «Добрый день, !»
(В комментариях к публикациям, где стоит
полное имя появляется.)
Как сделать, чтобы в этом поле было полное имя, указанное при регистрации?
Зарегистрированный пользователь при первом входе блокируется сайтом (окно уведомления предлагает обратиться к администратору). В разделе Пользователи, админпанели галочка блокировка не выставлена. Куда смотреть, или в примере юзеры становятся доступны после прямой активации админом?
А так да… В MODX Revolution есть такой параметр (allow_multiple_emails). Если ему установить значение нет, то разные пользователи не смогут иметь один и тот же адрес email. Она находится в разделе «Авторизация и безопасность».
Попробуйте вызвать чанк не кэшированным. Или сделать одну форму но с переключателями. Если выбран один, то одни поля. И если другой переключатель, то другие. Ещё один вариант — это в зависимости от get параметра страницы отображать одну или другую форму.
В комментарии приведён другой способ, в котором в качестве username, например, может использоваться логин. А email пользователя проверятся с помощью хука. Т.е. он ищет, если у других пользователь точно такой же email. И если есть, то данный хук прерывает процесс выполнения регистрации и выводит сообщение о том, что пользователь с таким email уже есть.
И выбором поля не могу разобраться. Подскажите пожалуйста!
1. Добавить в форму поле для ввода логина:
2. В вызове сниппета Register изменить значения параметра, отвечающего за имя пользователя (т.е. указать username):
3. Для проверки ввода в форме регистрации существующего email написать хук (например, checkUserEmail):
4. Указать параметр хук в качестве параметра сниппета Register:
(ERROR @ /home/c/cs72731/modx_7/core/model/modx/modcachemanager.class.php: 317) Could not cache resource 1
Удалите из вызова сниппета Register строчку
А из HTML формы:
Если форма будет отправляться, значит Вы что-то неправильно настроили в reCaptcha.
Это способ не работает, страница перезагружается и всё.
В тексте, правда есть небольшая неточность: сниппет ConfirmRegister предлагается разместить в ресурсе «Регистрация» вместо «Подтверждения регистрации» (скриншот).
В логах также «Could not get table name for class: modAccess»,
2. Ещё раз проверьте Ваши действия, т.к. должно приходить одно письмо.
Решили у себя проблему? Если да, то как?
2. При необходимости подключить datepicker.
3. Добавить в вызов сниппета Register параметр preHooks:
3. Создать сниппет formatDob:
Интересно как это сделано? Как то искал это на форумах так и не нашёл а тут раз и ЕСТЬ))
Ни какого Аякса )))
НО письма не приходят ни о регистрации ни о восстановлении пароля, хотя настройки почты поставил и они работают сниппет ФОРМИТ отправляет письма…
Настроено через SMTP
В чём может быть проблема??? Почему не приходят эти письма???
Заменил в системных настройках Адрес электронной почты на noreply@sitename.kz и письма стали приходить.
И главная проблема. На отдельной странице регистрация проходит отлично. Но во всплывающем окне на главной постоянная ошибка E-mail. Причем, не пишет что именно, а просто выделяет красным и не дает зарегистрироваться. Не подскажите, в чем может быть проблема?
Модальное окно видно, форма там тоже есть. При попытке авторизации нет никакой реакции на нажатие кнопки Войти. При регистрации постоянная ошибка электронного адреса. Тот же код на отдельной странице работает отлично. В чем я напортачил?
вот скрипт
а это загрузка файла
Заказчик требует прикрепления файла, например, скан доверенности, при регистрации.
В этом есть смысл. Хотя, так же появляется шанс словить вредонос…
Какие мысли по этому поводу?
Добрых и Светлых Людей Вам на жизненном пути!!!
Но вот есть некоторые ситуации, которые вы не разбираете или считаете, что их будут писать в комментариях:
1 — Объясните пожалуйста, есть ли смысл в форму регистрации добавлять Captcha, если да, то как с привязкой к Login?
2 — Как в форме регистрации добавить дополнительные поля, которые нужно заполнять, причем поля, которые есть в стандартном формуляре пользователя (телефон, адрес, город), и которые нужно добавить в стандартный формуляр пользователя (специальность, хобби)?
1. Есть, для защиты от спама. Это сделается с помощью параметра preHooks. Например, можно использовать reCaptcha (необходимо установить) или какую-нибудь собственную.
Добавляется reCaptcha так:
— Добавляем в вызов сниппета Register параметр preHooks и указываем recaptcha:
— добавляем в форму плейсхолдер:
2. Указывайте их при регистрации и они будут заполняться.
Например, город:
Тоже самое и с расширенными полями.
Например, color (расширенный атрибут):
Если Вас не затруднит, то расскажите, пожалуйста, подробнее следующее:
-1. Как прописать в форме выбор значения из доступных -2. Нужно в форму добавить мультимедийную загрузку файлов (изображений) до 10 шт., но при этом можно было бы загружать по одной фото и сразу все, с указанием одной главной фото. Есть ли готовое решение для форм? Как это можно реализовать?