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

Регистрация пользователей на MODX Login
Содержание:
  1. Что такое Login?
  2. Установка пакета Login
  3. Создание группы пользователей и ресурсов «Users»
  4. Создание ресурсов и настройка доступа к ним
  5. Регистрация пользователей с использованием Register
  6. Активирование аккаунта пользователя
  7. Комментарии

В этой статье рассмотрим, как с помощью пакета 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». После того как этот пакет будет найден, выполняем его загрузку и установку..

Менеджер пакетов MODX. Установка дополнения Login

Создание группы пользователей и ресурсов «Users»

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

Контроль доступа MODX

В диалоговом окне «Создать группу пользователей» заполняем следующие поля:

  • название - Users;
  • описание - Зарегистрированные пользователи;
  • создать параллельную группу ресурсов - Да;
  • политика системы управления - (нет политики).
Создание группы пользователей Users в CMS MODX Revolution

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

Группы пользователей, созданные в CMS MODX

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

Группа ресурсов Users в MODX

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

Редактирование группы пользователей Users в MODX Revolution

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

MODX - Редактировать доступ к контексту

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

Настройка политики доступа к контексту в MODX

Создание ресурсов и настройка доступа к ним

Создадим следующие страницы (ресурсы):

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

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

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

Настройка доступа к ресурсам в MODX для Login

Кроме этого, группе пользователей (аноним) необходимо установить доступ «Load only». Это необходимо сделать для того чтобы они могли загружать страницы из группы ресурсов Users, проверять права доступа и получать ошибку 403 «Доступ запрещен». Если (аноним) не дать доступ «Load only», то для них эти страницы не будут существовать, и они получат ошибку 404 «Не найдено».

Порядок действий: Шестерёнка -> Контроль Доступа -> (аноним) -> Редактировать группу пользователя (правой кнопкой мыши) -> вкладка «Права доступа» -> Группы ресурсов -> Добавить группу ресурсов.

В диалогово окне «Добавить группу ресурсов»:

  • Группа ресурсов : Users;
  • Контекст: web;
  • Минимальная роль: Member (9999);
  • Политика доступа: Load Only.
Настройка доступа к группе ресурсов Users для анонимных пользователей в MODX

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

Настройка страницы ошибки 403 в MODX

Регистрация пользователей с использованием 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.

Форма для регистрации пользователей в MODX

Код вызова сниппета 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:

Валидация поля регистрационной формы в MODX

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. После этого пользователь может уже авторизоваться на сайте, т.е. войти под своей учётной записью.

Результат работы MODX сниппета ConfirmRegister, т.е. установления полю active значения 1

Содержимое ресурса «Подтверждение регистрации» (вызов сниппета ConfirmRegister):

[[!ConfirmRegister?
  &authenticate=`1`
  &redirectTo=`6`
  &errorPage=`6`
]]

Описание используемых параметров сниппета ConfirmRegister:

Имя параметра Описание
authenticate Проверка подлинности и авторизация пользователя в текущем контексте (после подтверждения регистрации). Значение: 1 (да, выполнить).
redirectTo После успешного подтверждения, перенаправляет пользователя на ресурс, имеющий id = 6 (личный кабинет).
errorPage Перенаправляет пользователя на страницу (id = 6 - личный кабинет), если он попытается получить доступ к ней уже после активирования своего аккаунта.

Следующий шаг – это создать формы для входа и сброса пароля.

Комментарии: 255

Teozard
Teozard

Александр, день добрый! Возникли проблемы при настройке прав доступа неавторизированным аккаунтам. Всё делал по инструкции - создал группу пользователей и параллельную группу ресурсов, настроил юзеров и анонимов, добавил в группу ресурсов необходимые, настроил unauthorized_page. Однако всё равно аноним может посещать любые страницы из указанной группы ресурсов и его никуда не перенаправляет. Не подскажете, в чем может быть проблема?

Версия MODX Revo 2.8.5, Login - 1.9.9-pl
Александр Мальцев
Александр Мальцев

Добрый день! Может где-то что-то забыли. При этом нужно проверять в режиме инкогнито или в другом браузере. То есть так, чтобы ваш вход в админку не влиял на это.

Reut
Reut

Добрый день. Скажите, этот способ установки через Login будет актуален если устанавливать на modx revo 3 ? просто на обновленном modx revo много чего не работает.

Александр Мальцев
Александр Мальцев

Привет! Да, много чего не работает, но Login работает на MODX 3.

webcase43
webcase43

Добрый вечер! Подскажите пожалуйста, как сделать так, чтобы письмо с потдверждением регистрации приходило с заданного адреса, например как у вас no-reply@itchief.ru , а не с адреса хостинга noreply@unverified.beget.ru ?

Александр Мальцев
Александр Мальцев

Здравствуйте! MODX берёт email по умолчанию из параметра mail_smtp_user. Этот параметр находится в системных настройках, в разделе «Почта».

webcase43
webcase43

Спасибо большое за помощь)

Hhghdghdfhdg
Hhghdghdfhdg
Zgkcgkxgkuxkghkcjlchĵxzkfzig
Ian Markov
Ian Markov
Доброго времени суток!
Успешно все настроил, но не могу понять как сделать параллельную регистрацию.
Нужно чтобы при регистрации аккаунта данные записывались во вторую БД (но тут пароль должен быть захеширован в blowfish). Также при изменении пароля в ЛК, происходила смена пароля и во второй БД.
Можете подсказать?
Ian Markov
Ian Markov
Частично вопрос решил:
Использовал &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();

Данные заносятся в обе БД. Это уже радует.
Но столкнулся с очередной трудностью… в кастомную БД данные заносятся сразу после нажатия на кнопку регистрации, без подтверждения активации через почту. Как можно это поправить?
steileei
steileei
Здравствуйте! Спасибо большое за ваш материал! Все получилось.
Есть один вопрос, после того как пользователь авторизовался, я его помечаю как «заблокированный» в админке, но у пользователя все равно остается активна сессия и он может дальше перемещаться по сайту и быть при этом авторизованным.
Предусмотрено ли пакетом login такой функционал чтобы заблокированного пользователя выбивало на страницу входа или блокировки?
VODKA5665
VODKA5665
добрый день, я новичок, делал по вашей статье авторизацию, вроде как все отправляет, работает, но проблема в том что после того как я делаю ошибку в поле, что бы проверить как выдается сообщение об ошибке, у меня почему то блокируются все поля, и становится не возможно внести исправления в любом поле, и второе что меня беспокоит, у меня не появляется никакой анимации или каких либо отличий в сообщении ошибки, у меня к примеру не становится красным текст ошибки, что мне нужно исправить? можете подсказать?
<div class="main-content space-padding-tb-70">
            <div class="container">
                <div class="row">
                    <div class="col-xs-12 col-sm-12">
                        <div class="customer-page">
                            <div class="title-page">
                                <h3>Регистрация</h3>
                            </div>
                           [[!+error.message:eq=``:then=`
                            <form method="post" action="[[~[[*id]]]]" class="form-customer form-login">
                                <input type="hidden" name="nospam" id="nospam" value="[[!+reg.nospam]]" />
                                <div class="form-group">
                                    <div class="form-group">
                                    <label for="fullname">Имя пользователя *</label>
                                    <input type="text" name="fullname" class="form-control form-account [[!+reg.error.fullname]]" value="[[!+reg.fullname]]">
                                    <div class="invalid-feedback">[[!+reg.error.fullname]]</div>
                                </div>
                                    <label for="exampleInputEmail1">Email адрес *</label>
                                    <input type="email" name="email" class="form-control form-account [[!+reg.error.email]]" value="[[!+reg.email]]" id="exampleInputEmail1">
                                    <div class="invalid-feedback">[[!+reg.error.email]]</div>
                                </div>
                                <div class="form-group">
                                    <label for="exampleInputPassword1">Пароль *</label>
                                    <input type="password" name="password" class="form-control form-account [[!+reg.error.password:notempty=` is-invalid`]]" value="[[!+reg.password]]" id="exampleInputPassword1">
                                    <div class="invalid-feedback">[[!+reg.error.password]]</div>
                                </div>
                                <div class="form-group">
                                    <label for="password_confirm">Введите пароль ещё раз *</label>
                                    <input type="password" name="password_confirm" class="form-control form-account [[!+reg.error.password_confirm]]" value="[[!+reg.password_confirm]]">
                                    <div class="invalid-feedback">[[!+reg.error.password_confirm]]</div>
                                </div>
                                <div class="form-check">
                                    <button type="submit" name="login-register-btn" class="btn-login btn-register hover-white" value="Отправить" >Отправить</button>
                                </div>
                            </form>
                            `:else=`[[!+error.message]]`]]
                            <span class="divider"></span>
                            <a href="[[~10]]" class="btn link-button create-account hover-black">Логин</a>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        [[!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.`
]]
Я делаю это все в modx revo
Александр Мальцев
Александр Мальцев
Привет! В статье разметка формы выполнена на Bootstrap 5. Если делаете своё оформление, то нужно прописать стили самостоятельно.
А зачем в класс <input> добавляете сообщение об ошибке [[!+reg.error.email]]?
VODKA5665
VODKA5665
это из вашей статьи, просто я убрал от туда ":notempty=` is-invalid`", потому что подумал что это как то влияет, да я на самом деле стили не свои писал, я использую шаблон, но мне все равно не ясно почему именно после нажатия кнопки войти у меня доступ к полям ввода пропадает, точнее я могу попытаться что то стереть, но мне нужно нажать прямо на текст, а не где то рядом в этом поле ввода
Absurd
Absurd
Сделал все по инструкции, в шаблоне вставляю

[[!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.` ]]
и код формы, выводит просто
prnt.sc/1zlvOmCTi81p
Александр Мальцев
Александр Мальцев
Отключите использование текстового редактора в ресурсе, т.е. уберите галочку напротив флажка «Использовать HTML-редактор».
Anna Shishkina
Anna Shishkina
Александр, здравствуйте!
Большое спасибо за вашу информацию! Все понятно и очень хорошо сформулировано!
Такой вопрос: после успешной регистрации — переход на ресурс с ID, прописанным в submittedResourceId.
В этом ресурсе хочу прописать: «Для завершения регистрации отправлено сообщение на ваш email: (и вот тут надо написать email со страницы регистрации).» Не могу сообразить, как можно затянуть на дополнительный ресурс то, что у нас в ресурсе с формой регистрации обозначено как
[[!+reg.fullname]]
и как
[[!+reg.email]]

Александр Мальцев
Александр Мальцев
Здравствуйте! Спасибо за отзыв!
Для этого можно, например, создать сниппет getEmail со следующим содержимым:
<?php
return $_GET['email'];
А затем в нужном месте ресурса, id которого вы указали в submittedResourceId, вызвать его:
E-mail: [[!getEmail]]
Anna Shishkina
Anna Shishkina
Александр, спасибо, все получилось!
И поняла принцип))
Zulya
Zulya
Здравствуйте! У меня письма отправляются. Но в письме нет ссылки подтверждения. Они приходят вот с таким текстом и без ссылки подтверждения:
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, а не страницу Авторизации? Хотя этот параметр указан в настройках. Спасибо!
Таня
Таня
Разобралась :) Забыла добавить группе Аноним доступ Load Only к группе ресурсов Users. Сейчас всё ОК.
Амиль
Амиль
Здравствуйте! Подскажите, пожалуйста, что делать если при переходе по ссылке в письме всплывает ошибка 404 страница не найдена. И в личный кабинет после этого тоже не возможно попасть, такая же ошибка. Хотя пользователь подтверждается, судя по базе.
Дмитрий Антипов
Дмитрий Антипов
Добрый день. А как сделать так, чтобы 3 поля: Фамилия, Имя, Отчество объединились и записались в fullname?
Geektor
Geektor
Здравствуйте! Я новичок, сделал всё, как написано в статье, захожу на страницу регистрации, но письмо не приходит. Как я понимаю, нужно что-то ещё дописывать?)
Geektor
Geektor
При отправке формы регистрации пользователь создаётся в modx, но email не приходит ни на одну из почт: ни на mail ни на gmail ни на yandex. При отправке формы на восстановление пароля (в оба поля вставляю email) — на странице выдаёт сообщение об успешной отправки на почту инструкций по восстановлению пароля от аккаунта, но на саму почту так ничего и не приходит(
Александр Мальцев
Александр Мальцев
Здравствуйте! Посмотрите журнал ошибок в MODX. Скорее всего при настройке почты указали что-то неправильно.
Geektor
Geektor
Здравствуйте)) Зашёл в журнал ошибок, посмотрел последние, зашёл в инкогнито и попытался зарегистрироваться, снова вернулся к журналу ошибок, обновил — ничего нового не добавилось… Запрашивал логи у хостинг провайдера — при отправке с формы входа в CMS письма сначала тоже не проходили, но там мы выяснили причину — отклоняли почтовые сервера, с этим разобрались, починили. Потом я попытался через эту же форму (входа в CMS) восстановить данные от учёток которые я посоздавал с помощью страницы регистрации — всё приходит. Однако при отправке из формы регистрации нет ничего, хостинг-провайдер сказал что в логах тоже не видит попыток отправки писем
Geektor
Geektor
Выяснилось, что также необходимо было настроить SMTP
Системные настройки -> 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 у вас?) Настраивали ли вы дополнительно что-либо (то что не описано в статье)?
Geektor
Geektor
Ещё раз скопировал сниппет с Вашей статьи (т.к. в процессе решения проблемы изменял его) — всё заработало!) Вобщем основной причиной оказалася не настроенный SMTP)
Geektor
Geektor
SMTP хосты зависит от того, какой почтовый сервер используется (smtp.yandex.ru будет для яндекса)
Александр Мальцев
Александр Мальцев
Настройки при использовании почтового сервиса Яндекс (почта для домена): скриншот.
Также желательно настроить DKIM-подпись. Она нужна для того, чтобы подтвердить, что адрес, указанный в поле «От кого», является реальным адресом.

