We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 49522
    • 7 Posts
    Дорогие друзья, скажите пожалуйста, в чем может быть проблема, нужно сделать что бы из фронтэнда, пользователь с определенными правами, мог обновлять профили других пользователей.

    Сделал ему форму, вызвал UpdateProfile, передал ID пользователя, данные вроде подставляются в поля как раз пользователя нужного, но при отправке формы, все данные переписывают профиль текущего пользователя. Что я делаю не так?

    [[!UpdateProfile?
    &user=`5`
    ]]
    <form action="[[~[[*id]]]]" method="post">
    <label>Имя пользователя</label>
    <input type="text" name="fullname" id="fullname" value="[[+fullname]]" />                                               
    <input type="submit" name="" value="Обновить данные"/>
    </form>
    

    (форма упрощена для наглядности)
      • 49529
      • 196 Posts
      В сниппете UpdateProfile нет параметра "user", если верить документации - http://rtfm.modx.com/extras/revo/login/login.updateprofile. Этот сниппет предназначен для обновления профиля только текущего пользователя, чужой профиль им обновить нельзя.

      Обновить произвольного пользователя с фронтэнда можно своим сниппетом через API. Подробная статья на эту тему есть здесь (англ) - http://bobsguides.com/revolution-objects.html . вроде где-то встречал русский перевод, но не помню, где.
        • 49529
        • 196 Posts
        Применительно к вашему примеру это может выглядеть так:

        [[!FormIt?
            &hooks=`updateProfile_hook`
        ]]
        
        <form action="[[~[[*id]]]]" method="post">
        <input type="hidden" name="userID" value="5"> <!-- ID пользователя для редактирования мы задаем здесь, а не в сниппете -->
        <label>Имя пользователя</label>
        <input type="text" name="fullname" id="fullname" value="[[+fullname]]" />                                              
        <input type="submit" name="" value="Обновить данные"/>
        </form>


        Код сниппета updateProfile_hook:

        <?php
        
        $userID = $hook->getValue('userID');
        $user = $modx->getObject('modUser', $userID);
        $userProfile = $user->getOne('Profile');
        $profile->set('fullname', $hook->getValue('fullname'));
        $profile->save();
        

          • 49522
          • 7 Posts
          Quote from: whitebyte at Dec 19, 2014, 06:49 AM
          Применительно к вашему примеру это может выглядеть так:

          [[!FormIt?
              &hooks=`updateProfile_hook`
          ]]
          
          <form action="[[~[[*id]]]]" method="post">
          <input type="hidden" name="userID" value="5"> <!-- ID пользователя для редактирования мы задаем здесь, а не в сниппете -->
          <label>Имя пользователя</label>
          <input type="text" name="fullname" id="fullname" value="[[+fullname]]">                                              
          <input type="submit" name="" value="Обновить данные">
          </form>


          Код сниппета updateProfile_hook:

          <!--?php
          
          $userID = $hook--->getValue('userID');
          $user = $modx->getObject('modUser', $userID);
          $userProfile = $user->getOne('Profile');
          $profile->set('fullname', $hook->getValue('fullname'));
          $profile->save();
          



          Спасибо большое, блин, вроде такая очевидная вещь, и на тебе не возможности обновить другой профиль.

          Ваш HOOK работает smiley но все равно переписывает данные админа smiley что бы подставить в поля нужные данные, я перед формой вызываю [[!Profile? &user=`5`]]
            • 49529
            • 196 Posts
            У меня опечатка в хуке, вместо
            $hook--->getValue('userID');

            должно быть
            $hook->getValue('userID');

            поэтому и переписывает, наверное
              • 49522
              • 7 Posts
              Quote from: whitebyte at Dec 19, 2014, 10:46 AM
              У меня опечатка в хуке, вместо
              $hook--->getValue('userID');

              должно быть
              $hook->getValue('userID');

              поэтому и переписывает, наверное

              Да тут дело не в этом, это я сразу исправил, все равно переписывает поля текущего пользователя:
              И еще странность есть, если разместить сниппет
              [[!UpdateProfile?
              &hooks=`updateProfile_hook`
              ]]
              перед формой, поле fullname берет редактируемого пользователя, а вот email, phone берет администратора.
              Если убрать сниппет, то все поля как надо берутся редактируемого пользователя.


              А как все устроено:
              Есть страница пользователя, в GET параметре передается ID пользователя /user-profil?id=5

              Вот так выбираются данные пользователя:
              [[!Profile?  &user=`[[!get_user]]`]]


              потом есть форма для редактирования данных пользователя:

              [[!UpdateProfile?
              &hooks=`updateProfile_hook`
              ]]
              


              Вот сам сниппет:
              $userID = $hook->getValue('userID');
              $user = $modx->getObject('modUser', $userID);
              $userProfile = $user->getOne('Profile');
              $profile->set('username', $hook->getValue('username'));
              $profile->set('fullname', $hook->getValue('fullname'));
              $profile->set('email', $hook->getValue('email'));
              $profile->save();
              


              Вот форма
              <form action="[[~[[*id]]]]" method="post">
              <input type="hidden" name="userID" value="[[!get_user]]">
              
              <label>Имя пользователя</label>
              <input type="text" name="username" id="username" class="form-control" value="[[+username]]"  />
              
              <label>Email</label>
              <input type="text" name="email" id="email" value="[[+email]]">  
                                                    
              <input type="submit" name="" value="Обновить данные">
              </form>
              


                • 49529
                • 196 Posts
                Покажите тогда и [[!get_user]] для порядку.

                Попробуйте вставить в хук строчку
                $modx->log(1, 'userID = ' . $userID);
                

                после
                $userID = $hook->getValue('userID');
                


                Отправьте форму и посмотрите в журнале ошибок MODX, правильный ли ID вообще приходит в хук
                  • 49522
                  • 7 Posts
                  Quote from: whitebyte at Dec 22, 2014, 01:32 PM
                  Покажите тогда и [[!get_user]] для порядку.

                  Попробуйте вставить в хук строчку
                  $modx->log(1, 'userID = ' . $userID);
                  

                  после
                  $userID = $hook->getValue('userID');
                  


                  Отправьте форму и посмотрите в журнале ошибок MODX, правильный ли ID вообще приходит в хук
                  Посмотрел, id приходит админа, он прописывается формой как дополнительное поле userID в профиле пользователя. Но в исходном коде перед отправкой формы, в скрытом инпуте стоит id юзера как раз smiley но видно сниппет UpdateProfile берет id админа.

                  Все равно переписывает профиль админа, видно политика сниппета UpdateProfile перекрывает работу хука sad

                  Даже половина полей как ни странно в форме подставляются именно админа, если перед формой вызвать UpdateProfile. Он переписывает предыдущий вызов [[!Profile? &user=`[[!get_user]]`]]

                  Вот сниппет [[!get_user]] там все просто,
                  <?php
                  echo $_GET["id"];

                  [ed. note: radical last edited this post 11 years, 10 months ago.]
                    • 49529
                    • 196 Posts
                    Не заметил сразу, а вообще-то должно быть не
                    [[!UpdateProfile?
                        &hooks=`updateProfile_hook`
                    ]]

                    а
                    [[!FormIt?
                        &hooks=`updateProfile_hook`
                    ]]


                    Мы обновляем профиль в самом хуке, UpdateProfile для этого вообще не нужен.
                      • 49522
                      • 7 Posts
                      Quote from: whitebyte at Dec 22, 2014, 05:43 PM
                      Не заметил сразу, а вообще-то должно быть не
                      [[!UpdateProfile?
                          &hooks=`updateProfile_hook`
                      ]]

                      а
                      [[!FormIt?
                          &hooks=`updateProfile_hook`
                      ]]


                      Мы обновляем профиль в самом хуке, UpdateProfile для этого вообще не нужен.


                      Сделал, даже предположить не мог что хук можно использовать вообще без UpdateProfile, сделал с FormIt, ругается на 5 линию.
                      Fatal error: Call to a member function getOne() on a non-object in.....бла бла путь по сайту

                      Там на 5 линии вот что:
                      $userProfile = $user->getOne('Profile');