MODX - Login (Личный кабинет пользователя)

Александр Мальцев
20K
53
2
Содержание:
  1. Страница "Изменение пароля"
  2. Страница "Редактирование данных"
  3. Страница "Личный кабинет"
  4. Комментарии

Урок, в котором рассмотрим, как в MODX Revolution можно на основании компонента Login создать ресурсы "Личный кабинет пользователя", "Изменение пароля", "Редактирование данных".

Страница "Изменение пароля"

Страница "Изменение пароля" предназначена для отображения пользователю формы с помощью которой он сможет изменить свой пароль. Всё логику работы по изменению пароля пользователя выполняет сниппет ChangePassword.

Содержимое ресурса "Изменения пароля" (форма и сниппет ChangePassword):

[[!ChangePassword?
   &submitVar=`change-password`
   &placeholderPrefix=`cp.`
   &validateOldPassword=`1`
   &validate=`nospam:blank`
   &reloadOnSuccess=`0`
   &successMessage=`Ваш пароль успешно изменён`
]]

<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">
          <div class="updprof-error">[[!+cp.error_message]]</div>
          <p>[[!+cp.successMessage]]</p>
          <form class="form-horizontal" action="[[~[[*id]]]]" method="post">
            <input type="hidden" name="nospam" value="">
            <div class="form-group">
              <label for="password_old" class="col-sm-4 control-label">Старый пароль</label>
              <div class="col-sm-8">
                <input type="password" name="password_old" id="password_old" value="[[+cp.password_old]]" class="form-control">
                <span class="help-block text-error">
                  [[!+cp.error.password_old]]
                </span>   
              </div>      
            </div>
            <div class="form-group">
              <label for="password_new" class="col-sm-4 control-label">Новый пароль</label>
              <div class="col-sm-8">
                <input type="password" name="password_new" id="password_new" value="[[+cp.password_new]]" class="form-control">
                <span class="help-block text-error">
                  [[!+cp.error.password_new]]
                </span>  
              </div>      
            </div>   
            <div class="form-group">
              <label for="password_new_confirm" class="col-sm-4 control-label">Введите новый пароль ещё раз</label>
              <div class="col-sm-8">
                <input type="password" name="password_new_confirm" id="password_new_confirm" value="[[+cp.password_new_confirm]]" class="form-control">
                <span class="help-block text-error">
                  [[!+cp.error.password_new_confirm]]
                </span>  
              </div>      
            </div>
            <input type="submit" value="Изменить пароль" name="change-password" id="change-password" class="btn btn-primary pull-right">
          </form>
        </div>
      </div>
    </div>
  </div>
</div>
MODX Login - Форма изменения пароля пользователя
MODX Login - Форма изменения пароля пользователя
MODX Login - Валидация данных формы, предназначенной для изменения пароля пользователя
MODX Login - Валидация данных формы, предназначенной для изменения пароля пользователя
MODX Login - Успешное изменение пароля пользователя
MODX Login - Успешное изменение пароля пользователя

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

Имя параметра Описание
submitVar Ключ, значение которого проверяется, перед тем как сниппет ChangePassword начнёт обрабатывать форму. Если в качестве значения этого параметра указать пустую строку или false, то сниппет ChangePassword будет обрабатывать форму при получении любого Post запроса. Значение ключа: change-password.
placeholderPrefix Префикс, который будут иметь плейсхолдеры, устанавливаемые с помощью этого сниппета. Значение: cp..
validateOldPassword Указывает, требовать ли от пользователя ввод текущего пароля для успешного установления нового. Значение: 1 (да, требовать).
reloadOnSuccess Определяет необходимо ли перезагружать эту страницу (ресурс) после успешного установления нового пароля или нет. Если значение этого параметра установить равным 1, то данный сниппет перезагрузит эту страницу с параметром GET, предотвращающим повторную отправку данных на сервер. В противном случае (значение 0), сниппет ChangePassword выведет сообщение в плейсхолдер. Значение: 0 (вывести сообщение об успехе в плейсхолдер).
successMessage Если параметр reloadOnSuccess имеет значение 0, то данный сниппет выведет указанное в successMessage сообщение в плейсхолдер [prefix].successMessage. Значение: Ваш пароль успешно изменён.