Александр Мальцев
Александр Мальцев
В качестве SMTP конечно нужно указывать адрес того почтового сервиса, который вы используете.
Aleksandr Ustinov
Aleksandr Ustinov
Добрый вечер! Подскажите пожалуйста, сделал свой сниппет регистрации на сайте через modxAPI все хорошо регистрация проходит, но после регистрации перед первым входом пользователя приходится входить через панель управления и в пользователе нажимать СОХРАНИТЬ, изменив любой параметр, Только после этих манипуляций пользователя начинает запускать на сайт. Такое ощущение что как будто пользователь появляется в базе но не хватает какого то параметра для его правильной работы, а после нажатия сохранить это что то появляется как будто регистрация произошла не на сайте а через панель управления. Подскажите как это можно исправить.
Александр Мальцев
Александр Мальцев
Привет! Наверно что-то в коде не дописали.
Павел
Павел
Здравствуйте.
Подскажите пожалуйста, возможно ли реализовать автоматическую авторизацию, по ссылке из письма электронной почты?
Александр Мальцев
Александр Мальцев
Здравствуйте.
Да, для этого можно создать на сайте php-скрипт, на который будет переходить пользователь при нажатии на ссылку в письме и передовать ему необходимые данные для создания и авторизации пользователя.
Например:
<?php
require_once 'config.core.php';
require_once MODX_CORE_PATH . 'model/modx/modx.class.php';
$modx = new modX();
$modx->initialize('web');
$modx->getService('error', 'error.modError', '', '');

$data = array(
  'class_key' => 'modUser',
  'username' => 'Test2',
  'fullname' => 'Test Test',
  'email' => 'test3@test.com',
  // отправлять письмо с паролем на почту
  'passwordnotifymethod' => 'e',
  'passwordgenmethod' => '',
  'specifiedpassword' => '11111111',
  'confirmpassword' => '11111111',
  'active' => 1,
  'groups' => array(
    array(
    'usergroup' => 2, // Id группы пользователей (2 - Users)
    'role' => 1, // Id роли (1 - Member)
    )
  )
);

$response = $modx->runProcessor('security/user/create', $data);

if ($response->isError()) {
  print_r($response->getResponse());
}

$data = array(
  'username' => 'Test2',
  'password' => '11111111',
  'rememberme' => 1,
  'login_context' => 'web',
);

$response = $modx->runProcessor('/security/login', $data);

if ($response->isError()) {
  echo $response->getMessage();
} else {
  echo 'Пользователь авторизован';
}
Elena
Elena
Здравствуйте!
Подскажите, пожалуйста, почему могут не приходить уведомления о подтверждении регистрации с сайта (modx rev), если указать mail. ru или yandex (пока сами тестируем, сайт не запущен в массы)?
На адрес Gmail приходит через секунду, а на другие — ничего. В спаме пусто.

Заранее спасибо!
Александр Мальцев
Александр Мальцев
Здравствуйте! Вы отправляете через SMTP? Если нет, то настройте отправку через SMTP. Может на стороне yandex и mail.ru срабатывают какие-то фильтры и они их не пропускают. Также желательно на хостинге настроить DKIM подпись.
Elena
Elena
Александр, спасибо большое за ответ!
Павел
Павел
Здравствуйте.
Подскажите пожалуйста, как можно отредактировать введенные при регистрации данные, перед созданием Пользователя.
Допустим в электронной почте все буквы сделать маленькими, если пользователь указал большие
и убрать лишние пробелы в начале и в конце строки.
При редактировании данных, я это реализовал. Не получается это сделать именно при регистрации.
Александр Мальцев
Александр Мальцев
Здравствуйте.
Это можно выполнить через preHooks. Для этого вам нужно создать сниппет и указать его в качестве значения параметру preHooks.
Например:
[[!Register?
  ...
  &preHooks=`actionBeforeRegister`
]]
В этом сниппете (в данном случае в actionBeforeRegister) необходимо написать нужные преобразования.
Например, преобразуем fullname к нижнему регистру:
<?php
$fullname = mb_strtolower($hook->getValue('fullname'));
$hook->setValue('fullname', $fullname);
return true;
Павел
Павел
Благодарю. Все получилось
Фунтик
Фунтик
Здравствуйте, а как сделать так, чтобы при регистрации, если на эту электронную почту уже зарегистрирован пользователь, выводилось сообщение в поле для emai по типу «эта эл почта уже используется»?
Александр Мальцев
Александр Мальцев
Привет! Для этого будет достаточным установить в настройках параметру allow_multiple_emails (разрешить пользователям использовать один адрес электронной почты) значение нет.
Людмила
Людмила
Здравствуйте! Благодарю за подробные статьи. Подскажите, пожалуйста, кроме установки пользователю activ=1 при подтверждении регистрации какие изменения делаются в базе? Я никак не могу взять в толк, кого modx считает авторизованным и по какому принципу работают фильтры авторизации modx.user.id:isloggedin:is? При выходе разве activ становится другим?
Александр Мальцев
Александр Мальцев
Здравствуйте! Установка пользователю «active = 1» делает его активным, т.е. даёт ему возможность войти в систему под своим логином и паролем. При выходе пользователя значение active конечно остаётся таким же, иначе в следующий раз этот пользователь уже не смог бы войти.

Принцип работы с пользователями в 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, то это значит, что пользователь авторизован. В противном случае – нет.
Людмила
Людмила
Благодарю. Хотелось бы, чтобы после прохождения по ссылке с подтверждением пользователь становился уже авторизованным. То есть дописывать надо кусочек, связанный с куками.
Александр Мальцев
Александр Мальцев
Нет, с куками ничего дописывать не надо. ConfirmRegister это делает автоматически при установке параметру authenticate значения 1.

Юрий
Юрий
Здравствуйте. Подскажите в какой таблице БД хранятся данные пользователей? Как можно добавить новые поля в ЛК? Заранее спасибо.
Александр Мальцев
Александр Мальцев
Здравствуйте!
Данные пользователей находятся в таблицах «modx_users» и «modx_user_attributes».
Добавление новых полей осуществляется через расширенные поля. Эти поля находятся на странице пользователя на вкладке «Дополнительные поля данных».
Работа с ними в коде выполняется так:
// id пользователя
$user_id = 2;
if ($user = $modx->getObject('modUser', $user_id)) {
  // получаем профиль пользователя 
  if ($profile = $user->getOne('Profile')) {
    // получаем специальное поле extended
    $extended = $profile->get('extended');
    // устанавливаем полю, например, mynewfield значение
    $extended['mynewfield'] = 'value';
    // сохраняем
    $profile->set('extended', $extended);
    $profile->save();
  }
}
Андрей
Андрей
Подскажите, а как сделать, чтобы при регистрации одно из полей заполнялось заранее установленными символами?
Условно говоря есть дополнительное поле у пользователя tipe и вот чтобы при регистрации сразу уходило tipe=«fl», при этом чтобы данная информация не выводилась в форме.
Александр Мальцев
Александр Мальцев
Это можно выполнить разными способами, например, через postHooks сниппета Register. Другой вариант — это создать плагин на событие OnUserSave и в нём написать локигу для сохранения значения «fl» в дополнительное поле «tipe».
Андрей
Андрей
я неточно сформулировал задачу — при регистрации с одной страницы один параметр, при регистрации с другой — другой должен быть. поэтому OnUserSave наверное не подойдет, буду пробовать через postHooks
Александр Мальцев
Александр Мальцев
Да, тогда нужно через postHooks.
Андрей
Андрей
Спасибо, все получилось.
Может кому пригодится — вот текст сниппета, который вызывается в postHooks
<?php
$email = $hook->getValue('email');
$user = $modx->getObject('modUser', array('username' => $email));
if (is_object($user)) {
  $profile = $user->getOne('Profile');
  $fields = $profile->get('extended');
  $fields['tip'] = 'fl';
  $profile->set('extended', $fields);
  $profile->save();
}
под себя нужно поправить наименование дополнительного поля и его значение.
$fields['tip'] = 'fl';
Александр Мальцев
Александр Мальцев
Отлично!
Человек7
Человек7
все время пишет указан неправильный код активации, когда пытаюсь сохранить профиль, никак не пойму что это. И кстати можно ли сделать на бутстрапе 3 выпадающее меню направо при наведении, без добавления сторонних библиотек. Спс.
Александр Мальцев
Александр Мальцев
Не сталкивался с таким.
Для того чтобы меню выпадало вправо добавьте к нему соответствующие стили:
top: 0 !important;
left: 100% !important;
Человек7
Человек7
спс большое, единственный сайт на котором мне ответили))
amikawa
amikawa
Здраствуйте, я упустил момент, до формы ставится условие на мне не понятном плейсхолдере [[+error.message]].
Подскажите, пожалуйста, откуда он взялся и почему он должен быть?
amikawa
amikawa
Display a Success Message

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:

[[!Register? &successMsg=`Thanks for registering!`]]
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% работы, благодарен за понимание и спасибо за ваш труд.
Александр Мальцев
Александр Мальцев
Здравствуйте, если есть какие-то не очевидные вещи в статьях, то спрашивайте, поможем разобраться. К тому же это только приветствуется, т.к. с помощью этих пояснений мы сделаем инструкцию более понятной для большего числа пользователей. А написать 100% понятную инструкцию для всех пользователей сразу не всегда получается.

Плейсхолдеры в большинстве случаев в MODX устанавливаются сниппетами. Это такие вставки, которые потом заменяются на что-то определённое (в основном на значения, которые генерирует сниппет в процессе своего выполнения).

В этом случае как вы правильно разобрались это делает сниппет Register. Именно он устанавливает плейсхолдер [[+error.message]]. Значение, которое вместо него будет выведено определяется с помощью параметра successMsg, но только в случае успешной отправки формы. В противном случае (если форма просто выводится или она содержит не корректные значения в полях), то парсер MODX установит в качестве значения плейсхолдера [[+error.message]] пустую строку, т.к. его значение никто не установил.

В коде мы проверяем равен ли плейсхолдер пустой строке и если да, то выводим форму. А если нет, то значит форма успешно отправлена, и значит мы выводим уже не форму, а сообщение, в котором благодарим пользователя за регистрацию. Т.е. само значение плейсхолдера error.message.
[[!+error.message:eq=``:then=` выводим форму `:else=`[[!+error.message]]`]]
amikawa
amikawa
Спасибо за ваш ответ, вы замечателен)
А если я новичок в Modx и у меня постоянно полно «дурацких вопросов», не подскажете, где этим сообществом принято обмениваться инфой?)
Александр Мальцев
Александр Мальцев
Это было написано про это место. Не могу, конечно, отвечать за других людей, но я фанат веб-разработки. Поэтому, задавайте вопросы, и если я знаю как их решить, то обязательно отвечу.
amikawa
amikawa
Я не сомневаюсь, что вы поможете, но, чтобы дуракам-самоучкам вроде меня не терять мотивацию заниматься всем этим прекрасным делом, хотелось бы общаться в более открытой форме, по принципу телеги посредством сообщений или недлительных колл-сессий, на своём опыте, можете что посоветовать, чтобы не страдать мракобесием, а быть частью сообщества?
Александр Мальцев
Александр Мальцев
Понимаю, но я не участвую в обсуждениях. Не мой формат.
Евгений
Евгений
Здравствуйте, Александр! Подскажите, пожалуйста, в чём может быть проблема, точнее проблему нашел, но как продвинуться дальше не понимаю.

Столкнулся с такой проблемой: при переходе по ссылке активации аккаунта перекидывает на ресурс который указан в errorPage. Залез в контроллер ConfirmRegister и увидел что на строке
$this->user = $this->modx->getObject('modUser',array('username' => $this->username));
метода getUser не может найти пользователя. При регистрации в username записывается email пользователя. При попытке вывести $this->username в журнал ошибок в журнале ошибок при нажатии на «Обновить» просто висит сообщение «В процессе» и всё. Ничего не понимаю, раньше таких проблем с этим login'ом не было, а на этом сайте уже недели 3 бьюсь с личным кабинетом (то авторизация не работала, то теперь активация), хоть самому с нуля аналог login'а пиши…
Александр Мальцев
Александр Мальцев
Здравствуйте!
Не знаю с чем это может быть связано. Попробуйте переустановить MODX и компонент Login.
Людмила
Людмила
Здравствуйте! Благодарю за полезную статью. Скажите, у меня не срабатывает проверка повторного ввода пароля при регистрации — при любом значении passwdAgain регистрация происходит, проверки равенства passwd и passwdAgain не происходит.
Даже при пустом поле passwdAgain регистрация происходит.

Делаю всё по инструкции. passwdAgain:passwdAgain=^passwd^ не срабатывает. В чем причина?

Изменила строку на passwdAgain:required:passwdAgain=^passwd^.

Теперь при пустом значении регистрация не происходит, требует заполнить passwdAgain, но не проверяет на равенство с passwd.

Помогите, пожалуйста.
Александр Мальцев
Александр Мальцев
Здравствуйте! Спасибо! Это проблема скорее всего имеет те же корни, как и та, которую вы описали в этом комментарии.
Людмила
Людмила
Нет, на домене тоже самое. oartemi-slovo.ru/registracziya.html
Александр Мальцев
Александр Мальцев
Попробуйте обновить или переустановить компонент Login.
Andrey
Andrey
Делаю всё по инструкции. passwdAgain:passwdAgain=^passwd^ не срабатывает. В чем причина?

А происходит это потому, что стандартный валидатор Formit имеет имя «password_confirm». т.е. правильная строка будет passwdAgain:password_confirm=^passwd^
Людмила
Людмила
Огромное спасибо! passwdAgain:password_confirm=^passwd^ работает!
Vadim
Vadim
Здравствуйте, Александр. Очень понятная статья по созданию регистрации. Я делаю все по инструкции, однако, возникают проблемы. При проверке регистрации я попытался отправить форму. Насколько, я понимаю — валидация не проходит, потому что даже при пустых полях кнопка регистрации срабатывает. Даже если я ввожу все поля — письмо не приходит, однако 1 раз у меня получилось получить письмо, но URL активации не получил (переделывал по инструкции несколько раз). Как быть и что делать — не знаю, прошу вашей помощи (скриншот)
[[!Register?
  &submitVar=`submitbtn`
  &activation=`1`
  &activationEmailSubject=`Подтверждение регистрации`
  &activationResourceId=`28`
  &successMsg=`<p>Спасибо за регистрацию. На вашу электронную почту [[!+reg.email]] отправлено письмо, содержащее
    ссылку, необходимую для активацию аккаунта. Перейдите по этой ссылке, чтобы завершить процедуру регистрации.</p>`
  &usergroups=`Users`
  &usernameField=`email`
  &passwordField=`passwd`
  &validate=`nospam:blank, passwd:required:minLength=^8^, passwdAgain:passwdAgain=^passwd^, fullname:required,
  email:required:email`
  &placeholderPrefix=`reg.`
]]

