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

Урок, в котором познакомимся с дополнением Login. Данное дополнение предназначено для реализации на сайте всего что может понадобиться для работы с пользователями во front-end. Оно включает в себя элементы для реализации регистрации, подтверждения регистрации, восстановления и изменения пароля, авторизации, личного кабинета и многих других функций.

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

Открываем страницу "Управление пакетами" (Приложения -> Установщик). Выполняем загрузку и установку компонента Login.

Приложение Login

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

Открываем страницу "Контроль доступа" (Шестерёнка -> Контроль доступа). Нажимаем на кнопку "Новая группа пользователей".

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

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

  • Имя: Users;
  • Описание: Зарегистрированные пользователи;
  • Создать параллельную группу ресурсов: Да;
  • Политики бэкэнда: (нет политики).

MODX - Создание группы пользователей

Нажимаем на кнопку "Сохранить". В окне "Контроль доступа" должна появиться только что созданная группа пользователей ("Users").

MODX - Созданная группа Users

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

MODX - Созданная группа ресурсов Users

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

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

На странице "Группа пользователя: Users" нажимаем правой кнопкой мыши на поле "web" и выбираем пункт "Редактировать доступ к контексту".

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

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

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

Создание страниц (ресурсов) для Login. Настройка доступа к этим страницам

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

  • Регистрация (28) и Подтверждение регистрации (31);
  • Авторизация (29) и Восстановление пароля (32);
  • Личный кабинет (30), Изменение пароля (33) и Редактирование данных (34).

MODX Login - Создание необходимых страниц (ресурсов)

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

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

MODX Login - Настройка доступа к страницам

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

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

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

  • Группа ресурсов : Users;
  • Контекст: website (web);
  • Минимальная роль: member (9999);
  • Политика доступа: Load only.

MODX Login - Настройка доступа к группе ресурсов Users анонимным пользователям

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

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

Страница (ресурс) "Регистрация"

Страница "Регистрация" будет выполнять следующие действия:

  • выводить пользователю регистрационную форму;
  • обрабатывать отправленную пользователем форму (данные) на сервере с помощью сниппета Register.

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

Обработку формы сниппетом Register настроим так, чтобы он выполнял следующее:

  1. Переходил к обработке регистрационной формы только в том случае, если она была отправлена с помощью кнопки, у которой значение атрибута name равно submitbtn.
  2. Выполнял проверку (валидацию) полей формы на соответствие указанным требованиям. При обнаружении ошибок, выводил их в соотвествующие места ([[!+reg.error.имяПоля]]) формы.
  3. Если форма, заполненная пользователем, ошибок не имеет (прошла валидацию):
    • отображал сообщение об успехе;
    • отправлял пользователю email, в котором содержалась бы сообщение и ссылка. Данное действие необходимо для того, чтобы пользователь подтвердил email, т.е. активировал с помощью неё (ссылки) свою учётную запись.
MODX Login - Процесс регистрации пользователя
MODX Login - Процесс регистрации пользователя

Содержимое ресурса "Регистрация" (форма и сниппет Register):

<!-- doctype, html, head (bootstrap), шапка страницы и т.д. -->  
  