Страница "Редактирование данных"

Эта страница предназначена для изменения данных пользователя, таких как полное имя (fullname), телефон (phone), мобильный телефон (mobilephone), адрес (address), страна (country), город (city), веб-сайт (website). Логику работы по обновлению данных пользователя выполняет сниппет UpdateProfile из пакета Login.

Содержимое ресурса "Редактирование данных" (сниппет UpdateProfile):

[[!UpdateProfile? &validate=`fullname:required`]]

<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">
          <div class="updprof-error">[[+error.message]]</div>
          [[+login.update_success:is=`1`:then=`[[%login.profile_updated? &namespace=`login` &topic=`updateprofile`]]`]]
          <form action="[[~[[*id]]]]" method="post" class="form-horizontal">
            <input type="hidden" name="nospam" value="">
            <div class="form-group">
              <label for="fullname" class="col-sm-4 control-label">[[!%login.fullname? &namespace=`login` &topic=`updateprofile`]]</label>
              <div class="col-sm-8">
                <input type="text" name="fullname" class="form-control" id="fullname" value="[[+fullname]]">
                <span class="help-block text-error">
                  [[+error.fullname]]
                </span>        
              </div>      
            </div>
            <div class="form-group">
              <label for="phone" class="col-sm-4 control-label">[[!%login.phone]]</label>
              <div class="col-sm-8">
                <input type="text" name="phone" class="form-control" id="phone" value="[[+phone]]">
                <span class="help-block text-error">
                  [[+error.phone]]
                </span>        
              </div>      
            </div> 
            <div class="form-group">
              <label for="mobilephone" class="col-sm-4 control-label">[[!%login.mobilephone]]</label>
              <div class="col-sm-8">
                <input type="text" name="mobilephone" class="form-control" id="mobilephone" value="[[+mobilephone]]">
                <span class="help-block text-error">
                  [[+error.mobilephone]]
                </span>        
              </div>      
            </div> 
            <div class="form-group">
              <label for="address" class="col-sm-4 control-label">[[!%login.address]]</label>
              <div class="col-sm-8">
                <input type="text" name="address" class="form-control" id="address" value="[[+address]]">
                <span class="help-block text-error">
                  [[+error.address]]
                </span>        
              </div>      
            </div>  
            <div class="form-group">
              <label for="country" class="col-sm-4 control-label">[[!%login.country]]</label>
              <div class="col-sm-8">
                <input type="text" name="country" class="form-control" id="country" value="[[+country]]">
                <span class="help-block text-error">
                  [[+error.country]]
                </span>        
              </div>      
            </div>   
            <div class="form-group">
              <label for="city" class="col-sm-4 control-label">[[!%login.city]]</label>
              <div class="col-sm-8">
                <input type="text" name="city" class="form-control" id="city" value="[[+city]]">
                <span class="help-block text-error">
                  [[+error.city]]
                </span>        
              </div>      
            </div>  
            <div class="form-group">
              <label for="website" class="col-sm-4 control-label">[[!%login.website]]</label>
              <div class="col-sm-8">
                <input type="text" name="website" class="form-control" id="website" value="[[+website]]">
                <span class="help-block text-error">
                  [[+error.website]]
                </span>        
              </div>      
            </div>  
            <div class="clearfix"></div>
            <input type="submit" value="[[!%login.update_profile]]" name="login-updprof-btn" id="login-updprof-btn" class="btn btn-primary pull-right">
          </form>
        </div>
      </div>
    </div>
  </div>
</div>
MODX Login - Форма с помощью которой пользователь может обновить свои персональные данные
MODX Login - Форма с помощью которой пользователь может обновить свои персональные данные

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

Имя параметра Описание
submitVar Имя кнопки submit, которая отправляет форму обновления профиля пользователя на сервер. Значение по умолчанию: login-updprof-btn
validate Список (через запятую) полей для валидации (проверки). Указывается так: имя:валидатор (например, username: required, email:required). Валидаторы можно соединять в цепочки. Например, email:email:required.

Страница "Личный кабинет"