[[!+error.message:eq=``:then=`
<form action="[[~[[*id]]]]" method="post" class="form-horizontal">
  <input type="hidden" name="nospam" id="nospam" value="[[!+reg.nospam]]">
  <div class="form-group">
    <label for="fullname" class="col-sm-4 control-label">Имя и фамилия:</label>
    <div class="col-sm-8">
      <input type="text" name="fullname" class="form-control" id="fullname" placeholder="Как Вас зовут"
        value="[[!+reg.fullname]]">
      <span class="help-block text-error">
        [[!+reg.error.fullname]]
      </span>
    </div>
  </div>
  <div class="form-group">
    <label for="email" class="col-sm-4 control-label">Email:</label>
    <div class="col-sm-8">
      <input type="email" name="email" class="form-control" id="email" placeholder="Введите Email"
        value="[[!+reg.email]]">
      <span class="help-block text-error">
        [[!+reg.error.email]]
      </span>
    </div>
  </div>
  <div class="form-group">
    <label for="passwd" class="col-sm-4 control-label">Пароль:</label>
    <div class="col-sm-8">
      <input type="password" name="passwd" class="form-control" id="passwd" placeholder="Введите пароль"
        value="[[!+reg.passwd]]">
      <span class="help-block text-error">
        [[!+reg.error.passwd]]
      </span>
    </div>
  </div>
  <div class="form-group">
    <label for="passwdAgain" class="col-sm-4 control-label">Подтвердите пароль:</label>
    <div class="col-sm-8">
      <input type="password" name="passwdAgain" class="form-control" id="passwdAgain"
        placeholder="Введите пароль ещё раз" value="[[!+reg.passwdAgain]]">
      <span class="help-block text-error">
        [[!+reg.error.passwdAgain]]
      </span>
    </div>
  </div>
  <input type="submit" value="Далее" name="submitbtn" id="submitbtn" class="btn btn-primary pull-right">
</form>
`:else=`<div class="alert alert-success">[[!+error.message]]</div>`]]
Vadim
Vadim
UPD. После нажатия на кнопку «Далее». Он переходит на другую страницу. То есть если мы находились на странице регистрации — «mysite.ru/registracziya/» То после нажатия на кнопку открывается страница «mysite.ru/registracziya/registracziya/»
Vadim
Vadim
Письмо не приходит, потому что даже сам пользователь не добавляется после нажатия кнопки register.
Александр Мальцев
Александр Мальцев
У вас в MODX настроены ЧПУ?
Vadim
Vadim
Решил проблему.В разделе head не стоял base href
Но у меня появилась другая проблема после нажатия на кнопку выход в личном кабинете — сессия не закрывается. Меня просто перебрасывает на главную страницу.
Александр Мальцев
Александр Мальцев
Выход из учётной записи авторизированного пользователя осуществляется через сниппет Login. Id ресурса на который нужно перейти указывается через параметр logoutResourceId.
Толстый Ленивый Кот
Толстый Ленивый Кот
Здравствуйте, Александр!
Спасибо за крайне полезный ресурс, много полезной информации. Прошу, по возможности, помочь с авторизацией. Проблема та же, что была у Дмитрия (тема от 03 августа 2018) — письма для подтверждения приходят по два раза. Я перерыл уже всё, что возможно, но так ничего и не нашёл :( Поставил автогенерацию пароля и стало ещё интереснее — пароли в письмах разные (раньше приходило два с одинаковым паролем, но разным параметром «lp»). Срабатывает из них только одно, последнее, первое явный «глюк». Вот RegisterFormTpl:
<div class="row">
    <div class="col-md-8 col-lg-6">
      <div class="panel panel-primary">
        <div class="panel-heading"><i class="glyphicon glyphicon-edit"></i> Регистрация</div>
          <div class="panel-body">
            <form action="[[~[[*id]]]]" method="post" class="form-horizontal">
              <input type="hidden" name="nospam" value="[[!+reg.nospam]]">
              <input type="hidden" name="password" value="superseekret">
              <div class="form-group">
                <label for="ref_id" class="col-sm-4 control-label">ID реферала:</label>
                <div class="col-sm-8">
                  <input type="text" name="ref_id" class="form-control" id="ref_id" placeholder="От кого вы пришли" value="[[!+reg.ref_id]]">
                  <span class="help-block text-error">
                    [[!+reg.error.ref_id]]
                  </span>        
                </div>      
              </div>
              <div class="form-group">
                <label for="fullname" class="col-sm-4 control-label">Имя и фамилия:</label>
                <div class="col-sm-8">
                  <input type="text" name="fullname" class="form-control" id="fullname" placeholder="Как Вас зовут" value="[[!+reg.fullname]]">
                  <span class="help-block text-error">
                    [[!+reg.error.fullname]]
                  </span>        
                </div>      
              </div>
              <div class="form-group">
                <label for="email" class="col-sm-4 control-label">Email:</label>
                <div class="col-sm-8">
                  <input type="email" name="email" class="form-control" id="email" placeholder="Введите Email" value="[[!+reg.email]]">
                  <span class="help-block text-error">
                    [[!+reg.error.email]]
                  </span>        
                </div>      
              </div>
              <div class="form-group">
                <label for="login" class="col-sm-4 control-label">Login:</label>
                <div class="col-sm-8">
                  <input type="text" name="login" class="form-control" id="login" placeholder="Введите Login" value="[[!+reg.login]]">
                  <span class="help-block text-error">
                    [[!+reg.error.login]]
                  </span>        
                </div>      
              </div>
              <input type="submit" value="Далее" name="sbmtbtn" class="btn btn-primary pull-right">
            </form>
          </div>
        </div>
      </div>
    </div>
</div>
Вот страница регистрации:
[[!Register?
    &submitVar=`sbmtbtn`
    &activation=`1`
    &activationEmailSubject=`Подтверждение регистрации`
    &activationResourceId=`6`
    &successMsg=`<p>Поздравляем! На вашу электронную почту отправлено письмо, содержащее ссылку, необходимую для активации аккаунта. Перейдите по этой ссылке, чтобы завершить процедуру регистрации.</p>`
    &usergroups=`Members`
    &usernameField=`login`
    &generatePassword=`1`
    &autoLogin=`1`
    &validate=`nospam:blank,
      ref_id:required,
      fullname:required,
      login:required:minLength=^4^,
      email:required`
    &placeholderPrefix=`reg.`
]]
[[!+error.message:default=`[[!$RegisterFormTpl]]`]]
Почтовый темплейт «из коробки», кеши сбрасывал, в логах пусто…
Что с этим можно ещё сделать?
Александр Мальцев
Александр Мальцев
Здравствуйте!
Скорее всего у вас сниппет вызывается 2 раза, проверьте редиректы.
Откройте консоль разработчика в браузере, выберите вкладку Network, поставьте галочку «Preserve log», чтобы лог не очищался при перезагрузке странице и проанализируйте его.
Толстый Ленивый Кот
Толстый Ленивый Кот
Увы, в консоли разработчика — один вызов registerme.html, в логах nginx с отладкой — два, но там видно, что это сперва POST, а потом сообщение «На вашу почту…», так что тоже не то. Замена registerme.html на index.html?q=registerme.html тоже видна и отрабатывает.
Видимо, не судьба :(
Толстый Ленивый Кот
Толстый Ленивый Кот
Дополню: проблема всё же решилась, но это уж точно «в Москву через Уренгой»… Всё заработало штатно после удаления восклицательного знака в вызове «[[Register?…» и убирании галочки «Кэшируемый» для него же. Такое решение для «восстановления пароля» нагуглилось где-то, и, как оказалось, это работает. Причём только и именно в такой комбинации! Хотя, казалось бы, «[[!Register» должен игнорировать кэширование как класс.
Криво, в общем, но если кому поможет — имейте в виду.
Дмитрий
Дмитрий
Александр, у вас личный кабинет пользователя сделан на этом компоненте login? или вы что то свое написали? Если на Логин компоненте, то как сделали ajax обработку полей на нем?
Александр Мальцев
Александр Мальцев
Нет, по-другому.
Uncle_Pasha
Uncle_Pasha
Доброго дня.
А подскажите пожалуйста, какие-то настройки надо прописывать для почты MODX при реализации этого механизма с регистрацией пользователей? Пока что ничего не отправляет при регистрации тестового пользователя.
Александр Мальцев
Александр Мальцев
Настройки почты в MODX находятся на странице Системные настройки & События (Шестерёнка -> Системные настройки -> Раздел «core» -> Фильтр «Почта»).
Если что-то не работает нужно смотреть журнал ошибок (Управление -> Отчеты -> Журнал ошибок).
Uncle_Pasha
Uncle_Pasha
Где настройки смотреть — это я уже понял. Вопрос был немного в другом: в настройки почты надо прописывать SMTP сервера гугла, яндекса и проч.? Чтобы сообщения отправлялись пользователям…
Александр Мальцев
Александр Мальцев
Желательно конечно же использовать почту для домена и DKIM-подпись. Но можете и так.
Руслан
Руслан
Здравствуйте. Обнаружилась проблемка. При регистрации пользователя, у которого емейл адрес с точкой вида «ivan.ivanov@mail.ru», письмо с кодом активации ему на почту не доходит. На другие адреса при этом работает нормально. Никто не сталкивался? Помогите, пожалуйста.
Александр Мальцев
Александр Мальцев
Здравствуйте. Нужно смотреть какая возвращается ошибка, может дело вообще не в точке.
Руслан
Руслан
Здравствуйте! Спасибо огромное за информативный материал. Большое дело делаете для ещё не посвящённых)
У меня встал вопрос. Создал я дополнительную таблицу для пользователей (, а не стал добавлять свойства в user_attribute значения в поле extended или добавлять поля к этой таблице). Посчитал, что так будет лучше, на случай обновления MODx.
Подскажите, пожалуйста, кто знает, куда чего нужно дописать, чтобы ID новосозданного пользователя добавлялся в поле собственной таблицы? Со связью 1-к-1. Как с таблицей user_attributes. Предполагаю, что нужно где-то в файле процессора создания пользователя дописать строки со связями с этой таблицей. И в модель изменения нужно внести. Но вот докумекать пока не могу, где именно эти изменения сделать. Дайте наводку или на водку, пожалуйста))
Руслан
Руслан
нашёл в комментариях наводку)) itchief.ru/lessons/modx-revo/modx-how-to-add-additional-fields-to-the-resource Начал делать. Спасибо огромное.
Руслан
Руслан
Нет, всё-таки думаю, что проще и правильнее добавлять связь с таблицей users в файл register.php. Но один фиг пока ещё не понял точно как что делать. А, может, нужно схему сначала по вашей инструкции сделать, потом только register.php модернизировать? Дело в том, что у меня уже установлен CMP Generator, и я с ним до сих пор нормально работал. Не хотелось бы, чтобы эти компоненты не ладили друг с другом.
Александр Мальцев
Александр Мальцев
Для этого есть системные события onUserSave, onUserRemove и др. Можно создать плагин и при наступлении этих событий написать необходимую логику (например, добавлять строки в некоторую таблицу через xPDO).
Руслан
Руслан
Спасибо большое за ответ. Надо мне таки расширять познания в части плагинов. До сих пор я их почти не касался.
Руслан
Руслан
Я ж таки добавил пару строк в процессор register.php, новый класс создал. Но, буду переделывать по вашему совету теперь, чтоб после обновления не было неприятностей
Infoster
Infoster
Здравствуйте!
Спасибо за подробную инструкцию.

У меня почему-то администратор не может получить доступ к страницам из созданной группы.
30 секунд ожидания и далее 502 ошибка.

Пользователь из этой группы страницы видит, полностью неавторизованный перекидывается на вход. С админом что-то ничего не прокатывает, в том числе добавление ему прав доступа на созданную группу ресурсов.
Infoster
Infoster
Частично проблему решил – т. к. настроен один контекст на основном домене, второй — на поддомене, просто не было единой авторизации. Остался второй момент — с 502 ошибкой, если, к примеру, снять с публикации страницу регистрации для ее временного отключения, долго висит и затем 502. Полагаю, что с Login это уже не связано, но как решить, пока не понимаю.
Александр Мальцев
Александр Мальцев
Здравствуйте! Ошибка 502 много из-за чего может происходит. В логах ничего нет?
Эд
Эд
Александр, добрый день!
Во-первых спасибо за статьи, мне как начинающему свой путь на данном поприще они очень полезны. Помогите пожалуйста разобраться со следующей проблемой: сайт не отправляет письмо для авторизации пользователя со ссылкой для подтверждения. modUser отрабатывает и неактивный user создается в группе Users, но письмо не отправляется на почту (спам тоже проверял). В чем может быть проблема?
Александр Мальцев
Александр Мальцев
Добрый! Для отправки писем её нужно настроить в MODX. Осуществляется это в системных настройках в разделе «Почта».
Дмитрий
Дмитрий
Добрый день. Совсем недавно начал изучать веб-программирование, хочу сделать интернет-проект, выбрал для его построения MODX. Тяжеловато с моими знаниями, но пытаюсь. С Login возникли два вопроса (пока):
1) И при регистрации и при сбросе пароля сервер (локалка) отправляет 2 одинаковых письма. И при сбросе пароля как то не так работает — ссылки в обоих письмах уже «expaired»
2) Вы не выложили код личного кабинета, я так понял, за него отвечает [[!Profile]], но нужна еще форма какая то. взял ее код с другого ресурса, так у меня поля профайла показываются как пустые поля формы, не заполняются плейсхолдерами. возможно где то рассогласования имен не заметил. Но почему форма? Личный кабинет — это ж не «Изменение данных»… там просто все должно быть указано обычным тескстом…
3) ах да, еще третий вопрос. Почему все в инете создают окно общее для имени и фамилии? это очень неудобно для дальнейшей работы с базами и автоматизацией некоторых процессов. Потом возможны дубли и пр. и пр. Я создавал в форме регистрации еще одну строку, переименовывал обе, старался то же самое сделать в форме профайла… Но они пустые. Может я что то не учел в работе сниппета Profile? Вы о нем не написали.
4) У меня еще задача осложняется тем, что мне нужны три группы разных пользователей, с разным набором полей профиля, а значит — с разными регистрационными формами. При этом пункт в меню «Личный кабинет» — один… Там логику надо писать с переадресацией как я понимаю? На профиль каждого типа?
Дмитрий
Дмитрий
Чтобы вводить отдельно имя и фамилию я добавил строчку и поменял имена… В результате форма требует в поле фамилии ввести электронный адрес… и когда я ввожу — отправляет ДВА электронных письма. Это уже в сниппетах так заложено?

