Создание пользователя через api

Добрый вечер.
Помогите советом.

Пытаюсь создать пользователя, получив имя и и пароль из формы на фронтенде.
Через
$us =$modx->newObject('modUser');
Пользователь создается.
Хочу сразу назначать его в определенную группу, для которой настроил права.
Перед сохранение объекта делаю
$us->set('primary_group', 2);
Сохраняю пользователя.
В базе данных поле primary_group получает значение 2 (идентификатор созданной мною группы)
однако по факту пользователь в эту группу не попадает. Это видно в админке у этого пользователя.
Я догадываюсь, что причина этого в том, что кроме группы пользователю нужно выдать еще и роль в группе, но как это сделать через api — не вижу.

И второй вопрос, он уже просто походу.
Изначально пробовал писать такие данные как email, fullname сразу в пользователя, но разобрался чуток и понял, что эти данные лежат в отдельной таблице. Это так называемый Profile. Для текущего пользователя я думаю его получить не сложно, наверняка он связан они к одному с пользователем. А вот чтобы получить его для любого пользователя и отредактировать я вижу только один способ через getObject. Но у этой таблицы нет класса своего. Как не прибегая к прямым запросам к базе, и при условии что мы не можем получить данные через
$data = $modx->user->getOne('Profile');
потому что авторизован может быть совсем другой пользователь, работать с профилем?
Александр Мельник
19 февраля 2018, 19:26
modx.pro
1
3 349
0

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

Илья Уткин
20 февраля 2018, 10:39
0
Добавить пользователя в группу:
$us->joinGroup(2);

У профиля есть свой класс — modUserProfile. Он связан с modUser через поле internalKey
    Александр Мельник
    20 февраля 2018, 12:06
    0
    Спасибо Илья.
    То что он связан да я вижу, а как вы узнали имя класса?
    В таблицу user_attrubutes где хранятся данные профиля нет колонки classname.

    И поделитесь бесценным опытом, а где Вы вообще находите информацию? Например о методе joinGroup?
    Во всей официальной документации нет даже упоминания о таком методе.
    docs.modx.com/search/search-results?search=joinGroup&id=1325
      Александр Мельник
      20 февраля 2018, 12:13
      0
      Вспомнил, что у Вас же на сайте видел вот такую табличку и еще вчера мог найти в ней имя класса
      bobsguides.com/modx-object-full-reference.html#modUserProfile

      Однако странно, что имя класса не прописано в самой таблице базы.
      Александр Мельник
      20 февраля 2018, 15:26
      0
      добавил в сниппет
      $us->joinGroup(2);
      Пользователь создается, в группу не попадает, и в логе появилась ошибка
      (ERROR @ /var/www/vh181962/data/www/site.ru/core/xpdo/om/xpdoobject.class.php: 811) modUserGroupMember: Attempt to set NOT NULL field member to NULL

      У меня в IDE подключен в External Libraries и проиндексирован modx 2.6.1, однако попытка найти объявление этого метода (go to declaration) завершилась неудачей, он нигде не объявлен.
        Александр Мельник
        20 февраля 2018, 15:36
        0
        Продолжу свой монолог.
        Предположил, что этот метод все-таки существует (Уткин не ошибается))
        я решил, что может его нельзя вызвать для еще не созданного пользователя.
        В итоге сначала сохранил пользователя.
        Затем получил его по имени и уже к нему применил — joinGrup();
        Так сработало.
          Николаевич
          20 февраля 2018, 17:37
          0
          core/model/modx/moduser.class.php
          строка 668
          public function joinGroup($groupId,$roleId = null,$rank = null) {
          ...
          }
            Александр Мельник
            20 февраля 2018, 19:09
            0
            Спасибо.
            По тому, что пользователь добавился в группу, я понял что метод такой есть.
            Значит phpstorm работает не совсем идеально и находит не все.

            Ну и частично остается открытым вопрос, а как можно впервые узнать об этом методе.
            Теперь у меня в голове останется заметка и в следующий раз я буду помнить, что что-то подобное есть.
            Но как в первый раз узнать о нем… В документации на docs.modx.com я не увидел даже упоминания, хотя старался читать внимательно все что касается user.
            Кстати ох и жуткая навигация на этом сайте. Очень сложно понять где ты сейчас и куда двигаться дальше…
      Алексей Ерохин
      20 февраля 2018, 11:13
      0
      по п.2
      Ну так что же вы 2+2 не сложили?
      $user = $modx->getObject('modUser', $user_id);
      $profile = $user->getOne('Profile');
        Александр Мельник
        20 февраля 2018, 12:10
        0
        Спасибо, я часто не умею складывать 2+2, такое бывает).
        Но честно говоря мне кажется Ваш код не совсем верным.
        На момент создания пользователя я не знаю его идентификатор.
        А значит я не могу получить объект класса пользователь по id.
        Вместо id можно было бы использовать username, поскольку имя на этом этапе мы уже знаем.
        Но к своему стыду я еще 20 минут назад был уверен, что MODX позволяет заводить пользователей с одинаковыми именам, а значит выборка по username была бы некорректна. Но я был неправ. Оказывается имя должно быть уникальным.
          Александр Мельник
          20 февраля 2018, 12:29
          0
          Хотя сам перечитал свой вопрос и понимаю, что на мой вопрос Вы дали правильный ответ.
          Но чтобы при создании пользователя сразу заполнить и его профиль, придется делать выборку по username так как id мы не знаем.
            Алексей Ерохин
            20 февраля 2018, 12:31
            0
            Чтобы при создании заполнять профиль делаете так:

            $profile=$modx->newObject('modUserProfile');
            $profile->set('fullname', $fullname);
            $profile->set('email', $email);
            $user->addOne($profile);
            $profile->save();
            $user->save();
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      16