На этой странице будем отображать сведения из профиля пользователя, а также кнопки, с помощью которых пользователь может перейти на страницы "Изменения пароля" и "Редактирование данных". Для получения данных пользователя будем использовать сниппет Profile.

Сниппет Profile предназначен для установки в виде плейсхолдеров полей профиля текущего или указанного пользователя. Используя эти плейсхолдеры можно достаточно просто вывести необходимую информацию из профиля в нужные места на странице.

Содержимое ресурса "Личный кабинет" (сниппет Profile):

[[!Profile? &prefix=`usr.`]]

<div class="panel panel-primary">
  <div class="panel-heading"><i class="glyphicon glyphicon-edit"></i> Личный кабинет пользователя</div>
    <div class="panel-body">
      <p>Имя пользователя: [[+usr.username]]</p>
      <p>Телефон: [[+usr.phone]]</p>
      <p>Мобильный телефон: [[+usr.mobilephone]]</p>
      <p>Email: [[+usr.email]]</p>
      <hr>
      <p>Адрес: [[+usr.address]]</p>
      <p>Страна: [[+usr.country]]</p>
      <p>Город: [[+usr.city]]</p>
      <p>Веб-сайт: [[+usr.website]]</p>
      <hr>
      <div class="col-xs-6" style="margin-bottom:8px;">
       <i class="glyphicon glyphicon-pencil"></i> <a href="[[~14]]" title="Изменение пароля">Изменение пароля</a>
      </div>
      <div class="col-xs-6" style="margin-bottom:8px;">
        <i class="glyphicon glyphicon-cog"></i> <a href="[[~15]]" title="Редактирование данных">Редактирование данных</a>
      </div>
    </div>
  </div>
</div>
MODX Login - Личный кабинет пользователя
MODX Login - Личный кабинет пользователя

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