Александр Мальцев
Александр Мальцев
Добрый! Скорее всего, вы что-то неправильно настроили. Например, поместили несколько сниппетов компонента Login на одну страницу, вот у вас и отправляются 2 письма.
Про третий пункт… Это зависит от задачи. В MODX поле fullname (полное имя) — это не обязательно имя и фамилия, это вообще может быть ник, под которым будут отображаться записи, созданные этим пользователем.
Про четвёртый пункт… Переадресация никакая не нужна. На этой страницы сначала определите, к какой группе принадлежит авторизированный пользователь, а затем уже формируйте страницу с нужными данными.
Александр Мальцев
Александр Мальцев
Если вам полей не хватает, то это можно организовать, например, с помощью дополнительных полей (extended).
Дмитрий
Дмитрий
Благодарю…

1) Сниппетов дублей нет… Скажите, а не может MODX отправлять письмо, и OpenServer тоже? потому что я настроил OpenServer на отправку, но в MODX ничего не настраивал… тем не менее может он берет настройки OpenServer и дублирует сообщения? Хотя с другой стороны, пока я не настроил OpenServer на отправку — сообщения в папке хранились. Что если убрать настройки с сервера, а MODX почту настроить? пока у меня только эта версия.
3) Спасибо, Я так и переопределил это поле — как никнейм… а через «Extended» добавил поля… пока еще не проверял — надо ведь аналогичные поля и в профиле сделать. Как я понимаю… Сразу как решу вопрос с двумя письмами займусь…
4) То есть форма с радио, которая делает активными те поля которые нужно для каждого пользователя? Как лучше? Через модификацию чанков например? или перед каждым блоком какой нибудь сниппет типа IF? И страницу «Профиль» тоже можно одну делать на все типы или на каждую свой? Это же влечет за собой и страницу изменения профиля.

Скажите, я с логикой пока не очень — если есть стандартная радиоформа без логики — какой результат она дает «в чистом виде, без обработки? Что какая то переменная (напр reg.type) равна одному из типов? Или что один из типов имеет статус (атрибут) checked? Просто от этого зависит
Дмитрий
Дмитрий
вот что дает OpenServer
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.
Александр Мальцев
Александр Мальцев
Регистрационную форму, а именно её логику на клиенте можно реализовать с помощью JavaScript.
Страницу «Профиль» можно сделать одну для всех пользователей.
Как добавить radio на форму и её обработать, можно посмотреть в комментариях в этой теме и FormIt.
Александр Мальцев
Александр Мальцев
Не знаю с чем этом может быть связано, попробуйте на реальном хостинге.
maxim
maxim
Добрый день, подскажите пожалуйста как лучше сделать, какие модули использовать и логику действий для решения следующей задачи:

На сайте есть много форм, скачать, заказать, купить
Пользователь все время заполняет одни и те же поля: email, телефон (иногда и имя)

Как сделать чтобы при одном заполнении такой формы пользователь регистрировался и автоматизировался на сайте (одновременно) А пароль ему высылался на email.
А если такой пользователь существует (по email проверяет) то при заполнении такой формы (это если он разлогинется) ему выскакивает сообщение что: вы уже зарегистрированы, проверьте свою почту там будет пароль и вам нужно авторизироваться, что-то в этом роде
Александр Мальцев
Александр Мальцев
Так пользователь может указать не свой email. Всё равно он должен подтвердить, что он принадлежит ему.
А так, если вы используете FormIt, сначала необходимо создать сниппет, который будет создавать пользователя и добавлять его в группу. Поместить данный сниппет, необходимо после отправки сообщения, т.е. после хука email. В своём сниппете создавайте нужные проверки и др.
Для создания пользователя и добавления в группу можно воспользоваться стандартными механизмами MODX:
$user = $modx->newObject('modUser');
$user->set('username', 'Новый пользователь');
$user->set('password', '1234567890');
...
Если нужно выполнять какие-то проверки и действия до отправки такой формы на email, то делаете всё аналогично, только вызов сниппета помещаете до хука email.
maxim
maxim
Там важнее чтобы он указал верный телефон…
Спасибо большое, буду пробовать.
Tatyana
Tatyana
Добрый день, Александр! Извините пожалуйста за беспокойство и глупые вопросы.
Установили компонент login. Теперь у нас стоит задача: Мы создали ресурс на сайте «Пройти тест „Самодиагностика“. Войдя на эту вкладку посетитель должен зарегистрироваться прежде чем пройти тесты. Где и как проложить пути?
Александр Мальцев
Александр Мальцев
Добрый! Если всё сделали по этой инструкции, то необходимо ресурс «Пройти тест Самодиагностика» добавить в группу ресурсов «Users». После этого доступ к этому ресурсу будут иметь пользователи группы Users, и др. пользователи имеющие доступ к этой группе ресурсов.

Если гость (неавторизованный пользователь) захочет попасть на этот ресурс, то MODX его не пустит, и он будет перенаправлен на ресурс, который указан в параметре unauthorized_page. Этот параметр находится по следующему пути: значок «Шестеренка» -> пункт «Системные настройки» -> раздел «core» -> фильтр по разделу «Сайт». В качестве значения этого параметра необходимо указать id ресурса, на который необходимо перевести пользователя, если он попытается получить доступ к ресурсу, на который он не имеет прав.
Ник
Ник
Александр, здравствуйте. Прошу помочь.
Использую расширение office как у вас на сайте. В личном кабинете мне очень понравилась таблица статистики. Загорелся, делаю себе такую же, но застопорился. Нигде не нашел информации как вывести общее количество комментариев, сделанное пользователем. Объясните, пожалуйста.

P.S.
У меня на сайте office работает вместе с minishop2. В эту статистику также хотел добавить информацию о количестве заказов, сделанных пользователем на сайте, но также не смог понять. Эта просьба не по теме, извините.
Александр Мальцев
Александр Мальцев
Здравствуйте!
Это можно выполнить, например, с помощью сниппета pdoUsers (из коллекции pdoTools) и дополнительного сниппета prepareUser:
[[!pdoUsers? 
  &users=`[[!+modx.user.id]]`
  &prepareSnippet=`prepareUser`
  &tpl=`@INLINE Дата регистрации: [[+registered]], количество комментариев: [[+totalComments]], количество тикетов: [[+totalTickets]]`
]]
Код сниппета prepareUser:
<?php
// количество комментариев
$row['totalComments'] = $modx->getCount('TicketComment', array('createdby' => $row['id'], 'published' => 1));
// количество тикетов
$row['totalTickets'] = $modx->getCount('Ticket', array('createdby' => $row['id'], 'class_key' => 'Ticket', 'published' => 1, 'deleted' => 0));
// дата регистрации пользователя (с использованием сниппета dateAgo для форматирования даты)
$row['registered'] = !empty($row['extended']['registered']) ? $modx->runSnippet('dateAgo', array('input' => $row['extended']['registered'])) : '-';
// дата последней активности пользователя (с использованием сниппета dateAgo для форматирования даты)
$row['lastactivity'] = !empty($row['extended']['lastactivity']) ? $modx->runSnippet('dateAgo', array('input' => $row['extended']['lastactivity']))	: '-';
Для minishop2 вам необходимо написать дополнительный запрос в prepareUser и получить количество записей с помощью функции getCount.
Ник
Ник
Александр, благодарю за ответ.
Видимо я что-то делаю не так, но у меня данные не отображаются.
Отдельно сниппет prepareUser частично работает. Если изменить $row['id'] на $modx->user->id] работают $row['totalTickets'] и $row['totalComments'].
Ваш вызов pdoUsers не показывает ничего. Даже нулей. В логах ошибок не пишет.
У меня pdoTools 2.11.1-pl, Modx — 2.6.2.
Вызов pdoUsers с пустым шаблоном:
Array
(
    [id] => 2
    [internalKey] => 2
    [fullname] => Nik
    [email] => aewr-eweqt@yandex.ru
    [phone] => 
    [mobilephone] => 9859294152
    [blocked] => 0
    [blockeduntil] => 0
    [blockedafter] => 0
    [logincount] => 7
    [lastlogin] => 1527415147
    [thislogin] => 1527415189
    [failedlogincount] => 0
    [sessionid] => 746ea971c7b382310a4fd929dd32c5a8
    [dob] => 0
    [gender] => 0
    [address] => 
    [country] => 
    [city] => 
    [state] => 
    [zip] => 
    [fax] => 
    [photo] => /assets/images/users/3cbd16ff046e2f934a2c6bbc3692a7fe.jpg
    [comment] => 
    [website] => 
    [extended] => Array
        (
            [passwd] => 12345
            [passwdAgain] => 12345
        )

    [username] => aewr-eweqt@yandex.ru
    [password] => lCNA4rOGZYHU+Fm954EADLznnfoWd2QiTtzSoD9K/QU=
    [cachepwd] => 
    [class_key] => modUser
    [active] => 1
    [remote_key] => 
    [remote_data] => 
    [hash_class] => hashing.modPBKDF2
    [salt] => 5071ad14ea1e135f0ff7161496e04d7e
    [primary_group] => 0
    [session_stale] => a:1:{i:0;s:3:"mgr";}
    [sudo] => 0
    [createdon] => 1524163811
    [idx] => 1
    [link] => 
)

Решил пока проблему так (коряво, но работает):
Создал два отдельных сниппета — User_orders (выводит количество заказов):
<?php
// количество заказов
$all_orders = $modx->getCount('msOrder', ['user_id' => $modx->user->id]);
echo $all_orders;
и User_comments:
<?php
// количество комментариев
$all_comments = $modx->getCount('TicketComment', array('createdby' =>  $modx->user->id, 'published' => 1));
echo $all_comments;
И их вызываю в таблице статистики.

Дату регистрации получаю через сниппет officeAuth:
[[!officeAuth?
     &tplLogout=`nav.LK`
]]
В чанке вставляю плейсхолдер [[+createdon:dateAgo]]
Александр Мальцев
Александр Мальцев
Трудно сказать, должно и так работать. Попробуйте вместо @inline использовать «реальный» чанк.
Александр
Александр
Александр, добрый день. У меня проблема с активацией, есть ссылка: href=«site.ru/confirm?lp=OGh5OXdtc2I&lu=cXdkd3Fkd3Fkd3FAc2Vmc2Yuc2Zz». При переходе по такой ссылке, сниппет [[ConfirmRegister]] перебрасывает на страницу ошибки. Естественно аккаунт не активируется. Но если же вместо & поставить просто & то всё прекрасно активируется. Так что же делать в данном случае? Как исправить ссылку?
Александр Мальцев
Александр Мальцев
Добрый день! Проблема на настоящем хостинге или локальном сервере?
Александр
Александр
на локальном, но проблема решена! Оказывается стоял амперсант, поэтому я просто подставил в ссылку фильтр :replace=`& amp==&`. А могла бы возникнуть данная проблема на настоящем хостинге?
Александр Мальцев
Александр Мальцев
Нет, не должна.
Анатолий
Анатолий
Добрый день.
Александр, Ваш сайт великолепен. Нахожу на нем ответы на множество вопросов. Спасибо за сайт.
Использую его как учебник и образец.
Подскажите, как по окончании успешного заполнения формы регистрации новым пользователем
сообщить ему в браузере «Уважаемый имярек регистрация проходит успешно, на Ваш емейл отправлено письмо активизации регистрации. Для завершения процесса регистрации осталась сама малость. Обязательно нажмите на ссылку в письме активации регистрации.»
Александр Мальцев
Александр Мальцев
Здравствуйте! Спасибо.
Для этого необходимо создать дополнительный ресурс и разместить на нём приведённое выше сообщение.
После этого необходимо в сниппет Register добавить параметр submittedResourceId и указать в качестве значения id созданного ресурса.
[[!Register? 
    &submittedResourceId=`14`
    ...    
]]
Теперь после отправки регистрационной формы будет происходить перенаправление на ресурс с id, равным 14.
Vasyl
Vasyl
Добрый день. Столкнулся со следующей задачей. Можно ли как-то сделать так чтоб скачивать файлы с сайта могли только зарегистрированные пользователи? Например пользователь заходит на сайт. Хочет скачать файл по ссылке, его перекидывает на страницу регистрации или авторизации. После регистрации или авторизации он может скачивать файлы по ссылкам на сайте. Как это реализовать? :)
Александр Мальцев
Александр Мальцев
Это можно выполнить по-разному.
Например, в ссылках можно хранить не путь к файлу, а ссылку на некоторую промежуточную страницу (например, downloads) и GET-параметр.
<a href="/downloads?id=7">Скачать</a>
В админке MODX создать эту промежуточную страницу и дать доступ к ней только авторизированным пользователем. На этой странице необходимо будет написать логику, которая будет в зависимости от значения id выдавать ссылку для кнопки расположенной на этой странице. Т.к. не зарегистрированные пользователи не будут иметь доступ к этой странице, то они не смогут скачать этот файл.
Для надёжности в качестве значения id можете использовать сгенерированный по некоторому алгоритму хэш код.

