We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 49529
    • 196 Posts
    Он ругается на то, что $user - не объект. А должен быть им, поскольку мы получаем его именно как объект в строчке
    $user = $modx->getObject('modUser', $userID);

    Код хука 100% рабочий.
    Вы проверьте все-таки, какой именно ID прилетает в хук. Как это сделать - я описал выше. Убедитесь, что это значение не пустое и что юзер с таким ID действительно существует (ID юзеров видны в админке). Моя телепатия подсказывет мне, что ошибка именно в этом, а не в коде хука.
      • 49522
      • 7 Posts
      Quote from: whitebyte at Dec 22, 2014, 07:26 PM
      Он ругается на то, что $user - не объект. А должен быть им, поскольку мы получаем его именно как объект в строчке
      $user = $modx->getObject('modUser', $userID);

      Код хука 100% рабочий.
      Вы проверьте все-таки, какой именно ID прилетает в хук. Как это сделать - я описал выше. Убедитесь, что это значение не пустое и что юзер с таким ID действительно существует (ID юзеров видны в админке). Моя телепатия подсказывет мне, что ошибка именно в этом, а не в коде хука.


      Вот такие строки в журнале ошибок:

      [2014-12-23 07:00:02] (ERROR @ /index.php) userID =
      [2014-12-23 07:00:59] (ERROR @ /connectors/index.php) Resource URI 1 already exists for resource id = 147; skipping duplicate resource URI for resource id = 148

      И еще если прописываю в хуке ID жестко

      $userID = 2;
      вместо:
      $userID = $hook->getValue('userID');

      и в журнале ошибок смотрю, ID норм: [2014-12-23 10:27:16] (ERROR @ /index.php) userID = 2

      то ошибка уже на 8 линию
      Fatal error: Call to a member function set() on a non-object in

      а там начинаются поля, и первое поле
      $profile->set('username', $hook->getValue('username'));
      [ed. note: radical last edited this post 11 years, 10 months ago.]
        • 49529
        • 196 Posts
        Как все непросто.
        Во-первых, как и ожидалось, в хук не приходит ID пользователя. Проверьте, точно ли оно установлено в $_GET. Вы можете слегка усовершенствовать свой сниппет get_user:
        <?php
        if (isset($_GET["id"])) {
            return $_GET["id"];
        } else {
            $modx->log(1, 'get_user: не установлен ID!');
            return false;
        }
        

        И посмотреть, будет ли сыпаться что-то в лог ошибок MODX.

        Во-вторых, этот код:
        $profile->set('username', $hook->getValue('username'));

        некорректен.

        Дело в том, что в MODX есть неочевидный момент, где именно хранится информация о пользователе.
        Каждый пользователь - это объект класса modUser, где хранится только базовая информация - username, пароль, активен/неактивен и т.д. И есть привязанный к каждому юзеру профиль - объект класса modUserProfile, где хранится расширенная информация - fullname, почта-телефоны-адреса и т.д. В профиле нет поля username, оно хранится с самом user-e и сохранять его отдельно не нужно.
        Посмотреть, какая информация в каком классе хранится, можно здесь - http://bobsguides.com/modx-object-quick-reference.html#modUserProfile
          • 49522
          • 7 Posts
          Quote from: whitebyte at Dec 23, 2014, 06:35 AM
          Как все непросто.
          Во-первых, как и ожидалось, в хук не приходит ID пользователя. Проверьте, точно ли оно установлено в $_GET. Вы можете слегка усовершенствовать свой сниппет get_user:
          <!--?php
          if (isset($_GET["id"])) {
              return $_GET["id"];
          } else {
              $modx--->log(1, 'get_user: не установлен ID!');
              return false;
          }
          

          И посмотреть, будет ли сыпаться что-то в лог ошибок MODX.

          Во-вторых, этот код:
          $profile->set('username', $hook->getValue('username'));

          некорректен.

          Дело в том, что в MODX есть неочевидный момент, где именно хранится информация о пользователе.
          Каждый пользователь - это объект класса modUser, где хранится только базовая информация - username, пароль, активен/неактивен и т.д. И есть привязанный к каждому юзеру профиль - объект класса modUserProfile, где хранится расширенная информация - fullname, почта-телефоны-адреса и т.д. В профиле нет поля username, оно хранится с самом user-e и сохранять его отдельно не нужно.
          Посмотреть, какая информация в каком классе хранится, можно здесь - http://bobsguides.com/modx-object-quick-reference.html#modUserProfile




          Спасибо, буду капать, но я так понимаю просто так FormIt и хуком не обновить данные пользователя другим пользователем, походу нужно писать огромный сниппет на базе UpdateProfile.
          А по поводу GET я его убрал, пишу жестко пока цифру ID <input type="hidden" name="userID" value="5">, и все равно ругается на хук на $userProfile = $user->getOne('Profile');
          username убрал.
            • 49529
            • 196 Posts
            но я так понимаю просто так FormIt и хуком не обновить данные пользователя
            Вы ошибаетесь, работа с пользователями и профилями - это часть API, а не прерогатива какого-то сниппета.
            Я в таких случаях обвешиваю сниппет $modx->log-ами и проверяю пошагово.