[[!Register?
    &submitVar=`submitbtn`
    &activation=`1`
    &activationEmailSubject=`Подтверждение регистрации`
    &activationResourceId=`31`
    &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 class="container">
  <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">
          [[!+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>`]]
        </div>
      </div>
    </div>
  </div>
</div>

<!-- футер страницы --> 

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

Имя параметра Описание
submitVar Ключ, значение которого проверяется перед тем как сниппет Register начнёт обрабатывать форму. Если в качестве значения этого параметра указать пустую строку или false, то сниппет Register будет обрабатывать форму при получении любого Post запроса.
activation Определяет стоит ли подтверждать email, указанный в регистрационной форме, или нет. Т.е. пользователь не будет активированным до тех пор, пока он не подтвердит свой email. Значение: 1 (да, необходимо).
activationEmailSubject Тема письма, в котором приходит ссылка для активирования учётной записи.
activationEmailTpl Шаблон письма, содержащий информацию и ссылку для активирования учётной записи. Будем использовать шаблон по умолчаию: lgnActivateEmailTpl.
activationResourceId Идентификатор ресурса, в котором находится сниппет с помощью которого осуществляется активирование учётной записи пользователя. Значение: 31 (id ресурса "Подтверждение регистрации").
successMsg Отображает указанное сообщение после успешной отправки регистрационной формы. Этот параметр работает тогда, когда не используется параметр submittedResourceId.
submittedResourceId Перенаправляет пользователя на указанный ресурс после успешной отправки регистрационной формы.
usergroups Список (через запятую) названий групп пользователей или идентификаторов этих групп, в которые необходимо добавить только что зарегистрированного пользователя. Значение: Users.
usernameField Имя поля формы, содержащее в качестве значения имя пользователя. Значение: email.
passwordField Имя поля формы, содержащее пароль пользователя. Значение: passwd.
validate Список (через запятую) полей для валидации (проверки). Указывается так: имя:валидатор (например, username: required, email:required). Валидаторы можно соединять. Например, email:email:required.
placeholderPrefix Префикс для плейсхолдеров. Например, значения плейсхолдеров для поля email с учётом префикса reg.: [[!+reg.email]] (значения поля), [[!+reg.error.email]] (значение ошибки).

Как работает активация аккаунта

Происходит это так: после успешной валидации формы, сниппет Register создаёт объект modUser и устанавливает полю active значение 0. Далее он отправляет письмо пользователю по указанному в регистрационной форме email. Данное письмо содержит URL (ссылку для активации). Как только пользователь перейдёт по этому URL, сниппет ConfirmRegister изменит значение поля active на 1. Теперь пользователь сможет авторизироваться на сайте, т.е. войти под своей учётной записью.

Ресурс "Подтверждение регистрации"

Страница "Подтверждение регистрации" предназначена для активирования аккаунта пользователя. Активирование выполняет сниппет ConfirmRegister на основании URL. Принцип работы его заключается в том, чтобы изменить значение поля active пользователя на 1. После этого пользователь может авторизоваться на сайте, т.е. войти под своей учётной записью.

MODX Login - Результат работы сниппета ConfirmRegister
MODX Login - Результат работы сниппета ConfirmRegister

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

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

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

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


   MODX Revo 0    3815 +1

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

  1. Михаил # 0
    Как всегда всё очень детально разобрано и понятно! Спасибо!
    Но вот есть некоторые ситуации, которые вы не разбираете или считаете, что их будут писать в комментариях:
    1 — Объясните пожалуйста, есть ли смысл в форму регистрации добавлять Captcha, если да, то как с привязкой к Login?
    2 — Как в форме регистрации добавить дополнительные поля, которые нужно заполнять, причем поля, которые есть в стандартном формуляре пользователя (телефон, адрес, город), и которые нужно добавить в стандартный формуляр пользователя (специальность, хобби)?
    1. Александр Мальцев # 0
      Все моменты не рассмотришь.
      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. Михаил # 0
        Спасибо огромное!!!
        Если Вас не затруднит, то расскажите, пожалуйста, подробнее следующее:
        -1. Как прописать в форме выбор значения из доступных -2. Нужно в форму добавить мультимедийную загрузку файлов (изображений) до 10 шт., но при этом можно было бы загружать по одной фото и сразу все, с указанием одной главной фото. Есть ли готовое решение для форм? Как это можно реализовать?
    2. Михаил # 0
      С праздником Светлой Пасхи!
      Добрых и Светлых Людей Вам на жизненном пути!!!
      1. Михаил # 0
        Добрый вечер!!! Так и не дождавшись от Вас ответа по поводу загрузки одновременно нескольких фотографий в качестве аватарки, а именно не разобрался как каждой фотографии передать значение дополнительной формы или ТВ параметра! Искал различные решения, но собрал в кучу, но все равно не получается передать значение поля для каждой фотографии свое 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>
        1. Александр Мальцев # 0
          Не вижу смысла создавать загрузку файлов для страницы Регистрация. Как создать аватарку пользователю расскажу в отдельном уроке.
        2. Легион # 0
          И снова здравствуйте. Столкнулся с такими ошибками. После перехода по ссылке для активации аккаунта, вылетает 503 ошибка, но аккаунт активируется. В чем может быть проблема?
          И главная проблема. На отдельной странице регистрация проходит отлично. Но во всплывающем окне на главной постоянная ошибка E-mail. Причем, не пишет что именно, а просто выделяет красным и не дает зарегистрироваться. Не подскажите, в чем может быть проблема?
          1. Александр Мальцев # 0
            503 ошибка возникает когда сервер перестаёт принимать запросы. Т.е. отсылается слишком много запросов. Посмотрите какие ошибки есть в журнале.
            1. Легион # 0
              Спасибо. Попробую разобраться. НЕ подскажете, в чем может заключаться ошибка вывода формы во всплывающем меню?
              <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 -->
              Модальное окно видно, форма там тоже есть. При попытке авторизации нет никакой реакции на нажатие кнопки Войти. При регистрации постоянная ошибка электронного адреса. Тот же код на отдельной странице работает отлично. В чем я напортачил?
              1. Легион # 0
                Попробовал оригинальный шаблон — работает. Только фишка в том, что при нажатии на кнопку войти она срабатывает только в определенных местах. Например, если нажать посреди кнопки — ничего не произойдет, а вот если с серого верхнего края — работает. Справа уже нет. Но это даже не суть. С этим еще можно разобраться. Не могу понять, почему не работает именно мой код. Они же практически идентичны.
                <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>
                
                1. Легион # 0
                  Все чудоватей и чудоватей. Попробовал тупо заменить стили из оригинала на свои, и уже перестала оригинальная форма работать. В первый раз такое вижу.
              2. Легион # 0
                Вопрос снят. Судя по всему проблема была в несовместимости JS. Поставил модальное окно на чистом CSS — все заработало.
            2. akradeus # 0
              Подскажите пожайлуста. Делал регистрацию по вашему уроку… Всё сделал как написано…
              НО письма не приходят ни о регистрации ни о восстановлении пароля, хотя настройки почты поставил и они работают сниппет ФОРМИТ отправляет письма…
              Настроено через SMTP

              В чём может быть проблема??? Почему не приходят эти письма???
              1. Александр Мальцев # 0
                Обычно, если что-то не работает то это отображается в журнале ошибок. Посмотрите какая там возникает ошибка.
                1. akradeus # 0
                  [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
                  )
                  
                  
                  Это всё что есть в логах
                  1. Александр Мальцев # 0
                    Не знаю, в чём может быть загвоздка. Сниппет register использует для подготовки и отправки почты класс MODX mail (modMail), который в свою очередь полагается на php-класс PHPMailer.
              2. Легион # 0
                НЕ подскажите, как можно сделать, чтобы после авторизации, кнопка Авторизация/вход становилась Личный кабинет?
                1. Александр Мальцев # 0
                  Это надо делать с помощью AJAX. Т.е. отправляешь данные формы авторизации на сервер и получаешь ответ. В зависимости от ответа убираешь форму (кнопку) авторизации и отображаешь личный кабинет. Либо если ответ пришёл ответ отрицательный, то отображаешь в форме ошибку.
                  1. Сергей # 0
                    Я сделал через [[!+modx.user.id:gt=`0`:then=`Личный кабинет`:else=`Войти или Зарегистрироваться`]]
                    Ни какого Аякса )))
                    1. Александр Мальцев # 0
                      Если ajax не нужен, то можно ещё воспользоваться специально предназначенного для этого дела фильтром:
                      [[!+modx.user.id:isloggedin=`для авторизированного`:else=`для не авторизированного`]]
                      
                2. akradeus # 0
                  Мммм заметил интересную фитчу на этом сайте… Загрузить картинку в комментариях)))
                  Интересно как это сделано? Как то искал это на форумах так и не нашёл а тут раз и ЕСТЬ))
                  1. Александр Мальцев # 0
                    Для этого дела существует множество различных компонентов: FileAttach, UserFiles, Uploadify, FileUpload, AjaxUpload и др. Выбирайте на свой вкус.
                  2. akradeus # 0
                    вооо
                    1. Слава # 0
                      А может ты подскажешь как вставить в регистрацию дату рождения, понят не могу как туда засунуть через датаpicker, в виде хука делают я так понимаю?
                      1. Александр Мальцев # 0
                        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;
                        
                        1. Слава # 0
                          Спасибо работает, я думал через postHook, типа когда создался пользователь и потом находим по id и дописываем дату рождение. Но так намного лучше!!!.. Единственное решение в инете, как добавить день рождение в login — register больше негде не нашёл.
                      2. Максим Корепанов # 0
                        Какая-то… опа. Присылает 2 письма со ссылками, по любому переходишь к активации и попадаешь на страницу с ошибкой.

                        В логах также «Could not get table name for class: modAccess»,
                        1. Александр Мальцев # 0
                          1. Попробуйте переустановить компонент.
                          2. Ещё раз проверьте Ваши действия, т.к. должно приходить одно письмо.
                        2. Сергей Карпук # 0
                          Большое спасибо за статьи. Наконец-то сумел разобраться и настроить регистрацию пользователей. Оказывается всё доступно!

                          В тексте, правда есть небольшая неточность: сниппет ConfirmRegister предлагается разместить в ресурсе «Регистрация» вместо «Подтверждения регистрации» —
                          1. Александр Мальцев # 0
                            Спасибо, поправил.
                          2. Максим # 0
                            Как сделать автогенерацию пароля?

                            [[!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>`]]
                            Это способ не работает, страница перезагружается и всё.
                            1. Александр Мальцев # 0
                              Не знаю, вставил Ваш код на страницу… всё работает. Может проблема не в этом коде?
                            2. Александр # 0
                              Не могу разобраться как настроить внешний вид форм с помощью CSS или по другому, подскажите пожалуйста.
                              1. Александр Мальцев # 0
                                В данной статье использован front-end фреймворк Twitter Bootstrap. Просто скачайте его и подключите к странице. После этого у вас сразу же будут такое же оформление как на изображениях в статье. Подробно этот процесс описан в статье Подключение Bootstrap к странице.
                              2. Александр # 0
                                Дело в том что шаблон регистрации в HTML со стилями у меня есть, проблема в том что не получается все это объединить.
                                1. Александр # 0
                                  Нашел однако.
                                  1. Александр # 0
                                    Выручайте! Регистрация не работает! Письмо не приходит!
                                    [[!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
                                    1. Александр Мальцев # +1
                                      Скорее всего у Вас ошибка связано с reCaptcha.
                                      Удалите из вызова сниппета Register строчку
                                      &preHooks=`recaptchav2`
                                      
                                      А из HTML формы:
                                      [[!recaptchav2_render]]
                                      [[!+reg.error.recaptchav2_error:notempty=`Пожалуйста, отметьте флажок на reCaptcha`]]
                                      
                                      Если форма будет отправляться, значит Вы что-то неправильно настроили в reCaptcha.
                                    2. Александр # 0
                                      Все по прежнему, и ошибка та же.
                                      1. Александр # 0
                                        Нашел, дело было в HTML коде перед формой и коде кнопки отправления. Теперь письма приходят целых два. И ошибки странные для меня. Покопаюсь, если сам не справлюсь напишу. Спасибо за ваши ответы.
                                        1. Александр # 0
                                          Возникли новые вопросы! При регистрации проверка email по базе происходит, а логина нет. Как это можно исправить?
                                          И выбором поля не могу разобраться. Подскажите пожалуйста!
                                          1. Александр Мальцев # 0
                                            Можно сделать так.
                                            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`
                                            
                                          2. Александр # 0
                                            Т.е. у него в функциях заложено проверять только логин? Попробую Ваш хук переделать.
                                            1. Александр Мальцев # 0
                                              Да, он проверяет только поле username. В статье мы установили в качестве значения данного поля email и тем самым защитили процесс регистрации пользователей от использования одинаковых email.
                                              В комментарии приведён другой способ, в котором в качестве username, например, может использоваться логин. А email пользователя проверятся с помощью хука. Т.е. он ищет, если у других пользователь точно такой же email. И если есть, то данный хук прерывает процесс выполнения регистрации и выводит сообщение о том, что пользователь с таким email уже есть.
                                            2. Александр # 0
                                              Где то в системных настройках видел разрешение о использовании одного email для нескольких пользователей, у меня стояло «Да». Я вставил нет, оно что не работает? И еще вопрос: на сайте две группы пользователей, две регистрации, 1-работает, 2- нет. Регистрация №2 копия №1 с доп.полями. Вызываю так: [[$lgnRegisterSpecFormTpl]]. Подскажите куда смотреть.
                                              1. Александр Мальцев # 0
                                                Это просто для примера. Используя хуки можно, например, настроить какие-то дополнительные проверки того же логина или любых других полей в зависимости от задач.
                                                А так да… В MODX Revolution есть такой параметр (allow_multiple_emails). Если ему установить значение нет, то разные пользователи не смогут иметь один и тот же адрес email. Она находится в разделе «Авторизация и безопасность».
                                                Попробуйте вызвать чанк не кэшированным. Или сделать одну форму но с переключателями. Если выбран один, то одни поля. И если другой переключатель, то другие. Ещё один вариант — это в зависимости от get параметра страницы отображать одну или другую форму.
                                              2. Александр # 0
                                                Кэширование не помогло. Скопировал чанк рабочей регистрации, вызываю два чанка на разных страницах! Работает только первый(хотя они идентичны)! В чем может быть дело?
                                                1. Александр Мальцев # 0
                                                  Проверяйте… Всё должно работать. Может вы просто не отключили визуальный редактор или что ещё. Также попробуйте очистить кэш сайта.
                                                2. Vlad # 0
                                                  Доброго времени суток, Александр!

                                                  Зарегистрированный пользователь при первом входе блокируется сайтом (окно уведомления предлагает обратиться к администратору). В разделе Пользователи, админпанели галочка блокировка не выставлена. Куда смотреть, или в примере юзеры становятся доступны после прямой активации админом?
                                                  1. Александр Мальцев # 0
                                                    Пользователь для того чтобы войти под своими учётными данными должен их после регистрации подтвердить посредством ссылки из email. Блокировка пользователя по умолчанию производится только после 5 неудачных попыток входа. Определяется это значение параметром failed_login_attempts (в системных настройках). Длительность блокировки составляет по умолчанию 60 минут (параметр в системных настройках blocked_minutes).

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