Другой вариант это использовать фильтры. Например, при каждой генерации страницы проверять, авторизирован ли пользователь, и если да, то подставлять ссылку.
<a href="[[!+modx.user.id:isloggedin:is=`1`:then=`путь_до_файла`:else=`путь_к_странице_авторизации`]]">Скачать</a>
Vasyl
Vasyl
Спасибо большое! Если будут возникать вопросы, буду писать сюда! :)
giru
giru
Используем так же снипет Login. Написали снипет для modx. Сайт . Снипет был написан для того чтобы заблокировать доступ к уроку 2 для незарегистрированного юзера, а если он зарегистрирован то открыть доступ. Так же для 3 урока, только для доступа здесь отправляет на оплату. Снипет вроде написан верно, но он не работает. На сколько мы поняли что дело в сессии, но мы не знаем как она формируется в данном снипете(т.е. id сессии ).
Подскажите как узнать или где найти как формируется id сессии.
Изначально планировали без использования данного снипета и id сессии формировался с помощью функции time();
<?php
session_start();
if ($_GET['lesson']==2)
{
    if (!isset($_SESSION['login']))
    {
        header("Location: /avtorizacziya");
        die();
    }
    else 
    {
        header("Location: /lesson.html?lesson=2");
        die();
    }
}
if ($_GET['lesson']==3)
{
    if (!isset($_SESSION['login']))
    {
        header("Location: /avtorizacziya");
        die();
    }
    else
    {
        header("Location: /pay");
        die();
    }
}
Александр Мальцев
Александр Мальцев
Для этого необходимо просто создать группу для ресурсов, доступ к которой, разрешить авторизированным пользователям. Аналогично для ресурсов, доступ к которым нужно предоставить только после оплаты.
Ленур
Ленур
Здравствуйте, у меня возникла проблема следующего характера:
при создании и активации учетной записи на сайте, страницы авторизации и регистрации перестают загружать.
Если удалить созданную учетную запись из админки, то страницы сразу загружаются, подскажите в чем может быть проблема и пути её решения?
Спасибо.
Александр Мальцев
Александр Мальцев
Здравствуйте!
Не знаю, не сталкивался с этим. Попробуйте посмотреть ошибки в логах.
Евгений
Евгений
Здравствуйте, Александр,
сделал по вашему уроку страничку регистрации и обнаружил, что все поля, кроме поля «Email:» подвержены XSS уязвимости. Воспроизводится это так, нужно в любое поле вставить
это '" onMouseOver=«alert(1);' В начале стоит двойная кавычка и перед alert тоже двойная
кавычка. Затем нажимаем кнопку „Далее“, теперь если навести мышку на поле в которое ввели этот код, то выскочит окошко с единичкой.
Скажите пожалуйста, как проверять введенные данные?
Александр Мальцев
Александр Мальцев
Здравствуйте! Для этого необходимо удалять все эти теги из строки. Для этого можно использовать валидатор stripTags.
[[!Register?
    &submitVar=`submitbtn`
    &activation=`1`
    &activationEmailSubject=`Подтверждение регистрации`
    &activationResourceId=`31`
    &successMsg=`<p>Спасибо за регистрацию. На вашу электронную почту [[!+reg.email]] отправлено письмо, содержащее ссылку, необходимую для активацию аккаунта. Перейдите по этой ссылке, чтобы завершить процедуру регистрации.</p>`
    &usergroups=`Users`
    &usernameField=`email`
    &passwordField=`passwd`    
    &validate=`nospam:blank,
      passwd:required:stripTags:minLength=^8^,
      passwdAgain:stripTags:passwdAgain=^passwd^,
      fullname:required:stripTags,
      email:required:email`
    &placeholderPrefix=`reg.`
]]
Кроме этого сейчас все современные браузеры блокируют это (ERR_BLOCKED_BY_XSS_AUDITOR).
Евгений
Евгений
Здравствуйте, Александр, спасибо за ответ. К сожалению валидатор stripTags никак не влияет. На всякий случай проверил какие браузеры это блокируют. Оказалось только Opera и Chrom, а Firefox, Microsoft Edge, Internet Explorer 11 не блокируют. Может есть еще какие-то валидаторы, или может как-то свой валидатор вставить?
Александр Мальцев
Александр Мальцев
Проверил, работает!
Может вы вызываете сниппет кэшированным?