Имя параметра Описание
prefix Префикс, который будут иметь плейсхолдеры, установленные этим сниппетом.
user Необязательный параметр. Предназначен для указания пользователя, данные которого необходимо вывести. Задаётся параметр посредством указания идентификатора (id) или имени (username) пользователя. По умолчанию: текущий пользователь.
useExtended Определяет необходимо ли устанавливать все расширяемые поля пользователя в качестве плейсхолдеров. Значение по умолчанию: 1 (да, необходимо).

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

  1. Дмитрий
    08 июля 2021, 20:20
    Приветствую, как добавить email для редактирования?
    так: правильно?
    <div class="form-group">
                  <label for="phone" class="col-sm-4 control-label">Email</label>
                  <div class="col-sm-8">
                    <input type="text" name="email" class="form-control" id="email" value="[[+email]]">
                    <span class="help-block text-error">
                      [[+error.email]]
                    </span>        
                  </div>      
                </div> 
    1. Дмитрий
      08 июля 2021, 20:25
      и как в «Редактирование данных» вывести сообщение после сохранения, типа — успешно сохранено?
    2. NezaborStepan
      27 января 2021, 16:16
      Уважаемы Александр,
      А отчего у меня только вот так работает
      [[!Profile? &prefix=`usr.` &user=`[[+modx.user.id]]`]]
      а вот так
      [[!Profile? &prefix=`usr.`]]
      уже не работает

      ну и logout не отрабатывает
      хотя
      print_r($_REQUEST);
      в снипете login выдает
      Array ( [q] => lkorg/login/ [service] => logout )
      1. Александр Мальцев
        31 января 2021, 13:51
        Привет!
        Параметр user является опциональным, его необходимо использовать когда нужно получить профиль не текущего, а какого-то конкретного пользователя.
        В MODX пользователь, который авторизован в админке влияет на контекст web. Попробуйте проверить в режиме инкогнито или в другом браузере.
      2. Людмила
        29 октября 2020, 13:47
        Здравствуйте! Простите, где-то видела в комментариях хороший вопрос о словарных плейсхолдерах типа [[!%login.country]], [[!%login.update_profile]] и Ваш подробный ответ, но не могу найти этот коммент(

        И в Управление словарями MODX не могу их найти, где они установлены, где их можно изменить.https://itchief.ru/assets/uploadify/1/f/0/1f0a1562b54eeaaefd72b56a3ce2316a.png
        1. Александр Мальцев
          29 октября 2020, 15:02
          Здравствуйте! Этот? (для сохранения комментария себе в избранное можно нажать на значок «Звездочка» рядом с комментарием). Лексиконы имеет смысл использовать только на многоязычных сайтах или который может стать таким в будущем. В противном случае просто замените его на нужный текст.

          Для изменения значения лексикона на странице «Управления словарями» необходимо сделать на нём двойной клик и поменять ему текст на другой.
          1. Людмила
            29 октября 2020, 15:46
            Да, этот, благодарю! Наверно, мне это не нужно, да, проще заменить на слова.

            Но вообще-то на странице «Управления словарями», как я прислала скриншот, у меня нет соответствующих записей для страны, телефона и прочих полей.
            1. Александр Мальцев
              29 октября 2020, 16:15
              Эти лексиконы находятся в теме «updateprofile» в пространстве имён «login».
              1. Людмила
                29 октября 2020, 17:21
                Благодарю! И правда.
        2. Фунтик
          15 сентября 2020, 18:36
          Здравствуйте, у меня вот такая проблема. Я когда в личном кабинете с фронта изменяю в полях какие то данные, потом сохраняю, но при обновлении страницы в полях находится старые данные. Хотя в базе данных они изменяются. Но, потом, если я сохраняю что угодно на бэкэнде, то данные в полях обновляются. Не понимаю
          Получается, пока я не зайду на бэкэнд и не сохраню там что либо, то в полях будут старые данные
          1. Александр Мальцев
            16 сентября 2020, 06:23
            Здравствуйте! Скорее всего вы вызываете сниппет кэшированным, а нужно без использования механизма кэширования. Для этого следует добавить восклицательный знак перед именем вызываемого сниппета.
            1. Фунтик
              16 сентября 2020, 13:33
              В том то и прикол, что с восклицательным вызываю
              1. Александр Мальцев
                16 сентября 2020, 14:34
                Странно. А какой у вас код? Он как в статье или какой-то другой?
                1. Фунтик
                  16 сентября 2020, 14:38
                  Всё, заработало. У меня в настройках ресурса стояла галочка «Кэшируемый». Убрал — стало нормально.
                  1. Александр Мальцев
                    16 сентября 2020, 15:20
                    Отлично!
          2. Александр
            30 мая 2020, 14:58
            Александр, добрый день. Я из начинающих. Спасибо за подробное описание. Сделал по Вашим статьям регистрацию на сайте и личный кабинет. Все хорошо работает.
            У меня вот какая задача — нужно сделать, чтобы пользователи в личном кабинете могли загрузить файлы на сервер, чтобы потом другой пользователь с определенными правами мог их просмотреть/скачать.
            Не подскажете, как это можно реализовать
            1. Александр Мальцев
              02 июня 2020, 14:09
              Добрый день! Для этого придётся много чего писать. Разбейте задачу на шаги. После этого приступайте к последовательному решению каждого из них. Определите какие в MODX для решения каждого из них есть инструменты, а что придётся писать самостоятельно. Например, загрузку файлов на сервер можно решить с помощью FormIt.
            2. Андрей
              22 апреля 2020, 20:28
              Подскажите, а как добавить следующий функционал в личный кабинет:
              нужно чтобы по адресу mysite.ru/lk/info.html для каждого пользователя была доступна текстовая (или ссылки, картинки) информация, но для каждого пользователя она будет своя, вручную устанавливаемая админом. Причем для каждого пользователя это один и тот же набор полей.

              По аналогии, как в личном кабинете каждому пользователю выводится его имя, телефон мне кажется можно завести дополнительные поля, но к самому пользователю эта информация по сути не имеет отношения.

              Насколько верно я мыслю или может быть есть другие, более удобные варианты?
              И еще желательно, чтобы при изменении поля конкретного пользователя ему уходило информационное письмо.
              1. Александр Мальцев
                24 апреля 2020, 14:28
                Добавить дополнительные поля пользователю можно на вкладке «Дополнительные поля данных».
                Получить их можно так:
                // id пользователя
                $userId = 7;
                // получаем объект modUser
                if ($user = $modx->getObject('modUser', $userId)) {
                  // получаем связанный с ним профиль пользователя
                  if ($profile = $user->getOne('Profile')) {
                    // получаем специальное поле extended
                    $extended = $profile->get('extended');
                    // получаем значение атрибута mykey 
                    $mykey = $extended['mykey'];
                    // ...
                  }
                }
                
                Для отправки письма при обновлении данных пользователя можно создать плагин на событие OnUserBeforeSave и в нём написать необходимую логику.
              2. Алексей
                07 августа 2019, 00:59
                Здравствуйте.
                Подскажите пожалуйста такой момент.

                Если не авторизованный пользователь, переходит по ссылке личного кабинета, ему открывается форма авторизации, что в принципе логично. Но ссылка остаётся личного кабинета а не меняется на страницу авторизации это так и должно быть?

                И ещё один нюанс после авторизации на странице Личного кабинета, пользователя перебрасывает на главную страницу сайта, а должно перенаправлять на страницу для авторизованного пользователя. Как это поправить можно?
                1. Александр Мальцев
                  07 августа 2019, 15:31
                  Здравствуйте!
                  Для редиректа можно на эти страницы добавить сниппет, который будет проверять «вошел» ли пользователь в определенный контекст, и если нет, то осуществлять редирект.
                  Код сниппета:
                  <?php
                  if (!$modx->user->hasSessionContext('web') )  {
                    $url = $modx->makeUrl(1);
                    $modx->sendRedirect($url);
                  }
                  
                  В системных параметрах есть такой ключ unauthorized_page. В нём необходимо указать id ресурса, который нужно выводить пользователям при запросе запрещённых и требующих авторизации ресурсов. По умолчанию он имеет значение 1, поэтому и перебрасывает на главную страницу.
                  1. Алексей
                    12 августа 2019, 13:26
                    Попробовал добавить редирект который вы предложили. Не работает.
                    Просто не срабатывает как будто его и нет, в строке также остаётся url личного кабинета (lk).

                    В принципе меня даже больше смущает не то, что остается url личного кабинета, а то что редирект происходит на главную после авторизации на страницы с url'ом личного кабинета (lk).
                    Авторизуясь со страницы авторизации, всё срабатывает как должно и мы остаёмся на странице для авторизованного пользователя.

                    В ключе unauthorized_page у меня стоит не дефолтное значение, а id страницы авторизации.

                    Какие ещё могут быть варианты?
                    1. Александр Мальцев
                      17 августа 2019, 15:31
                      Попробуй очистить кэш, обновить MODX на туже версию, посмотреть ошибки в консоли, может они что подскажут.
                2. Дмитрий
                  07 августа 2018, 09:45
                  скажите, почему у меня ваш чанк страницы изменения пароля работает по-другому?
                  1) сообщение об ошибке (не указывается какой) появляется в любом случае. даже если потом идет сообщение об успешном изменении пароля. и под строкой старого пароля ВСЕГДА написано что старый пароль неверный.
                  Это не смотря на то что форма работает и меняет пароль.
                  2)вне зависимости от количества сообщений об ошибке в самом верху они все одинаковые и не соответствуют подписям под полями форм, они все берутся из одного чанка «ошибка авторизации».
                  3) откуда вообще берутся все эти сообщения типа «пароли не совпадают»? Если они зашиты в компонент, то не совсем понятно — почему данные сообщения зашиты в логику компонента, а success.message требуют написать самому
                  1. Дмитрий
                    07 августа 2018, 10:08
                    <img src="" />
                    1. Александр Мальцев
                      07 августа 2018, 13:49
                      Доступ к данной странице должен иметь только авторизованный пользователь. Если пользователь не авторизирован и пытается открыть данную страницу, то его необходимо переправить на страницу авторизации.
                      Установка сообщений выполнено автором компонента, сообщение об успехе через параметр successMessage. Остальные сообщения берутся из словаря. Их редактирование осуществляется на странице «Управление словарями».
                      1. Дмитрий
                        07 августа 2018, 14:12
                        я скрины сделал когда был авторизован. и доступ к странице только авторизованным пользователям у меня настроен… обратите внимание — у меня три ошибки в одной из форм — но вверху компонент выводит одну и ту же ошибку — ошибку авторизации 3 раза… хотя я авторизован и пароль меняю…
                  2. Дмитрий
                    06 августа 2018, 20:33
                    Мне кажется, или в 16-ой строчка в Чанке формы изменения пароля — ршибка, а именно — ссылка на Чанк с сообщением об ошибке лишняя?
                    1. Александр Мальцев
                      07 августа 2018, 13:59
                      Почему? Это не ссылка на чанк, это плейсхолдер. Плейсхолдер устанавливается в данном случае сниппетом ChangePassword.
                      1. Дмитрий
                        07 августа 2018, 14:43
                        я попозже проверю одну версию… скажите, а если я авторизован на сайте, как администратор с полным доступом, а страница принадлежат к группе ресурсов, которые доступны отдельным юзерам фронтэнда — мне нужно на эту группу так же прописывать права себе, как администратору? да нет, скорее всего дело не в этом — я же мгу заходить на эти страница уже...(
                        1. Дмитрий
                          07 августа 2018, 14:26
                          да, но именно этот плейсхолдер дает у меня сбой… он почему то имеет только одно значение «Ошибка авторизации», при этом вне зависимости от правильного или неправильного заполнения полей… так же обратите внимание, что у меня дает сбой плейсхолдер на проверку старого пароля, он выдает ошибку, хотя пароль устанавливается верно и процесс смены пароля ПРОИСХОДИТ — проверил сто раз… думаю, что верхний плейсхолдер с ошибкой зависит от второго, поэтому вопроса 2:
                          1) Почему у меня выводится только одно значение плейсхолдера с ошибкой вверху вне зависимости от характера ошибки в форме «Ошибка авторизации» Я то уж никак не могу повлиять на этот плейсхолдер…
                          2) Почему при проверке старого пароля он выдает ошибку, хотя пароль верный и сама программа смены пароля выполняется (поэтому и вверху сохраняется сообщение об ошибке, за которым следует сообщение об успешной авторизации)
                          Может это по причине, что после установки нового пароля программа сравнивает введенный и ОСТАВШИЙСЯ в форме старый пароль уже с НОВЫМ?!

                          Вообще на мой взгляд непонятно. почему взаимоисключаются функции сброса формы (перезагрузки) и сообщения об успехе… я бы например сделал лучше это одновременно
                          1. Александр Мальцев
                            07 августа 2018, 14:47
                            Сложно что-то подсказать, не могу промоделировать вашу ситуацию, т.к. все отрабатывает корректно (без ошибок). Тестовая сборка: MODX 2.6.5, Login 1.9.5.
                            1. Дмитрий
                              07 августа 2018, 15:52
                              у меня уже 3-ий MODX
                              1. Александр Мальцев
                                07 августа 2018, 16:09
                                Он только в альфа версии, на нём многое вообще может не работать.
                                1. Дмитрий
                                  07 августа 2018, 19:37
                                  СОРРИ. Я С ДЖУМЛОЙ СПУТАЛ… КОНЕЧНО 2.6.5.

                                  Как то я плохо понимаю работу плейсхолдеров…
                                  у меня добавилось вопросов.
                                  не совсем понял как работают поля в UpdateProfile
                                  В Регистрации вроде все сделал — добавил поля через Extended, заполняю их при регистрации, они все попадают в Кабинет.
                                  (кроме select пола, он почему то выдает «0», что то я с HTML не так сделал)
                                  Но вот при редактировании профиля я не могу поменять значения этих добавленных полей. меняю, нажимаю на кнопку и возвращаются значения регистрационные… тыкаюсь как слепой… уже и префиксы пробовал устанавливать зачем то, не помогает — редактируются только изначально существующие поля в чанке, добавленные поля (я там тоже EXTENDED установил и добавил их) не редактируются. Какой смысл тогда в EXTENDED? что я не так делаю.

                                  Итак, резюмирую свои нерешенные проблемы (я пока на локалке, хостинга нет. это мой первый проект, пока не отлажу сайт, смысл заливать его на хост):
                                  1) двойное сообщение о регистрации. Это бы еще ничего, но так же дублируются сообщения при сбросе пароля. а это уже криминал, ибо в них разные ссылки и разные пароли
                                  2) После авторизации и смене пароля в форме возникает ошибка авторизации почему то и сведения о неверном старом пароле ПРИ сообщении об успешной смене пароля. пароль меняется.
                                  3) Не понял как редактировать расширенные поля. Ведь во время регистрации нельзя давать пользователю слишком много полей заполнять — уйдет с сайта, а вот после регистрации через изменение профиля он вполне мог бы добавить данные. Но после регистрации я могу менять сайт, fullname (вообще непонятное мне поле) телефон, адрес, город, страну. Все расширенные поля либо пустые, либо те, которые заполнялись при регистрации — не редактируются… И никаких сообщений об успешном изменении данных не выдается.
                      2. Дмитрий
                        06 августа 2018, 17:09
                        Здравствуйте. Никак не пойму логику функции LogOut в сниппете logIn. Гораздо логичнее эту функцию поместить в Profile. При входе в личный кабинет авторизованного пользователя (проверяется штатным сниппетом) отображался бы личный кабинет с кнопкой выхода… а так коряво получается. В личном кабинете нет функции выхода. Мало того что нужно отдельно размещать пункт меню для ВХОДА и для ЛИЧНОГО КАБИНЕТА, пользователю нужно еще догадаться при желании выйти нажать на ВХОД в кабинет, и только ТАМ нажать на выход. Как он догадается зайти на ВХОД — я не понимаю, он же УЖЕ авторизован.
                        По моей логике должна быть ОДИН видимый пункт в меню — ЛИЧНЫЙ КАБИНЕТ. Кликая на него, пользователь уже либо попадает в личный кабинет если он авторизован (проверяется штатным сниппетом компонента isLoggedIn), либо на страницу авторизации. Когда же механизм выхода «зашит» в сниппете LOGIN, непонятно, как его оттуда выудить и вставить в личный кабинет
                        1. Александр Мальцев
                          07 августа 2018, 14:14
                          Здравствуйте. Не понятны рассуждения. Кнопку «Выход» можно разместить где угодно, хоть в профиле, хоть на обычной странице. На обычной странице, ее, конечно, нужно выводить только тогда, когда пользователь авторизован. Если пользователь хочет выйти, то он просто нажимает на эту кнопку и всё. В кнопке достаточно разместить ссылку на страницу, на которой есть компонент Login и указать в этой ссылке параметр service=logout.
                          1. Дмитрий
                            07 августа 2018, 14:37
                            Александр, я так и сделал — разместил кнопку в личном кабинете со ссылкой на ресурс Авторизации… А в заголовке формы выхода обозначил уточняющий вопрос — точно ли вы хотите выйти?

                            не обижайтесь, хотя я и не программист по профессии. но очень системный и дотошный, математику много изучал в свое время… все время стремлюсь к оптимизации….Согласитесь, то ШТАТНО кнопка выхода размещена на странице входа, хотя гораздо логичнее ее штатно было разместить на странице профиля… Существующая конфигурация предполагает усложнения структуры ВИДИМОГО меню на один минимум пункт… Или размещение дополнительных элементов в шаблонах… Давайте представим, что у нас только компонент Логин и все… для выхода из меню мы должны будем сделать минимум два пункта меню — видимых — Личный кабинет и Вход… в то время как если бы функция выхода была в сниппете Профайл, мы обошлись бы одним видимым пунктом — Личный кабинет… из него мы попадем и на страницу авторизации, и на страницу регистрации — в зависимости от нашего статуса… из него же мы сразу и выйдем)

                            давайте рассмотрим пример… Странно
                            1. Александр Мальцев
                              07 августа 2018, 15:38
                              Не обижаюсь, просто немного другое видение этой ситуации.
                              Кнопка «Выйти» не привязана к входу, просто логика выхода реализована в сниппете Login.
                              // 10 - id ресурса, где расположен Login.
                              <a href="[[~10]]?service=logout">Выход</a>
                              
                              Сниппет Profile практически не имеет никакой логики. Он только устанавливает плейсхолдеры, чтобы было очень просто вывести информацию о пользователе.

                              А как из личного кабинета можно попасть на страницу авторизации или на страницу регистрации в зависимости от статуса. Если пользователь не авторизован, то как можно узнать имеет ли он учётную запись или нет.

                              Можно сделать и с помощью одной кнопки, например, личный кабинет. Пользователь при нажатию на кнопку, попадает на страницу «Личный кабинет». Если у него нет прав, MODX перенаправляет его на страницу «Авторизация». На данной странице, если у него есть учётная запись, то он вводит логин и пароль, и после аутентификации попадает на страницу «Личный кабинет». Если нет, то, например, нажимает на кнопку «Зарегистрироваться» и походит процедуру регистрации. В итоге в меню всего будет одна кнопка.
                              1. Дмитрий
                                07 августа 2018, 19:40
                                ладно, не суть, в принципе это я так или иначе решил
                        2. Николай
                          27 сентября 2017, 00:09
                          Редактирование данных и Изменение пароля не отображаются.
                          При просмотре страницы ссылка id30, а тайтл от главной и редактирование с фронта, тоже редактирует Главную id1 страницу.

                          Я правильно понял, что листинг кода нужно вставлять банально в Создать — Новый документ?
                          1. Александр Мальцев
                            27 сентября 2017, 14:49
                            Попробуйте очистить кэш. А также проверьте, как осуществляется вывод ресурсов (с использованием или без использования шаблона).
                          2. Василий
                            09 августа 2017, 17:12
                            Доброго дня, Александр!
                            Прошу помочь. У меня обнаружилось очень загадочное поведение про использовании Profile.
                            Вот такой код:
                            [[+country:empty=`
                            	<tr>
                            		<th>Страна</th>
                            		<td>[[+country]]</td>
                            	</tr>
                            `]]
                            выводит содержимое, а при использовании модификатора notempty — нет…
                            Нонсенс, но тем не менее…
                            Встречались с таким?
                            1. Александр Мальцев
                              10 августа 2017, 15:49
                              Попробовал — нет такой проблемы.
                              Попробуйте добавить префикс:
                              [[!Profile?
                                  &prefix=`user.`
                              ]]
                              [[!+user.country:notempty=`
                                  <tr>
                                      <th>Страна</th>
                                      <td>[[!+user.country]]</td>
                                  </tr>
                              `]]
                              
                              Сделайте его не кэшированным:
                              [[!+country:notempty=`
                                  <tr>
                                      <th>Страна</th>
                                      <td>[[!+country]]</td>
                                  </tr>
                              `]]
                              
                              1. Василий
                                10 августа 2017, 16:48
                                Спасибо. Помог не кешированный вызов.
                                Делал по инструкции — значит у вас работает, а у меня — нет.
                                С чем это может быть связано? Хочется понять на будущее)
                                1. Александр Мальцев
                                  10 августа 2017, 17:34
                                  Не, знаю с чем это может быть связано. А вы сниппет Profile вызываете не кэшированным?
                            2. Александр
                              02 октября 2016, 09:05
                              А по Office можете подсказать?
                              1. Александр Мальцев
                                03 октября 2016, 14:46
                                Можно, но это не относиться к данной статье. Лучше это сделать в разделе «Вопросы».
                              2. Александр
                                01 октября 2016, 20:24
                                Так должно быть или это ошибка:
                                &prefix=`usr.`
                                А в писание используемых параметров user?
                                1. Александр Мальцев
                                  02 октября 2016, 03:29
                                  Данный параметр (&prefix) — это префикс для плейсхолдеров ([[+usr.username]], [[+usr.phone]] и др.).
                                  А параметр user необходимо указывать тогда, когда Вы хотите получить данные определённого пользователя. Но в данном случае он не нужен, т.к. он по умолчанию возвращает данные текущего пользователя. А это как раз то, что нужно в данном случае.
                                2. Егор К.
                                  01 сентября 2016, 16:50
                                  Спасибо за информацию.
                                  Очень помогла!
                                  1. Waelastik
                                    17 мая 2016, 12:40
                                    Все отлично, спасибо за уроки.
                                    А как привязать к профилю аватарку?
                                    А после вывести ее в комментарии в Тикетах?

                                    1. Александр Мальцев
                                      19 мая 2016, 12:40
                                      Этот момент рассмотрим немного позже… В отдельной статье.
                                    Войдите, пожалуйста, в аккаунт, чтобы оставить комментарий.