Заметка написана на основе старого черновика, и все описанное было проверено на чистой установке 1С-Битрикс. Примеры работают корректно. Плюс, данная статья будет периодически дополняться.
Может показаться, что проще воспользоваться старым методом CUser::GetList, который получит все поля, включая пользовательские, за один раз.
Кода действительно будет меньше, но старый метод — это адаптер для новых. Под капотом произойдет использование D7, но медленнее: потребуется время на "включение адаптера".
Выборка данных в новом ядре
Для выборки данных используется статический метод нужного класса: getList(). На вход принимается массив параметров:
$res = \Запрос\К нужному классу::getList([
'order' => // массив- сортировка
'select' => // массив- выбираемые поля
'filter' => // массив- фильтр
'group' => // массив- группировка, order должен быть пустой
'limit' => // число- ограничение выбираемого кол-ва
'offset' => // число- смещение первого столбца в результате
'count_total' => // число- дает возможность получить кол-во элементов через метод getCount()
'runtime' => // массив полей сущности, создающихся динамически
'data_doubling' => // булево (ум. false) - получение одинаковых записей
'cache' => array( // массив- кеширование запроса запроса
'ttl' => 1000,
'cache_joins' => true
),
]);
Обратите внимание на параметр 'select'. Если вам нужны не все поля выборки, передайте в него конкретные поля, например, название и ID:
$res = \Запрос\К нужному классу::getList([
'select' => [
'ID',
'NAME'
]
]);
Если нужны все поля, передайте звездочку:
$res = \Запрос\К нужному классу::getList([
'select' => [
'*'
]
]);
Получить информацию обо всех пользователях
Для получения информации обо всех пользователях используется класс Bitrix\Main\UserTable. Так как нужно получить все поля и всех пользователей, достаточно передать в выборку только select со звездочкой:
use Bitrix\Main\UserTable;
$arUsers = UserTable::getList([
'select' => [
'*'
]
])->fetchAll();
foreach ($arUsers as $user) {
echo '<pre>';
print_r($user);
echo '</pre>';
}
В выводе print_r($user); вы увидите все поля, кроме пользовательских и особенного поля "Номер телефона для регистрации".
Получить поле "Номер телефона для регистрации"
Чтобы получить номер телефона для регистрации, нужно использовать класс Bitrix\Main\UserPhoneAuthTable. Добавим это поле в нашу распечатку пользователей:
use Bitrix\Main\UserTable;
use Bitrix\Main\UserPhoneAuthTable;
$arUsers = UserTable::getList([
'select' => [
'*'
]
])->fetchAll();
foreach ($arUsers as $user) {
// Дополучаем номер для регистрации
$user['PHONE_NUMBER'] = UserPhoneAuthTable::getList([
'filter' => [
'=USER_ID' => $user['ID']
],
'select' => [
'PHONE_NUMBER'
],
])->fetch();
echo '<pre>';
print_r($user);
echo '</pre>';
}
Теперь это поле будет в общей распечатке всех полей пользователя.
Получение пользовательских полей
Добавим в распечатку пользовательские поля. Для этого нужен класс Bitrix\Main\UserFieldTable:
use Bitrix\Main\UserTable;
use Bitrix\Main\UserPhoneAuthTable;
use Bitrix\Main\UserFieldTable;
$arUsers = UserTable::getList([
'select' => [
'*'
]
])->fetchAll();
foreach ($arUsers as $user) {
// Дополучаем пользовательские поля
$user['UF_FIELDS'] = UserFieldTable::getList([
'filter' => [
'ID' => $user['ID']
],
'select' => [
'*'
],
])->fetchAll();
// Дополучаем номер для регистрации
$user['PHONE_NUMBER'] = UserPhoneAuthTable::getList([
'filter' => [
'=USER_ID' => $user['ID']
],
'select' => [
'PHONE_NUMBER'
],
])->fetch();
echo '<pre>';
print_r($user);
echo '</pre>';
}
Получение групп пользователя
Для получения групп пользователя нужен класс Bitrix\Main\UserGroupTable. Давайте дополним нашу распечатку пользователя:
use Bitrix\Main\UserTable;
use Bitrix\Main\UserGroupTable;
use Bitrix\Main\UserPhoneAuthTable;
use Bitrix\Main\UserFieldTable;
$arUsers = UserTable::getList([
'select' => [
'*'
]
])->fetchAll();
foreach ($arUsers as $user) {
// Дополучаем группы пользователя
$user['GROUPS'] = UserGroupTable::getList([
'filter' => [
'=USER_ID' => $user['ID']
],
'select' => [
'*'
],
])->fetchAll();
// Дополучаем пользовательские поля
$user['UF_FIELDS'] = UserFieldTable::getList([
'filter' => [
'ID' => $user['ID']
],
'select' => [
'*'
],
])->fetchAll();
// Дополучаем номер для регистрации
$user['PHONE_NUMBER'] = UserPhoneAuthTable::getList([
'filter' => [
'=USER_ID' => $user['ID']
],
'select' => [
'PHONE_NUMBER'
],
])->fetch();
echo '<pre>';
print_r($user);
echo '</pre>';
}
Получение пользователей из определнной группы
Рассмотрим пример использования фильтра в выборке UserTable::getList. Например, нам нужно получить всех пользователей, которые являются администраторами (с группой ID=1). Нужно получить только ID таких пользователей и EMAIL:
use Bitrix\Main\UserTable;
use Bitrix\Main\UserGroupTable;
// Получаем ID пользователей, которые входят в группу с ID 1 (администраторы)
$arAdmins = UserGroupTable::getList([
'filter' => [
'=GROUP_ID' => 1
],
'select' => [
'USER_ID'
],
])->fetchAll();
// Преобразуем полученный результат в простой массив ID пользователей
$arAdminsIds = array_column(
$arAdmins,
'USER_ID'
);
$arUsers = UserTable::getList([
'filter' => [
'ID' => $arAdminsIds
],
'select' => [
'ID',
'EMAIL'
]
])->fetchAll();
foreach ($arUsers as $user) {
echo '<pre>';
print_r($user);
echo '</pre>';
}
Можно пойти от обратного: если нужно получить всех пользователей, которые не являются администраторами, просто используйте отрицание в фильтре UserGroupTable::getList:
use Bitrix\Main\UserTable;
use Bitrix\Main\UserGroupTable;
// Получаем ID пользователей, которые НЕ входят в группу с ID 1 (администраторы)
$arNotAdmins = UserGroupTable::getList([
'filter' => [
'!=GROUP_ID' => 1
],
'select' => [
'USER_ID'
],
])->fetchAll();
// Преобразуем полученный результат в простой массив ID пользователей
$arNotAdminsIds = array_column(
$arNotAdmins,
'USER_ID'
);
$arUsers = UserTable::getList([
'filter' => [
'ID' => $arNotAdminsIds
],
'select' => [
'ID',
'EMAIL'
]
])->fetchAll();
foreach ($arUsers as $user) {
echo '<pre>';
print_r($user);
echo '</pre>';
}
Давайте воспользуемся методами add и delete. Например, хотим пользователей с ID 7 и 8 исключить из группы "Контент-редакторы" и добавить в группу "Администраторы"
use Bitrix\Main\UserTable;
use Bitrix\Main\UserGroupTable;
$arUsers = UserTable::getList([
'filter' => [
'ID' => [
7,
8
]
],
'select' => [
'ID'
]
])->fetchAll();
foreach ($arUsers as $user) {
// Удаляем из Контент-редакторов
UserGroupTable::delete(array(
"USER_ID" => $user['ID'],
"GROUP_ID" => 10, // ID этой группы
));
// Добавляем в администраторов
UserGroupTable::add(array(
"USER_ID" => $user['ID'],
"GROUP_ID" => 1,
));
}
О текущем авторизованном пользователе
Некоторые аналоги старого метода CUser::GetID находятся в классе Bitrix\Main\Engine\CurrentUser
use Bitrix\Main\Engine\CurrentUser;
$Id = CurrentUser::get()->getId(); // ID юзера
$isAdmin = CurrentUser::get()->isAdmin(); // Админ ли он
$Login = CurrentUser::get()->getLogin(); // Его логин
Методом ::get, этого класса можно получить и другие поля пользователя. Но если вам нужно не одно конкретное поле, проще воспользоваться примерами выше, передав в фильтр ID текущего пользователя
use Bitrix\Main\Engine\CurrentUser;
use Bitrix\Main\UserTable;
$Id = CurrentUser::get()->getId(); // ID юзера
$arUsers = UserTable::getList([
'filter' => [
'ID' => $Id
]
'select' => [
'*'
]
])->fetchAll();
foreach ($arUsers as $user) {
echo '<pre>';
print_r($user);
echo '</pre>';
}
Если столкнетесь с проблемами, пишите в комментариях — буду дополнять заметку.