Евгений
Евгений
Нет, сниппет вызывается некэшированным, я скопировал ваш пример выше. Кеш браузера тоже почистил. Если посмотреть исходный код страницы после вставки XSS то будет вот такая строка:
<input type="text" name="fullname" class="form-control" id="fullname" placeholder="Как Вас зовут" value="" onMouseOver="alert(1);">
Буду разглядывать код под «микроскопом», может где-то еще ошибки.
Александр Мальцев
Александр Мальцев
Можете попробывать использовать strip:
fullname:strip=^"^:required,
Евгений
Евгений
О, отлично, это помогло, спасибо!
evgen
evgen
Все делал по уроку
evgen
evgen
Доброго времени суток Александр! Подскажите пожалуйста по какой причине может не активироваться пользователь. я уже по нескольким урокам пытаюсь реализовать, но всегда во вкладке активный написано нет. Все делал по уроку. Спасибо.
Александр Мальцев
Александр Мальцев
Для того чтобы пользователь стал активным, он должен перейти по ссылке, которую он получил в письме. Страница, на которую ведёт эта ссылка, должна содержать вызов сниппета ConfirmRegister. Он то и переводит флажок «Активный» во включенное состояние.
evgen
evgen
Александр здравствуйте! спасибо за ответ. Но у меня есть страница подтверждения с таким содержанием
[[!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
Александр Мальцев
Александр Мальцев
Если вы осуществляете переход по ссылке вручную, то
&amp;
необходимо заменить на &.
evgen
evgen
заменил — все равно не активный
Александр Мальцев
Александр Мальцев
Если вы пользователя регистрировали давно (по умолчанию больше 3 часов назад), то вы не сможете его активировать по указанной ссылке. Она будет уже не действительной. В этом случае необходимо ещё раз запросить ссылку.

Ещё один момент. Эти действия лучше производить в другом браузере или из режима инкогнито. Чтобы авторизация текущего пользователя в админке (admin), не влияла на эти действия.
evgen
evgen
насчет времени каждый раз нового делаю и кэш чищу. а по поводу другого браузера — все равно не активирует
Александр Мальцев
Александр Мальцев
Надо тогда посмотреть ошибки в логах. Может тогда станет понятно почему не работает.
Можно также попробывать обновить MODX на эту же версию, которая у вас стоит или на более новую. И переустановить компонент Login.
evgen
evgen
Большое спасибо Александр. На хостинге сработало с другого браузера.
Павел
Павел
Здравствуйте!
Спасибо за внятное объяснение и приятный дизайн Вашего сайта!
Подскажите, пожалуйста — как предоставить пользователю выбирать себе группу при регистрации?
Например, мы на форме ставим несколько радиокнопок
    <p><input name="group" type="radio" value="Users">Users</p>
    <p><input name="group" type="radio" value="UsersFL">UsersFL</p>
    <p><input name="group" type="radio" value="UsersJL" checked>UsersJL</p>
    <p><input name="group" type="radio" value="UsersIP">UsersIP</p>
Нужно, чтоб значение выбранной радиокнопки отправлялось в параметр &usergroups сниппета Register.

Я пробовал так:

[[!Register?
   .....
    &usergroups=`group`.
.....
]]
и вот так

[[!Register?
   .....
    &usergroups=`$_POST['group']`.
.....
]]
Оба варианта отправляют ключ=значение в дополнительные поля данных…
Как вариант, конечно можно на странице сделать табы из этих радиокнопок, выводить на каждой вкладке сниппет с нужными параметрами и форму тоже с нужными полями, но код странички очень громоздкий получается… Может есть более универсальный вариант?
Александр Мальцев
Александр Мальцев
Здравствуйте!
Чтобы получить значение ключа POST нужно написать сниппет или использовать такую конструкцию (если установлен pdoTools):
[[#POST.key]]
Т.е.
[[!Register?
    &usergroups=`[[#POST.group]]`
    ...
]]
Кроме этого необходимо ещё написать валидацию, чтобы пользователь мог попасть только в одну из этих групп.
Павел
Павел
Благодарю за оперативный ответ!
[[#POST.group]] — этот вариант сработал бы в чанке сниппета из pdoTools, на столько я успел разобраться…
У меня же код расположен в contetn ресурса «Регистрация» — у меня этот вариант не сработал…

Спасся простеньким сниппетом:
getPOSTkey
<?php
if (isset($_POST)){
    $k = $_POST[$key];
    return $k;
}
Вызвал так:
[[!Register?
...
    &usergroups=`[[!getPOSTkey? &key=`group`]]`
...
]]
Зато теперь знаю, как получить значения ключей $_POST массива в pdoTools.

Спасибо!
Impulse
Impulse
Добрый вечер. Использовал код у вас в примере, ID ресурсов выставил свои. Только вот после регистрации страница просто обновляется, письмо не приходит, журнал ошибок пуст.
Александр Мальцев
Александр Мальцев
Здравствуйте! Пользователь создаётся? Проверьте поддерживает ли хостинг отправку писем.
Impulse
Impulse
Добрый вечер! Проблему решил, регистрация проходит, пользователь создается, но письмо на почту по прежнему не приходит, отправку писем хостинг поддерживает
Александр Мальцев
Александр Мальцев
Добрый день. Проверьте настройки почты (Системные настройки -> Разделы «Почта» и «Авторизация и безопасность»).
Impulse
Impulse
Добрый день, в разделе авторизация все по умолчанию стоит, раздел почта настроен так: Изображение 1
Александр Мальцев
Александр Мальцев
Проверьте ещё значение системной настройки emailsender.
Impulse
Impulse
Значение системной настройки emailsender такое же как и mail_smtp_user то есть один и тот же ящик указан
Александр Мальцев
Александр Мальцев
Не знаю, в этом случае должно работать. Попробуйте проверить ещё раз, может что-то где-то упустили.
Impulse
Impulse
Все настроено верно, выяснил что письмо даже не отправляется, вот мой код, что тут может быть не так:
[[!Register?
    &submitVar=`submitbtn`
	&activationResourceId=`18`
    &activationEmailTpl=`lgnActivateEmailTpl`
    &activationEmailSubject=`Спасибо за регистрацию!`
    &successMsg=`<p>Спасибо за регистрацию. На вашу электронную почту <strong>[[+email]]</strong> отправлено письмо, содержащее ссылку, необходимую для активацию аккаунта. Перейдите по этой ссылке, чтобы завершить процедуру регистрации.</p>`
	&usergroups=`Users`
]]
<div class="register">
    <div class="registerMessage">[[+error.message]]</div>
    <form class="form" action="[[~[[*id]]]]" method="post">
        <input type="hidden" name="nospam:blank" value="" />
        <div class="register-row">
			<label for="username">[[%register.username? &namespace=`login` &topic=`register`]] [[+error.username]]	</label>
			<input type="text" name="username:required" id="username" value="[[+username]]" />
		</div>
		<div class="register-row">
			<label for="email">[[%register.email]] [[+error.email]]</label>
			<input type="text" name="email" id="email" value="[[+email]]" />
		</div>
		<div class="register-row">
			<label for="password">[[%register.password]] [[+error.password]]</label>
			<input type="password" name="password:required" id="password" value="[[+password]]" />
		</div>
		<div class="register-row">
			<label for="password_confirm">[[%register.password_confirm]] [[+error.password_confirm]]</label>
			<input type="password" name="password_confirm:password_confirm=`password`" id="password_confirm" value="[[+password_confirm]]" />
		</div>

        <input type="submit" class="register-btn" name="submitbtn" value="Регистрация" />
    </form>
</div>
Александр
Александр
Александр Здравствуйте! Есть такая проблема, если аноним зарегистрировался перешёл по ссылке в письме, автоматом авторизовался, но в группе users его нет он авторизованный аноним, почему так происходит уже долгое время ломаю голову не могу найти причину, его же должно автоматом после регистрации переносить в группу Users, с чем эта проблема может быть связана?
Александр Мальцев
Александр Мальцев
Добрый день!
Группу, в которую необходимо поместить пользователя, необходимо указать в параметре usergroups:
[[!Register?
    &usergroups=`Users`
Ми
Ми
Доброго времени суток!
Подскажите, каким образом в админке сделать сортировку пользователей по id уже изначально, так как сейчас идет по имени???

Заранее спасибо

картинка
itchief.ru/assets/uploadify/f/b/c/fbc907ae3ab331df797860e772e58564.jpg
Александр Мальцев
Александр Мальцев
Здравствуйте!
Необходимо открыть файл \core\model\modx\processors\security\user\getlist.class.php и изменить свойство defaultSortField:
public $defaultSortField = 'id';
Илья
Илья
Добрый день! Хочу написать выгрузку юзеров и автоматическую регистрацию из csv используя данное дополнение.
В csv таблице есть стандартные поля типа e-mail, имя и телефон. Написал снипет который разбирает таблицу в массив используя цикл for. Как я понимаю мне нужно в теле цикла при каждой итерации вызывать отработку сниппета [[!Register?]] и передавать ему переменные со значениями полей(e-mail, имя и телефон). Не подскажите как мне это реализовать?
Александр Мальцев
Александр Мальцев
Добрый день!
Для данной задачи не вижу смыла использовать компонент Login.
Добавить пользователя в систему можно так:
<?php

// создаем пользователя
$user = $modx->newObject('modUser');
// задаем имя пользователя и пароль
$user->set('username', 'Имя пользователя');
$user->set('password', 'Пароль пользователя');
// сохраняем пользователя
$user->save();

// создаем профиль
$profile = $modx->newObject('modUserProfile');
// устанавливаем поля
$profile->set('fullname', 'Полное имя пользователя');
$profile->set('email', 'user@mysite.ru');
// добавляем профиль пользователю
$user->addOne($profile);

// сохраняем
$profile->save();
$user->save();
Илья
Илья
Благодарю за ответ! Я пользую подтверждение емайла и автосоздание пароля. то есть человек может просто ввести емайл и нажать зарегестрироваться. Далее к нему на почту идет письмо с подтверждением регистрации. На странице подтверждения у меня сниппет который добавляет подписку к закрытому контенту на 1 месяц. Сообщение и отправку для подтверждения емайла делает дополнение Login. У нас проходят курсы где участвуют порядка 100 человек. есть ексель файл с емайлами участников. Чтобы каждый не регистрировался вручную руководство хочет скрипт чтобы контент менеджер загружал экселевский файл и все 100 человек зарегестрирровались и получили письмо с потдверждением регистрации. на странице потдверждения отрабатывает снипет который добавляет юзеру подписку на скрытый контент на месяц. Csv нужен только лишь для быстрого импорта судентов(юзеров). Если использовать ваш код что вы написали боюсь много придется дописывать вручную что уже есть в данном компоненте… может вы еще что то можете подсказать?
Александр Мальцев
Александр Мальцев
Сниппет Register не заточен под такую задачу. Ему нельзя так просто передать данные. В любом случае придётся что-то дописывать.
Владимир
Владимир
Доброго времени суток) а не подскажете как сделать автоматическую блокировку пользователя при регистрации?(это нужно что бы потом вручную делать разблокировку на некоторое время). А то смотрел содержимое плагинов Login и хотел сделать по аналогии с активацией, но так не нашел нужного(
Александр Мальцев
Александр Мальцев
Здравствуйте!
Для этого необходимо добавить в сниппет Register хук, в котором нужно установить полю пользователя blocked значения 1.
[[!Register?
    &preHooks=`rhUserBlocked`
    ...
Сниппет rhUserBlocked:
<?php
$hook->setValue('blocked',1);
return true;
Алексей
Алексей
Здравствуйте, в login modx не осуществляется регистрация, вернее приходит письмо, я переходу по ссылке и она не переадресовывает на страницу которая указана в &redirectTo=`25`- в адресной строке указано sitename/reg-confirm?lp=Ynh3cWNycGg&lu=NjY2NjY2 и дальше ничего не происходит
И как осуществить может такую форму регистрации как у Вас на сайте и есть ли возможность это сделать без перехода на другую страницу?
Александр Мальцев
Александр Мальцев
Здравствуйте! Для начала посмотрите есть ли ошибки в журнале.
Илья
Илья
Здравствуйте,

Подскажите пожалуйста.

Задача следующая -при регистрации в определённую таблицу вносятся имя и фамилия пользователя.
после авторизации попадает на страницу с формой обновляющей данные в этой таблице.
При заходе на эту страницу в форму должен подставляться индивидуальный идентификатор пользователя (будет сравниваться с id строки при обновлении таблицы).

Суть задачи — пользователь ввёл данные в форму, в таблице появилась запись, потом (на отдельной форме) эту запись сравнили с определённым числом и если совпало — обновили ячейку таблицы. Пользователей будет много, поэтому спрашиваю совета от чего лучше оттолкнуться.
Александр Мальцев
Александр Мальцев
Здравствуйте! Осуществляйте связь вашей таблицы с таблицей modx_user на основе id.
Илья
Илья
Здравствуйте, спасибо за ответ.
Могли бы подсказать более подробно?
Александр Мальцев
Александр Мальцев
Насколько понял, вам необходима дополнительная таблица, в которую вы хотите сохранить различные данные, связанные с пользователем, а также впоследствии их с чем-то сравнивать и обновлять на основании них какие-то другие данные.
Как начать это делать, можно посмотреть в этой статье.
taras
taras
А как при помощи модуля Login попаcть в админку /manager?
Александр Мальцев
Александр Мальцев
Назначить соответствующие права группы пользователей в которую он добавляется.
Владимир
Владимир
Здравствуйте, как разрешить зарегестрированным пользователям добавлять статьи в избранное и нажимать нравиться/не нравится, пишет у вас недостаточно прав для этого действия? Настраивал права по вашему уроку.
Александр Мальцев
Александр Мальцев
Для совершения эти действий пользователем (входящих в группу Users) необходимо установить права.
Для этого нажимаем в главном меню админки на «Шестерёнку» -> выбираем пункт «Контроль доступа». После этого нажимаем правой кнопкой мыши по группе Users и выбираем пункт «Редактировать». Затем переходим на вкладку «Права доступа» и открываем вкладку «Доступ к контекстам». На данной вкладке нажимаем на кнопку «Добавить контекст». В открывшейся форме «Доступ групп пользователей к контексту» устанавливаем следующее:
  • контекст — web;
  • минимальная роль — Member 9999;
  • политика доступа — TicketUserPolicy.
В итоге вы должны иметь 2 записи в этой вкладке.
Владимир
Владимир
Спасибо, заработало. Можете еще сказать как в личном кабинете выводить комментарии которые пользователь написал и статьи который он добавил в избранное?
Александр Мальцев
Александр Мальцев
Для этих целей можете воспользоваться готовыми сниппетами.
1. Для комментариев использовать сниппет getComments:
[[!getComments?
  &action=`tickets`
  &user=`[[!+modx.user.id]]`
]]
2. Для избранного сниппет getStars:
[[!getStars?
  &action=`Ticket`
  &user=`[[!+modx.user.id]]`
]]
Владимир
Владимир
Спасибо, все работает! Ваш сайт очень помогает мне!
rumano
rumano
Здравствуйте!
Большое спасибо за интересную статью.
Хотелось узнать следующее. Допустим, у нас есть форма регистрации. В нее нужно добавить поле-чекбокс «С условиями согласен». Как это можно реализовать в MODX? С MODX начал работать недавно. Спасибо.
rumano
rumano
Код вызова сниппета Register:
[[!Register?
  &submitVar=`login-register-btn`
  &activation=`1`
  &activationEmailSubject=` Подтверждение регистрации`
  &activationResourceId=`9`
  &successMsg=` Вам нужно подтвердить свою регистрацию.`
  &usergroups=`Users`
  &validate=`nospam:blank,
    username:required:minLength=^8^,
    password:required:minLength=^8^,
    password_confirm:password_confirm=^password^,
    fullname:required,
    email:required:email,
    agreed:contains=^agree^:required`
  &usernameField=`email`
]]
...
...
<div class="checkbox">
  <label>
    <input name="agreed:contains=^agreed^:required" type="checkbox" value="agree"[[%register.agreed:equalto=`agreed`:then=` checked="checked"`]] data-parsley-required="true"> I agree to the <a href="#" class="text-info">Terms of Service</a>
  </label>
  [[+error.agreed:notempty=`<ul class="parsley-errors-list filled"><li class="parsley-required">[[+error.agreed]]</li></ul>`]]
</div>
Спасибо.
Александр Мальцев
Александр Мальцев
Здравствуйте! Спасибо!
1. В HTML форму регистрации добавить чекбокс (при использовании префикса reg.):
<input type="checkbox" name="agreed" value="agreed" [[!+reg.agreed:is=`agreed`:then=`checked`:else=``]]> I agree 
<span>[[!+reg.error.agreed]]</span>
2. Создать сниппет (кастомный валидатор), например, имеющий имя checkAgreed:
<?php
$success = $value == 'agreed';
if (!$success) {
  $validator->addError($key,'Вы не приняли условия пользовательского соглашения!');
}
return $success;
3. В сниппете Register (т.к. в формы мы использовали префикс reg.) добавить:
[[!Register?
  ...
  &customValidators=`checkAgreed`
  &validate=`...,
    agreed:checkAgreed`
  &placeholderPrefix=`reg.`
]]
rumano
rumano
Добрый день. Скажите, пожалуйста, еще: как можно хранить эту переменную так, чтобы по этому полю можно было производить сортировку и фильтрацию. Спасибо.
Александр Мальцев
Александр Мальцев
Она и так автоматически сохраняется в дополнительных полях пользователя. В таблице user_attributes (профиле пользователя) в поле extended.
Для выборки данных (с возможностью сортировки и фильтрации) скорее всего придётся писать свой сниппет, т.к. в этом поле данные хранятся в формате JSON.

Если пригодится, то для того чтобы эти данные не сохранять в базу необходимо их указать в параметре excludeExtended:
[[!Register? &excludeExtended=`agreed`]]
Alexander
Alexander
Добрый день, а как сделать так чтобы при регистрации еще отправлялось письмо администратору?
Необходима ручная активация пользователя на сайте
Александр Мальцев
Александр Мальцев
Добрый вечер. Для этого необходимо сниппету Register добавить хук (параметр), код которого и будет отправлять письмо администратору:
[[!Register?
  ...
  &postHooks=`mailToAdministrator`
]]
Ну, и сам сниппет mailToAdministrator:
<?php
$message = 'Здравствуйте, администратор. Зарегистрировался новый пользователь. Имя: '.$hook->getValue('fullname').'Email:'.$hook->getValue('email');
$modx->getService('mail', 'mail.modPHPMailer');
$modx->mail->set(modMail::MAIL_BODY,$message);
$modx->mail->set(modMail::MAIL_FROM,'no-reply@mysite.ru');
$modx->mail->set(modMail::MAIL_FROM_NAME,'Имя сайта');
$modx->mail->set(modMail::MAIL_SENDER,'no-reply@mysite.ru');
$modx->mail->set(modMail::MAIL_SUBJECT,'Регистрация нового пользователя');
$modx->mail->address('to','admin@mysite.ru');
$modx->mail->setHTML(true);
if (!$modx->mail->send()) {
    $modx->log(modX::LOG_LEVEL_ERROR,'Произошла ошибка при отправке почты: '.$err);
}
$modx->mail->reset();
return true;
Alexandro
Alexandro
Извиняюсь, работает! Почистил кэши и заработало, спасибо!
Дмитрий
Дмитрий
Здравствуйте, подскажите, как решить следующую задачу. Пользователь зарегистрировался или вошел на сайт. В footer есть место, где пользователю предлагается авторизоваться или пройти регистрацию.
Использую условие:
[[!+modx.user.id:isloggedin=`<li>Добрый день, [[+modx.user.username]].</li>`:else=`<li>Добрый день, гость. Вы можете <a href="[[~56]]">авторизоваться</a> или пройти <a href="[[~58]]">регистрацию.</a></li>`]]
Но почему-то ничего не происходит.
itchief.ru/assets/uploadify/9/1/9/919d49859d83067b05bcf71f95c1c772.jpg
Александр Мальцев
Александр Мальцев
Здравствуйте, данное значение необходимо сравнивать с 1:
[[!+modx.user.id:isloggedin:is=`1`:then=`Да`:else=`Нет`]]
Alexandro
Alexandro
Спасибо за подсказку!
Написал у себя:
[[!+modx.user.id:isloggedin:is=`1`:then=`Добрый день, [[+modx.user.username]]!`:else=`Здравствуйте, гость!`]]
Теперь у зарегистрированного юзера вместо «Здравствуйте, гость!» появляется «Добрый день, (адрес мейла)!». Если же вместо +modx.user.username написать +modx.user.fullname или просто +fullname, то… имя не появляется, просто «Добрый день, !»
(В комментариях к публикациям, где стоит
<span class="ticket-comment-author">[[+fullname]]</span>

полное имя появляется.)
Как сделать, чтобы в этом поле было полное имя, указанное при регистрации?
Александр Мальцев
Александр Мальцев
Будет так:
[[!+modx.user.id:isloggedin:is=`1`:then=`Добрый день, [[+modx.user.id:userinfo=`fullname`]]!`:else=`Здравствуйте, гость!`]]
Alexandro
Alexandro
Все равно то же самое :(
Александр
Александр
Здравствуйте, помогите с выбором пола в форме регистрации. Никак не получается зарегистрировать пол. Вот код радиокнопки:
<td valign=top nowrap=nowrap>
<b>Пол:<span style='color:#e00;'><b> *</b></span>
</td>
<td>
<input name=pol type=radio value="[[!+reg.gender]]" id=1>
<label for=pol1>Мужской</label>   
<input name=pol type=radio value="[[!+reg.gender]]" id=2>
<label for=pol2>Женский</label>
								   </td>
Александр Мальцев
Александр Мальцев
В MODX поле пол имеет имя gender. Для задания этому полю значений необходимо использовать числовые значения: 0 (не установлено), 1 (мужчина), 2 (женщина), 3 (скрыт).
<input name="gender" type="radio" value="1" [[!+reg.gender:is=`1`:then=`checked`:else=``]]>
<label for="gender">Мужской</label>   
<input name="gender" type="radio" value="2" [[!+reg.gender:is=`2`:then=`checked`:else=``]]>
<label for="gender">Женский</label>
Vlad
Vlad
Доброго времени суток, Александр!

Зарегистрированный пользователь при первом входе блокируется сайтом (окно уведомления предлагает обратиться к администратору). В разделе Пользователи, админпанели галочка блокировка не выставлена. Куда смотреть, или в примере юзеры становятся доступны после прямой активации админом?
Александр Мальцев
Александр Мальцев
Пользователь для того чтобы войти под своими учётными данными должен их после регистрации подтвердить посредством ссылки из email. Блокировка пользователя по умолчанию производится только после 5 неудачных попыток входа. Определяется это значение параметром failed_login_attempts (в системных настройках). Длительность блокировки составляет по умолчанию 60 минут (параметр в системных настройках blocked_minutes).
Александр
Александр
Кэширование не помогло. Скопировал чанк рабочей регистрации, вызываю два чанка на разных страницах! Работает только первый(хотя они идентичны)! В чем может быть дело?
Александр Мальцев
Александр Мальцев
Проверяйте… Всё должно работать. Может вы просто не отключили визуальный редактор или что ещё. Также попробуйте очистить кэш сайта.
Александр
Александр
Где то в системных настройках видел разрешение о использовании одного email для нескольких пользователей, у меня стояло «Да». Я вставил нет, оно что не работает? И еще вопрос: на сайте две группы пользователей, две регистрации, 1-работает, 2- нет. Регистрация №2 копия №1 с доп.полями. Вызываю так: [[$lgnRegisterSpecFormTpl]]. Подскажите куда смотреть.
Александр Мальцев
Александр Мальцев
Это просто для примера. Используя хуки можно, например, настроить какие-то дополнительные проверки того же логина или любых других полей в зависимости от задач.
А так да… В MODX Revolution есть такой параметр (allow_multiple_emails). Если ему установить значение нет, то разные пользователи не смогут иметь один и тот же адрес email. Она находится в разделе «Авторизация и безопасность».
Попробуйте вызвать чанк не кэшированным. Или сделать одну форму но с переключателями. Если выбран один, то одни поля. И если другой переключатель, то другие. Ещё один вариант — это в зависимости от get параметра страницы отображать одну или другую форму.
Александр
Александр
Т.е. у него в функциях заложено проверять только логин? Попробую Ваш хук переделать.
Александр Мальцев
Александр Мальцев
Да, он проверяет только поле username. В статье мы установили в качестве значения данного поля email и тем самым защитили процесс регистрации пользователей от использования одинаковых email.
В комментарии приведён другой способ, в котором в качестве username, например, может использоваться логин. А email пользователя проверятся с помощью хука. Т.е. он ищет, если у других пользователь точно такой же email. И если есть, то данный хук прерывает процесс выполнения регистрации и выводит сообщение о том, что пользователь с таким email уже есть.
Александр
Александр
Возникли новые вопросы! При регистрации проверка email по базе происходит, а логина нет. Как это можно исправить?
И выбором поля не могу разобраться. Подскажите пожалуйста!
Александр Мальцев
Александр Мальцев
Можно сделать так.
1. Добавить в форму поле для ввода логина:
<input type="text" name="username" class="form-control" id="username" placeholder="Логин" value="[[!+reg.username]]">[[!+reg.error.username]]
2. В вызове сниппета Register изменить значения параметра, отвечающего за имя пользователя (т.е. указать username):
&usernameField=`username`
3. Для проверки ввода в форме регистрации существующего email написать хук (например, checkUserEmail):
$email = $hook->getValue('email');
$where = array(
  'email' => $email
);
$emails = $modx->getCollection('modUserProfile',$where);
if (count($emails) >= 1) {
  $errorMsg = 'Пользователь с таким email существует';
  $hook->addError('email',$errorMsg);
  return false;
} else {
  return true;
}
4. Указать параметр хук в качестве параметра сниппета Register:
&preHooks=`checkUserEmail`
Аноним
Аноним
Нашел, дело было в HTML коде перед формой и коде кнопки отправления. Теперь письма приходят целых два. И ошибки странные для меня. Покопаюсь, если сам не справлюсь напишу. Спасибо за ваши ответы.
Аноним
Аноним
Все по прежнему, и ошибка та же.
Аноним
Аноним
Выручайте! Регистрация не работает! Письмо не приходит!
[[!Register?

    &submitVar=`submitbtn`
	&generatePassword=`1`
	&validatePassword=`0`
    &activation=`1`
    &activationEmailSubject=`Подтверждение регистрации`
    &activationResourceId=`23`
    &successMsg=`<p>Спасибо за регистрацию. На вашу электронную почту [[!+reg.email]] отправлено письмо, содержащее ссылку, необходимую для активацию аккаунта. Перейдите по этой ссылке, чтобы завершить процедуру регистрации.</p>`
    &usergroups=`Users`
	&placeholderPrefix=`reg.`
	&preHooks=`recaptchav2`
    &usernameField=`username`
    &passwordField=`passwd`    
    &validate=`nospam:blank,
      username:required,
      email:required:email`
    &placeholderPrefix=`reg.`
]]





                      <form action="[[~[[*id]]]]" method="post" class="form-horizontal">
                      <input type="hidden" name="nospam" id="nospam" value="[[!+reg.nospam]]">


                       <div class=box-grey style="padding: 15px;">
                             <table class=reg_table>
                              <tr valign=top>


                               <td nowrap=nowrap width=100><b>Имя (ник):<span style='color:#e00;'><b> *</b></span>
                                   </b>

					           </td>

                               <td>
							      <input type="text" name="username" id="username" size=20 maxlength=100 style="width: 300px;" placeholder="" value="[[!+reg.username]]">
                      <span class="help-block text-error">
                    [[!+reg.error.username]]
                      </span>  
					           </td>            
                              </tr>

                              <tr valign=top>

                                  <td align="left" width=100><b>E-mail:<span style='color:#e00;'><b> *</b></span>
                                  </td>

                                  <td>
                                      <input type="email" name="email" id="email" size=40 maxlength=40 style="width: 300px;" placeholder="" value="[[!+reg.email]]">
                      <span class="help-blo'ck text-error">
                    [[!+reg.error.email]]
                      </span>        
                                  </td>

					           <tr>

                               <tr valign=top>
                                   <td valign=top nowrap=nowrap><b>Пароль:</b></td>
				                   <td style='color: #666; font-size: 14px;'>Будет сформирован автоматически и отправлен в письме
								   <input type="hidden" name="passwd" id="passwd" value="[[!+reg.passwd]]">
								   </td>
						       </tr>

                      <input type="hidden" name="passwd" id="passwd" value="[[!+reg.passwd]]">


                               <tr valign=top>

                                   <td valign=top nowrap=nowrap><b>Пол:<span style='color:#e00;'><b> *</b></span>
								   </td>
				                   <td>
									   <input name=pol type=radio value=1 id=pol1>
									   <label for=pol1>Мужской</label>   
									   <input name=pol type=radio value=2 id=pol2>
									   <label for=pol2>Женский</label>
								   </td>

								<tr valign=top>
								    <td align="left" width=100><b>Город:
									</td>
                                    <td>
									<input type="city" name="city" id="city" size=40 maxlength=40 style="width: 300px;" placeholder="" value="[[!+reg.city]]">


                                    <div style="margin: 5px 0 0px 0; color: #666; font-size: 14px;">
									<input name=city_shw type=checkbox value=1 checked id=city_shw style="margin: 0 0 2px 0; vertical-align: bottom;">
									<label for=city_shw> Не показывать мой город другим пользователям</label>
									</div>
									</td>
                                </tr>
                     </table>
					   <div style="border-top: 1px solid #ccc; height: 1px; margin: 15px 0px;"></div>
					   <div style="margin: 0 0 10px 0; color: #2a649e;">Если вы пришли на сайт по рекомендации уже зарегистрированного специалиста, пожалуйста, укажите его здесь.</div>
					   <input id=spec_id_register name="spec_id_register" type=hidden value="0">

					     <table class=reg_table>
						  <tr>
						   <td width=100><b>Рекомендовал:   </td>
						    <td>
						        <input id=spec_text_register name=spec_text value="" type=text autocomplete=off placeholder="ФИО специалиста">
                                 <div style="height: 1px; position: relative;">
								  <div id=spec_result_register style="display: none;">
								  </div>
								 </div>
                           </td>
						  </tr>
						 </table>
               <div style="border-top: 1px solid #ccc; height: 1px; margin: 15px 0px;"></div>

			             <table class=reg_table>
						  <tr valign=top>
						  <td width=100>    <div class="form-item">
                                                 [[!recaptchav2_render]]
                                              [[!+reg.error.recaptchav2_error:notempty=`Пожалуйста, отметьте флажок на reCaptcha`]]
                                            </div>
                           </td>
						   </tr>
						  </table>

                            <div style="border-top: 1px solid #ccc; height: 1px; margin: 15px 0px;"></div>

						  <table class=reg_table>
						        <tr valign=top>
								 <td colspan=2 style='font-size: 14px; padding: 0;'><b>Подписки:</b></td>
							    </tr>
                                <tr valign=top>
								 <td width=5 style="padding-right: 8px;"><input type=checkbox name=uns1 value=1 id=uns1 checked></td>

							    <td><label for=uns1>Получать уведомления о новых личных сообщениях и ответах на форуме</label></td>
          `                     </tr>

		                    <tr valign=top>   

                                <td style='padding-top: 0;'><input type=checkbox name=uns2 value=1 id=uns2 checked></td>
								<td style='padding-top: 0;'><label for=uns2>Получать список лучших статей психологов <span style='color: #666;'>(1 раз в месяц)</span></label></td>
							</tr>
                            <tr valign=top>
							    <td style='padding-top: 0;'><input type=checkbox name=uns3 value=1 id=uns3 checked></td>
								<td style='padding-top: 0;'><label for=uns3>Получать анонсы ближайших тренингов в моем городе <span style='color: #666;'>(2 раза в месяц)</span></label></td>
						    </tr>
						  </table>

						  <div style="border-top: 1px solid #ccc; height: 1px; margin: 15px 0px;"></div>

						  <table border=0 cellspacing=0 cellpadding=0>
						      <tr valign=top>

							      <td colspan=2 style='font-size: 14px; padding-bottom: 8px;'><b>Пользовательское соглашение:</b></td>
							  </tr>

							  <tr valign=top>
							      <td width=5 style='padding-right: 8px;'><input id=sogl name=sogl type=checkbox value=1 OnClick="s()"></td> 
								  <td style='font-size: 16px; color: #333;'><label for=sogl>Я ознакомлен(а) и принимаю условия <a href='/help/rule/' target='_blank'>пользовательского соглашения</a> и <a href='/help/confidential/' target='_blank'>политики конфиденциальности</a>.</label></td>
							  </tr>
                          </table>

						  <input class=submit_yellow id=sub name=submitbtn type=submit value=" Зарегистрироваться! " style="margin: 20px 0 0 0; color: #000; opacity: 0.5;" disabled></div>
						  </form>
						  </div>
</td>
В логе это

(ERROR @ /home/c/cs72731/modx_7/core/model/modx/modcachemanager.class.php: 317) Could not cache resource 1
Александр Мальцев
Александр Мальцев
Скорее всего у Вас ошибка связано с reCaptcha.
Удалите из вызова сниппета Register строчку
&preHooks=`recaptchav2`
А из HTML формы:
[[!recaptchav2_render]]
[[!+reg.error.recaptchav2_error:notempty=`Пожалуйста, отметьте флажок на reCaptcha`]]
Если форма будет отправляться, значит Вы что-то неправильно настроили в reCaptcha.
Аноним
Аноним
Нашел однако.
Аноним
Аноним
Дело в том что шаблон регистрации в HTML со стилями у меня есть, проблема в том что не получается все это объединить.
Аноним
Аноним
Не могу разобраться как настроить внешний вид форм с помощью CSS или по другому, подскажите пожалуйста.
Александр Мальцев
Александр Мальцев
В данной статье использован front-end фреймворк Twitter Bootstrap. Просто скачайте его и подключите к странице. После этого у вас сразу же будут такое же оформление как на изображениях в статье. Подробно этот процесс описан в статье Подключение Bootstrap к странице.
Аноним
Аноним
Как сделать автогенерацию пароля?

[[!Register?
&submitVar=`submitbtn`
&activation=`1`
&activationEmailSubject=`Подтверждение регистрации`
&successMsg=`<p>Спасибо за регистрацию. На вашу электронную почту [[!+reg.email]] отправлено письмо, содержащее ссылку, необходимую для активацию аккаунта. Перейдите по этой ссылке, чтобы завершить процедуру регистрации.</p><p>p.s. Если письмо не пришло - проверьте папку спам.</p>`
&usergroups=`Users`
&usernameField=`phone`
&generatePassword=`1`
&validatePassword=`0`
&placeholderPrefix=`reg.`
&activationResourceId=`34`
&validate=`nospam:blank`
]]


[[!+error.message:eq=``:then=`
<form action="[[~[[*id]]]]" method="post">
  <input type="hidden" name="nospam" id="nospam" value="[[!+reg.nospam]]">
  <div class="form-group">
	<div class="col-sm-12">
	  <input type="text" name="fullname" class="form-control" id="fullname" placeholder="Как Вас зовут" value="[[!+reg.fullname]]">
	  <span class="help-block text-error">
		[[!+reg.error.fullname]]
	  </span>
	</div>
  </div>
  <div class="form-group">
	<div class="col-sm-12">
	  <input type="email" name="email" class="form-control" id="email" placeholder="Введите Email" value="[[!+reg.email]]">
	  <span class="help-block text-error">
		[[!+reg.error.email]]
	  </span>
	</div>
  </div>
  <div class="form-group">
	<div class="col-sm-12">
	  <textarea type="text" name="phone" class="form-control" id="phone" placeholder="Телефон" value="[[!+reg.phone]]">[[!+reg.phone]]</textarea>
	  <span class="help-block text-error">
		[[!+reg.error.phone]]
	  </span>
	</div>
  </div>
  <div class="col-md-12 move-right">
	<input type="submit" value="Далее" name="submitbtn" id="submitbtn" class="btn btn-primary">
  </div>
</form>
`:else=`<div class="alert alert-success">[[!+error.message]]</div>`]]
Это способ не работает, страница перезагружается и всё.
Александр Мальцев
Александр Мальцев
Не знаю, вставил Ваш код на страницу… всё работает. Может проблема не в этом коде?
Сергей Карпук
Сергей Карпук
Большое спасибо за статьи. Наконец-то сумел разобраться и настроить регистрацию пользователей. Оказывается всё доступно!

В тексте, правда есть небольшая неточность: сниппет ConfirmRegister предлагается разместить в ресурсе «Регистрация» вместо «Подтверждения регистрации» (скриншот).
Александр Мальцев
Александр Мальцев
Спасибо, поправил.
Аноним
Аноним
Какая-то… опа. Присылает 2 письма со ссылками, по любому переходишь к активации и попадаешь на страницу с ошибкой.

В логах также «Could not get table name for class: modAccess»,
Александр Мальцев
Александр Мальцев
1. Попробуйте переустановить компонент.
2. Ещё раз проверьте Ваши действия, т.к. должно приходить одно письмо.
Андрей
Андрей
Здравствуйте Максим.
Решили у себя проблему? Если да, то как?
Аноним
Аноним
А может ты подскажешь как вставить в регистрацию дату рождения, понят не могу как туда засунуть через датаpicker, в виде хука делают я так понимаю?
Александр Мальцев
Александр Мальцев
1. Добавить в форму блок с датой рождения:
<div class="form-group">
  <label for="dob" class="col-sm-4 control-label">Дата рождения:</label>
  <div class="col-sm-8">
    <input type="text" name="dob" class="form-control" id="dob" placeholder="" value="[[!+reg.dob:date=`%Y-%m-%d`]]">
    <span class="help-block text-error">
      [[!+reg.error.dob]]
    </span>        
  </div>     
</div>
2. При необходимости подключить datepicker.
3. Добавить в вызов сниппета Register параметр preHooks:
&preHooks=`formatDob`
3. Создать сниппет formatDob:
<?php
$dob = $hook->getValue('dob');
$hook->setValue('dob',strtotime($dob));
return true;
Аноним
Аноним
Спасибо работает, я думал через postHook, типа когда создался пользователь и потом находим по id и дописываем дату рождение. Но так намного лучше!!!.. Единственное решение в инете, как добавить день рождение в login — register больше негде не нашёл.
akradeus
akradeus
Мммм заметил интересную фитчу на этом сайте… Загрузить картинку в комментариях)))
Интересно как это сделано? Как то искал это на форумах так и не нашёл а тут раз и ЕСТЬ))
Александр Мальцев
Александр Мальцев
Для этого дела существует множество различных компонентов: FileAttach, UserFiles, Uploadify, FileUpload, AjaxUpload и др. Выбирайте на свой вкус.
Аноним
Аноним
НЕ подскажите, как можно сделать, чтобы после авторизации, кнопка Авторизация/вход становилась Личный кабинет?
Александр Мальцев
Александр Мальцев
Это надо делать с помощью AJAX. Т.е. отправляешь данные формы авторизации на сервер и получаешь ответ. В зависимости от ответа убираешь форму (кнопку) авторизации и отображаешь личный кабинет. Либо если ответ пришёл ответ отрицательный, то отображаешь в форме ошибку.
Аноним
Аноним
Я сделал через [[!+modx.user.id:gt=`0`:then=`Личный кабинет`:else=`Войти или Зарегистрироваться`]]
Ни какого Аякса )))
Александр Мальцев
Александр Мальцев
Если ajax не нужен, то можно ещё воспользоваться специально предназначенного для этого дела фильтром:
[[!+modx.user.id:isloggedin=`для авторизированного`:else=`для не авторизированного`]]
akradeus
akradeus
Подскажите пожайлуста. Делал регистрацию по вашему уроку… Всё сделал как написано…
НО письма не приходят ни о регистрации ни о восстановлении пароля, хотя настройки почты поставил и они работают сниппет ФОРМИТ отправляет письма…
Настроено через SMTP

В чём может быть проблема??? Почему не приходят эти письма???
Александр Мальцев
Александр Мальцев
Обычно, если что-то не работает то это отображается в журнале ошибок. Посмотрите какая там возникает ошибка.
akradeus
akradeus
[2016-06-23 10:40:36] (ERROR @ /connectors/index.php) Could not get table class for class: modAccess
[2016-06-23 10:40:36] (ERROR @ /connectors/index.php) Could not get table name for class: modAccess
[2016-06-23 10:40:36] (ERROR @ /connectors/index.php) Error 42000 executing statement: 
Array
(
    [0] => 42000
    [1] => 1064
    [2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS `modAccess` WHERE `modAccess`.`principal` = 4' at line 1
)

[2016-06-23 10:40:39] (ERROR @ /connectors/index.php) Could not get table class for class: modAccess
[2016-06-23 10:40:39] (ERROR @ /connectors/index.php) Could not get table name for class: modAccess
[2016-06-23 10:40:39] (ERROR @ /connectors/index.php) Error 42000 executing statement: 
Array
(
    [0] => 42000
    [1] => 1064
    [2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS `modAccess` WHERE `modAccess`.`principal` = 5' at line 1
)

Это всё что есть в логах
Александр Мальцев
Александр Мальцев
Не знаю, в чём может быть загвоздка. Сниппет register использует для подготовки и отправки почты класс MODX mail (modMail), который в свою очередь полагается на php-класс PHPMailer.
Дмитрий
Дмитрий
Здравствуй! Подскажи как решил проблему? То же самое в логах
Дмитрий
Дмитрий
Вопрос решен.
Заменил в системных настройках Адрес электронной почты на noreply@sitename.kz и письма стали приходить.
Аноним
Аноним
И снова здравствуйте. Столкнулся с такими ошибками. После перехода по ссылке для активации аккаунта, вылетает 503 ошибка, но аккаунт активируется. В чем может быть проблема?
И главная проблема. На отдельной странице регистрация проходит отлично. Но во всплывающем окне на главной постоянная ошибка E-mail. Причем, не пишет что именно, а просто выделяет красным и не дает зарегистрироваться. Не подскажите, в чем может быть проблема?
Александр Мальцев
Александр Мальцев
503 ошибка возникает когда сервер перестаёт принимать запросы. Т.е. отсылается слишком много запросов. Посмотрите какие ошибки есть в журнале.
Аноним
Аноним
Спасибо. Попробую разобраться. НЕ подскажете, в чем может заключаться ошибка вывода формы во всплывающем меню?
<nav class="main-nav">
			<ul>
				<!-- ссылки на вызов форм -->
				<li><a class="cd-signin" href="#">Вход</a></li>
				<li><a class="cd-signup" href="#">Регистрация</a></li>
			</ul>
		</nav>
<div class="cd-user-modal"> <!-- все формы на фоне затемнения-->
		<div class="cd-user-modal-container"> <!-- основной контейнер -->
			<ul class="cd-switcher">
				<li><a href="#">Вход</a></li>
				<li><a href="#">Регистрация</a></li>
			</ul>
[[!Login? 
  &tplType=`modChunk`
  &loginTpl=`myLoginChunk`
  &logoutTpl=`myLogoutChunk`
  &errTpl=`lgnErrTpl` 
  &redirectToPrior=`1`
]]
		
				<p class="cd-form-bottom-message"><a href="#0">Забыли свой пароль?</a></p>
				<!-- <a href="#0" class="cd-close-form">Close</a> -->
			</div> <!-- cd-login -->
	[[!Register?
    &submitVar=`submitbtn`
    &activation=`1`
    &activationEmailSubject=`Подтверждение регистрации`
    &activationResourceId=`25`
    &successMsg=`<p>Спасибо за регистрацию. На вашу электронную почту [[!+reg.email]] отправлено письмо, содержащее ссылку, необходимую для активацию аккаунта. Перейдите по этой ссылке, чтобы завершить процедуру регистрации.</p>`
    &usergroups=`Users`
    &usernameField=`email`
    &passwordField=`passwd`    
    &validate=`nospam:blank,
      passwd:required:minLength=^8^,
      passwdAgain:passwdAgain=^passwd^,
      fullname:required,
      email:required:email`
    &placeholderPrefix=`reg.`
]]
			<div id="cd-signup"> <!-- форма регистрации -->
			 [[!+error.message:eq=``:then=`
				<form action="[[~[[*id]]]]" method="post" class="cd-form">
				<input type="hidden" name="nospam" id="nospam" value="[[!+reg.nospam]]">
					<p class="fieldset">
						<label class="image-replace cd-username" for="signup-username">Имя пользователя</label>
						<input name="fullname" class="full-width has-padding has-border" id="fullname" type="text" placeholder="Имя пользователя" value="[[!+reg.fullname]]">
						<span class="cd-error-message">[[!+reg.error.fullname]]</span>
					</p>

					<p class="fieldset">
						<label class="image-replace cd-email" for="email">E-mail</label>
						<input name="email" class="full-width has-padding has-border" id="email" type="email" placeholder="E-mail" value="[[!+reg.email]]">
						<span class="cd-error-message">[[!+reg.error.email]]</span>
					</p>

					<p class="fieldset">
						<label class="image-replace cd-password" for="signup-password">Пароль</label>
						<input name="passwd" class="full-width has-padding has-border" id="passwd" type="password"  placeholder="Пароль" value="[[!+reg.passwd]]">
						<a href="#0" class="hide-password">Скрыть</a>
						<span class="cd-error-message">[[!+reg.error.passwd]]</span>
					</p>
					
					<p class="fieldset">
						<label class="image-replace cd-password" for="signup-password">Подтвердите пароль:</label>
						<input name="passwdAgain" class="full-width has-padding has-border" id="passwdAgain" type="password" placeholder="Введите пароль ещё раз" value="[[!+reg.passwdAgain]]">
						<a href="#0" class="hide-password">Скрыть</a>
						<span class="cd-error-message">[[!+reg.error.passwdAgain]]</span>
					</p>

					<p class="fieldset">
						<input name="submitbtn" id="submitbtn" class="full-width has-padding" type="submit" value="Создать аккаунт">
					</p>
				</form>
				`:else=`<div class="alert alert-success">[[!+error.message]]</div>`]]

				<!-- <a href="#0" class="cd-close-form">Close</a> -->
			</div> <!-- cd-signup -->

			<div id="cd-reset-password"> <!-- форма восстановления пароля -->
				<p class="cd-form-message">Забыли пароль? Пожалуйста, введите адрес своей электронной почты. Вы получите ссылку, чтобы создать новый пароль.</p>

				<form class="cd-form">
					<p class="fieldset">
						<label class="image-replace cd-email" for="reset-email">E-mail</label>
						<input class="full-width has-padding has-border" id="reset-email" type="email" placeholder="E-mail">
						<span class="cd-error-message">Здесь сообщение об ошибке!</span>
					</p>

					<p class="fieldset">
						<input class="full-width has-padding" type="submit" value="Восстановить пароль">
					</p>
				</form>

				<p class="cd-form-bottom-message"><a href="#0">Вернуться к входу</a></p>
			</div> <!-- cd-reset-password -->
			<a href="#0" class="cd-close-form">Закрыть</a>
		</div> <!-- cd-user-modal-container -->
	</div> <!-- cd-user-modal -->
Модальное окно видно, форма там тоже есть. При попытке авторизации нет никакой реакции на нажатие кнопки Войти. При регистрации постоянная ошибка электронного адреса. Тот же код на отдельной странице работает отлично. В чем я напортачил?
Аноним
Аноним
Попробовал оригинальный шаблон — работает. Только фишка в том, что при нажатии на кнопку войти она срабатывает только в определенных местах. Например, если нажать посреди кнопки — ничего не произойдет, а вот если с серого верхнего края — работает. Справа уже нет. Но это даже не суть. С этим еще можно разобраться. Не могу понять, почему не работает именно мой код. Они же практически идентичны.
<div id="cd-login"> <!-- форма входа -->
	<p class="text-danger">[[+errors]]</p>
				<form class="cd-form" action="[[~[[*id]]]]" method="post">
					<p class="fieldset">
						<label for="username" class="image-replace cd-email">[[%login.username]]</label>
						<input class="full-width has-padding has-border" type="text" name="username" id="username">
					</p>

					<p class="fieldset">
						<label class="image-replace cd-password" for="password">[[%login.password]]<</label>
						<input class="full-width has-padding has-border" type="password" name="password" id="password"">
						<a href="#0" class="hide-password">Показать</a>
					</p>

					<p class="fieldset">
			<input class="returnUrl" type="hidden" name="returnUrl" value="[[+request_uri]]" />
            <input class="loginLoginValue" type="hidden" name="service" value="login">
			<input type="submit" value="[[+actionMsg]]" name="Login" id="Login" class="full-width">
					</p>
				</form>


<!-- Оригинальный шаблон -->
<div class="loginForm">
    <div class="loginMessage">[[+errors]]</div>
    <div class="loginLogin">
        <form class="loginLoginForm" action="[[~[[*id]]]]" method="post">
            <fieldset class="loginLoginFieldset">
                <legend class="loginLegend">[[+actionMsg]]</legend>
                <label class="loginUsernameLabel">[[%login.username]]
                    <input class="loginUsername" type="text" name="username" />
                </label>
                
                <label class="loginPasswordLabel">[[%login.password]]
                    <input class="loginPassword" type="password" name="password" />
                </label>
                <input class="returnUrl" type="hidden" name="returnUrl" value="[[+request_uri]]" />

                [[+login.recaptcha_html]]
                
                <input class="loginLoginValue" type="hidden" name="service" value="login" />
                <span class="loginLoginButton"><input type="submit" name="Login" value="[[+actionMsg]]" /></span>
            </fieldset>
        </form>
    </div>
</div>
Аноним
Аноним
Все чудоватей и чудоватей. Попробовал тупо заменить стили из оригинала на свои, и уже перестала оригинальная форма работать. В первый раз такое вижу.
Аноним
Аноним
Вопрос снят. Судя по всему проблема была в несовместимости JS. Поставил модальное окно на чистом CSS — все заработало.
Аноним
Аноним
Добрый вечер!!! Так и не дождавшись от Вас ответа по поводу загрузки одновременно нескольких фотографий в качестве аватарки, а именно не разобрался как каждой фотографии передать значение дополнительной формы или ТВ параметра! Искал различные решения, но собрал в кучу, но все равно не получается передать значение поля для каждой фотографии свое name=«img_[]» номера от 0 до 9. вот что получилось, подскажите как можно это доработать, и при этом видеть эскизы изображений и можно назначить главное фото img_0

вот скрипт
<script>
var data = {
    data: [],
    length: function (){
        return this.data.length;
    },
    set: function (x) {
        this.data.push(x);
        return this;
    },
    clear: function () {
        this.data.length = 0;
        return this;
    },
    del: function (x) {
        return this.data.splice(x, 1);
    },
    uni: function (x) {
        var i = this.data.length;
        while (i--) {
            if (this.data[i].name === x.name) {
                return true;
            }
        }
        return false;
    }
};
$('#files').change(function(){
    var error='';
    var type =[ "image/jpeg",  "image/jpg",  "image/gif",  "image/png"];
    $.each(this.files, function(i, file) {
        if(data.length() >9 ){
          error += 'Разрешено не более 10 файлов\n\r';   
        } else if($.inArray(file.type, type)==-1){
          error += 'Недопустимое разрешение файла - ' + file.name+'\n\r';
        } else if(file.size > 2097152){
          error += file.name+' - размер файла больше 2Мб\n\r';  
        }else if(data.uni(file)===false) {
            data.set(file);
            $('#list_files').append('<li>'+file.name+'<i data-file="'+data.length()+'">x</i></li>');
        }
    });
    if (error.length) alert(error);
});

$('#list_files').on('click', 'i', function(){
    data.del($(this).data('file')-1);
    $(this).parent().remove();
});

$('#clear_all').click(function(){
    $('#list_files li').remove();
    data.clear();
});
</script>
а это загрузка файла
<input type="file" multiple="multiple" name="img_[]" accept="image" required="required" title="Необходимо выбрать минимум один файл" id="files" />
<ul id="list_files"></ul>
<span id="clear_all">Очистить все</span>
Александр Мальцев
Александр Мальцев
Не вижу смысла создавать загрузку файлов для страницы Регистрация. Как создать аватарку пользователю расскажу в отдельном уроке.
Павел
Павел
Прошу прощения, что ввязался в разговор (хоть ему уже и полтора года =) ).
Заказчик требует прикрепления файла, например, скан доверенности, при регистрации.
В этом есть смысл. Хотя, так же появляется шанс словить вредонос…
Какие мысли по этому поводу?
Александр Мальцев
Александр Мальцев
В этом случае вам необходимо написать сниппет с необходимой логикой. После этого привязать полученный сниппет к Register с помощью параметра postHooks.
Аноним
Аноним
С праздником Светлой Пасхи!
Добрых и Светлых Людей Вам на жизненном пути!!!
Аноним
Аноним
Как всегда всё очень детально разобрано и понятно! Спасибо!
Но вот есть некоторые ситуации, которые вы не разбираете или считаете, что их будут писать в комментариях:
1 — Объясните пожалуйста, есть ли смысл в форму регистрации добавлять Captcha, если да, то как с привязкой к Login?
2 — Как в форме регистрации добавить дополнительные поля, которые нужно заполнять, причем поля, которые есть в стандартном формуляре пользователя (телефон, адрес, город), и которые нужно добавить в стандартный формуляр пользователя (специальность, хобби)?
Александр Мальцев
Александр Мальцев
Все моменты не рассмотришь.
1. Есть, для защиты от спама. Это сделается с помощью параметра preHooks. Например, можно использовать reCaptcha (необходимо установить) или какую-нибудь собственную.
Добавляется reCaptcha так:
— Добавляем в вызов сниппета Register параметр preHooks и указываем recaptcha:
[[!Register?
  &preHooks=`recaptcha`
  ...
— добавляем в форму плейсхолдер:
[[+login.recaptcha_html]]
2. Указывайте их при регистрации и они будут заполняться.
Например, город:
<label for="city">Город:</label>
<input type="text" name="city" id="city" placeholder="Введите город" value="[[!+reg.city]]">
Тоже самое и с расширенными полями.
Например, color (расширенный атрибут):
<label for="color">Цвет:</label>
<input type="text" name="color" id="color" placeholder="Введите цвет" value="[[!+reg.color]">
Аноним
Аноним
Спасибо огромное!!!
Если Вас не затруднит, то расскажите, пожалуйста, подробнее следующее:
-1. Как прописать в форме выбор значения из доступных -2. Нужно в форму добавить мультимедийную загрузку файлов (изображений) до 10 шт., но при этом можно было бы загружать по одной фото и сразу все, с указанием одной главной фото. Есть ли готовое решение для форм? Как это можно реализовать?