Программное создание пользователей в MODX Revolution

Эта заметка рассказывает о работе с пользователями MODX Revolution через API.
Рассматриваются вопросы создания пользователей, изменения полей, авторизации программным методом.

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

В MODX Revolution за пользователей отвечает тип modUser. Соответственно, что бы создать пользователя, нужно создавать именно этот объект.

modUser содержит лишь самую основную информацию, необходимую для авторизации, такую как username, password, remoteKey и еще несколько вспомогательных полей.

Дополнительная информация о пользователе, такая как фамилия, телефон, email, хранится в профиле пользователя, это объект modUserProfile.

Посмотрим на пример создания пользователя и его профиля:

// создаем пользователя
$user = $modx->newObject('modUser');
// задаем имя пользователя и пароль
$user->set('username', 'Новый пользователь');
$user->set('password', '1234567890');
// сохраняем
$user->save();

// создаем профиль
$profile = $modx->newObject('modUserProfile');
// инициализируем поля
$profile->set('fullname', 'Фамилия Имя');
$profile->set('email', 'user@site.ru');
// добавляем профиль к пользователю
$user->addOne($profile);

// сохраняем
$profile->save();
$user->save();

При создании пользователя, надо быть уверенным в том, что в системе нет пользователя с таким же username. Проще всего это сделать, добавив проверку:

$count = $modx->getCount('modUser', array('username' => 'Новый пользователь'));
if($count > 0){
  // такой пользователь существует!
}

В профиле пользователя можно задать много информации (для примера в коде выше задается fullname и email), полный список полей:

  • fullname - полное имя
  • email - электронная почта
  • phone - телефон
  • mobilephone - мобильный телефон
  • dob - дата рождения
  • gender - пол (0 - не указан, 1 - мужской, 2 - женский)
  • address - адрес
  • country - страна
  • city - город
  • state - штат, провинция
  • zip - почтовый индекс
  • fax - факс
  • photo - фото (это путь к файлу, а не сам файл)
  • comment - комментарий
  • website - сайт
  • extended - дополнительные поля, в виде массива, об этом ниже

Добавление в группы

Как правило, все пользователи на сайте состоят в каких либо группах, так как же программно добавить пользователя в одну или несколько групп? А вот так:

// список групп
$groupsList = array('FirstGroup', 'SecondGroup');

$groups = array();
foreach($groupsList as $groupName){
  // получаем группу по имени
  $group = $modx->getObject('modUserGroup', array('name' => $groupName));
  // создаем объект типа modUserGroupMember
  $groupMember = $modx->newObject('modUserGroupMember');
  $groupMember->set('user_group', $group->get('id'));
  $groupMember->set('role', 1); // 1 - это членство с ролью Member
  $groups[] = $groupMember;
}

// добавляем пользователя в группы
$user->addMany($groups);
$user->save();

Поле extended

Поле extended объекта modUserProfile позволяет задать набор дополнительных свойств для пользователя. Поле extended представляет собой массив, доступ к полям которого осуществляется по имени. MODX при сохранении в базу преобразует массив в JSON, а при получении объекта из базы преобразует обратно.

Работать с этим полем очень просто:

$user = $modx->getObject('modUser', 1);
$profile = $user->getOne('Profile');
$extended = $profile->get('extended');
$extended['weight'] = 100;
$extended['size'] = array('width' => 50, 'height' => 200);
$profile->set('extended', $extended);
$profile->save();

Как видим, $extended может быть любым массивом, в том числе и многомерным. Результат будет таким:

Поле extended modUserProfile

Обратите внимание, что по полю extended не представляется возможным выполнять сортировку или фильтрацию пользователей (по крайней мере, на уровне базы данных). Так что будьте внимательны при его использовании! Если вам это необходимо, то по всей видимости придется добавлять новые поля, как это сделать написано в официальной документации: http://rtfm.modx.com/display/revolution20/Extending+modUser

Авторизация

Для авторизации под конкретным пользователем правильнее всего воспользоваться механизмом процессоров MODX. Для авторизации существует специальный процессор security/login:

// задаем параметры
$logindata = array(
  'username' => 'someuser',   // имя пользователя
  'password' => '1234567890', // пароль
  'rememberme' => true        // запомнить?
);
// сам процесс авторизации
$response = $modx->runProcessor('/security/login', $logindata);
// проверяем, успешно ли
if ($response->isError()) {
  // произошла ошибка, например неверный пароль
  $modx->log(modX::LOG_LEVEL_ERROR, 'Login error. Message: '.$response->getMessage());
}

Выход

Отлично, а как выйти из под пользователя?

Еще проще:

$response = $this->modx->runProcessor('/security/logout');
if ($response->isError()) {
  // ошибка
  $this->modx->log(modX::LOG_LEVEL_ERROR, 'Logout error. Message: '.$response->getMessage());
}