Получение полей пользователя в D7
Как мы знаем в системе Bitrix механизм авторизации и работы с пользователями идёт вместе с основным модулем. \ Поэтому, используя классы главного модуля мы так же можем получить данные полей для пользователя:
$dbUser = \Bitrix\Main\UserTable::getList(array(
'select' => array('ID', 'NAME', 'PERSONAL_PHOTO', 'PERSONAL_WWW'),
'filter' => array('ID' => $USER->GetID())
));
if ($arUser = $dbUser->fetch()){
var_dump($arUser);
}
Тут же можно получить и Пользовательские свойства.
use Bitrix\Main\UserTable;
use Bitrix\Main\Loader;
// Получим всех пользователей, у которых UF_SCORES не пустое.
if (Loader::includeModule("main")) {
$filter = [
'UF_SCORES' => '%', // Используем % для фильтрации непустых значений.
// '!UF_SCORES' => false, // То же самое.
];
$users = UserTable::getList([
'select' => ['ID', 'NAME', 'LAST_NAME', 'UF_SCORES'],
'filter' => $filter,
]);
if (!empty($users)){
while ($user = $users->fetch()) {
echo "ID: " . $user['ID'] . "<br>";
echo "Имя: " . $user['NAME'] . "<br>";
echo "Фамилия: " . $user['LAST_NAME'] . "<br>";
echo "UF_SCORES: " . $user['UF_SCORES'] . "<br><br>";
}
}
} else {
echo "Не удалось подключить модуль пользователей.";
}
В результате, используя метод getList() мы получаем поля текущего авторизованного пользователя (согласно установленному фильтру в параметрах вызова метода).
Получение пользовательских полей в D7
В системе Bitrix пользовательские поля могут быть использованы довольно широко, и являются универсальным инструментом для реализации различных задач по хранению данных. \ Так посредством главного модуля, мы можем получить данные пользовательских полей:
$dbUserFields = \Bitrix\Main\UserFieldTable::getList(array(
'filter' => array('ENTITY_ID' => 'IBLOCK_'.$IBLOCK_ID.'_SECTION')
));
while ($arUserField = $dbUserFields->fetch()) {
if ($arUserField["USER_TYPE_ID"] == 'enumeration') {
$dbEnums = CUserFieldEnum::GetList(
array(),
array('USER_FIELD_ID' => $arUserField['ID'])
);
while ($arEnum = $dbEnums->GetNext()) {
$arUserField['ENUMS'][$arEnum['XML_ID']] = $arEnum;
}
}
$arResult['USER_FIELDS'][$arUserField["FIELD_NAME"]] = $arUserField;
}
Настраивая параметры фильтра для запроса, мы можем выбирать значения различных пользовательских полей в нужных участках кода.
USER_FIELD_MANAGER
global $USER_FIELD_MANAGER;
function SetUserField ($entity_id, $value_id, $uf_id, $uf_value) // запись значения.
{
return $GLOBALS["USER_FIELD_MANAGER"]->Update($entity_id, $value_id, Array($uf_id => $uf_value));
}
function GetUserField ($entity_id, $value_id, $uf_id) // получение значения.
{
$arUF = $GLOBALS["USER_FIELD_MANAGER"]->GetUserFields ($entity_id, $value_id);
return $arUF[$uf_id]["VALUE"];
}
// $entity_id - имя объекта (у нас "BLOG_RATING");
// $value_id - идентификатор элемента (ID элемента, свойство которого сохраняем или получаем. в нашем случае, это ID комментария);
// $uf_id - имя пользовательского свойства (в нашем случае UF_RATING);
// $uf_value - значение, которое сохраняем;
Работа с группами пользователей в D7
Группы пользователей, как и сами пользователи в системе Bitrix так же связаны с главным модулем. \ Это означает что работать с группами пользователей мы можем посредством использования методов главного модуля.
Получение списка групп пользователя
$dbGroup = \Bitrix\Main\UserGroupTable::getList(array(
'filter' => array("USER_ID" => 90)
));
$arGroups = $dbGroup->FetchAll();
echo '<pre>'; print_r($arGroups); echo '</pre>';
// Old. Иногда удобнее.
global $USER;
$curUserId = $USER->GetID(); // ID текущего пользователя.
$arGroups = CUser::GetUserGroup($curUserId); // ID групп текущего пользователя.
foreach ($arGroups as $curUserGroups) {
$rsGroup = CGroup::GetByID($curUserGroups); // Получаем названия всех групп.
$arGroup = $rsGroup->Fetch();
if ($arGroup['ID'] !== '2') { // 2 - Все пользователи.
echo $arGroup['NAME']; // И выводим.
}
}
/* Получаем массив вида
array: [
0 => "1"
1 => "3"
2 => "4"
3 => "2"
]
*/
Добавление пользователя в определённую группу
\Bitrix\Main\UserGroupTable::add(array(
"USER_ID" => $USER_ID,
"GROUP_ID" => 10,
));
Удаление пользователей из группы
\Bitrix\Main\UserGroupTable::delete(array(
"USER_ID" => $USER_ID,
"GROUP_ID" => 10,
));
Проверка наличия группы у пользователя {#проверка-наличия-группы-у-пользователя}
// Проверка идет на соответствие группам с оператором ИЛИ, т.е. согласно приведенному примеру, под выборку попадут пользователи с группой "4" или "5", в том числе пользователи, состоящие в обеих группах.
if ( CSite::InGroup( array(4,5) ) ) {
// если указанные группы есть, то выполняем код
}
Выборка всех пользовательских полей всех объектов
$rsUserFields = \Bitrix\Main\UserFieldTable::getList(array(
'order' => array('ENTITY_ID'=>'ASC','SORT'=>'ASC'),
));
while($arUserField=$rsUserFields->fetch())
{
print_r($arUserField);
}
/*
Array
(
[ID] => 86
[ENTITY_ID] => IBLOCK_55_SECTION
[FIELD_NAME] => UF_TYPE
[USER_TYPE_ID] => enumeration
[XML_ID] =>
[SORT] => 100
[MULTIPLE] => N
[MANDATORY] => N
[SHOW_FILTER] => I
[SHOW_IN_LIST] => Y
[EDIT_IN_LIST] => Y
[IS_SEARCHABLE] => N
[SETTINGS] => Array
(
[DISPLAY] => LIST
[LIST_HEIGHT] => 1
[CAPTION_NO_VALUE] =>
)
)
Array
(
[ID] => 101
[ENTITY_ID] => HLBLOCK_11
[FIELD_NAME] => UF_KINDS_OF_WORK
[USER_TYPE_ID] => enumeration
[XML_ID] =>
[SORT] => 100
[MULTIPLE] => Y
[MANDATORY] => N
[SHOW_FILTER] => N
[SHOW_IN_LIST] => Y
[EDIT_IN_LIST] => Y
[IS_SEARCHABLE] => N
[SETTINGS] => Array
(
[DISPLAY] => LIST
[LIST_HEIGHT] => 5
[CAPTION_NO_VALUE] =>
[SHOW_NO_VALUE] => Y
)
)
*/
Выборка всех пользовательских полей типа "Список" для всех объектов
$rsUserFields = \Bitrix\Main\UserFieldTable::getList(array(
'filter'=>array('USER_TYPE_ID'=>'enumeration'),
));
while($arUserField=$rsUserFields->fetch())
{
print_r($arUserField);
}
Получение значений
$rsUserFields = \Bitrix\Main\UserFieldTable::getList(
[ 'filter' => [
'USER_TYPE_ID' => 'enumeration',
'FIELD_NAME' => 'UF_TYPE'
]
]
);
while ($arUserField = $rsUserFields->fetch()) {
$enumList = \CUserFieldEnum::getList([], ['USER_FIELD_ID' => $arUserField['ID']]);
}
while ($enumValue = $enumList->fetch()) {
echo '<pre>'; print_r($enumValue); echo '</pre>';
}
}
Изменение пользовательского свойства D7
Способ ниже выдаст ошибку "use CUser". Так что оставим это пока до лучших времен. CUser будет ниже.
use Bitrix\Main\UserTable;
use Bitrix\Main\Loader;
if (Loader::includeModule("main")) {
$userId = 1; // ID пользователя, которого нужно обновить.
// Находим пользователя по ID.
$user = UserTable::getById($userId)->fetch();
if ($user) {
// Обновляем пользовательское свойство.
$result = UserTable::update($userId, [
'UF_SCORES' => "Новое_значение",
]);
if ($result->isSuccess()) {
echo "Пользователь успешно обновлен.";
} else {
echo "Ошибка обновления пользователя: " . implode(", ", $result->getErrorMessages());
}
} else {
echo "Пользователь не найден.";
}
} else {
echo "Не удалось подключить модуль пользователей.";
} if (CModule::IncludeModule("main")) {
$userId = 1; // ID пользователя, которого нужно обновить.
$userFields = [
"UF_SCORES" => "Новое_значение",
];
// Создаем объект для работы с пользователями.
$user = new CUser;
// Обновляем данные пользователя.
if ($user->Update($userId, $userFields)) {
echo "Пользователь успешно обновлен.";
} else {
echo "Ошибка обновления пользователя: " . $user->LAST_ERROR;
}
} else {
echo "Не удалось подключить модуль пользователей.";
}
Добавление нескольких файлов в пользовательское поле тип файл (множ.)
public function policyCertAddMultipleAction(): bool
{
$arFiles = $this->requestStack->getFileList()->toArray();
if(count($arFiles) > 1 || !$arFiles['UF_INSURANCE_POLICY']) {
return false;
}
$targetFiles = $arFiles['UF_INSURANCE_POLICY'];
$currentFiles = [];
foreach ($targetFiles["name"] as $key => $value) {
$fileName = $targetFiles["name"][$key];
$fileTmpName = $targetFiles["tmp_name"][$key];
$fileType = $targetFiles["type"][$key];
$file = \CFile::MakeFileArray($fileTmpName);
$file['name'] = $fileName;
$currentFiles[] = $file;
}
global $USER;
$userId = $USER->GetID();
$user = new \CUser;
$curFiles = [];
$fields = ["UF_INSURANCE_POLICY" => $currentFiles];
if ($user->Update($userId, $fields)) {
dd('OK');
return true;
} else {
dd($user->LAST_ERROR);
return false;
}
}
Изменение значений списка пользовательского поля.
<?
// https://dev.1c-bitrix.ru/api_help/main/reference/cuserfieldenum/setenumvalues.php
//Пусть для пользователей определено пользовательское свойство
// типа список с кодом UF_GENDER.
// 0. определим идентификатор поля.
$arFields = $GLOBALS['USER_FIELD_MANAGER']->GetUserFields("USER");
if(array_key_exists("UF_GENDER", $arFields))
{
$FIELD_ID = $arFields["UF_GENDER"]["ID"];
// 1. Добавим значение выпадающего списка: "не знаю"
$obEnum = new CUserFieldEnum;
$obEnum->SetEnumValues($FIELD_ID, array(
"n0" => array(
"VALUE" => "не знаю",
),
));
// 2. Изменим "не знаю" на "не помню"
$rsEnum = CUserFieldEnum::GetList(array(), array(
"VALUE" => "не знаю",
));
if($arEnum = $rsEnum->Fetch())
{
$obEnum = new CUserFieldEnum;
$obEnum->SetEnumValues($FIELD_ID, array(
$arEnum["ID"] => array(
"VALUE" => "не помню",
),
));
}
// 3. удалим значение "не помню" из списка
$rsEnum = CUserFieldEnum::GetList(array(), array(
"VALUE" => "не помню",
));
if($arEnum = $rsEnum->Fetch())
{
$obEnum = new CUserFieldEnum;
$obEnum->SetEnumValues($FIELD_ID, array(
$arEnum["ID"] => array(
"DEL" => "Y",
),
));
}
}
?>
Получение пользователей из определенной группы одним запросом
use Bitrix\Main\{UserTable, Entity};
UserTable::getEntity()->addField(
new Entity\ReferenceField(
'USER_GROUP',
'Bitrix\Main\UserGroupTable',
Entity\Query\Join::on('this.ID', 'ref.USER_ID')
)
);
$filter = ['=USER_GROUP.GROUP_ID' => 6];
$users = UserTable::getList([
'select' => [
'ID',
'NAME',
'USER_GROUP_ID' => 'USER_GROUP.GROUP_ID',
],
'filter' => $filter,
])->fetchAll();
Получить название пользовательского поля Битрикс по его коду
Если есть id поля:
<?php
use Bitrix\Main\UserFieldTable;
$id = 1;
$res = UserFieldTable::getFieldData($id);
print_r($res);
Если только символьный код:
<?php
use Bitrix\Main\UserFieldTable;
$fieldName = 'UF_STATUS_CLIENT';
$res = UserFieldTable::getList([
'select' => array_merge(['*'], UserFieldTable::getLabelsSelect()),
'filter' => [
'=FIELD_NAME' => $fieldName,
],
'limit' => 1,
'runtime' => [
UserFieldTable::getLabelsReference(null, 'ru'),
]
])->fetch();
print_r($res);
/*
Получаем такой массив:
Array
(
[ID] => 305
[ENTITY_ID] => CRM_DEAL
[FIELD_NAME] => UF_STATUS_CLIENT
[USER_TYPE_ID] => enumeration
[XML_ID] =>
[SORT] => 100
[MULTIPLE] => N
[MANDATORY] => N
[SHOW_FILTER] => E
[SHOW_IN_LIST] => Y
[EDIT_IN_LIST] => Y
[IS_SEARCHABLE] => Y
[SETTINGS] => Array
(
[DISPLAY] => DIALOG
[LIST_HEIGHT] => 1
[CAPTION_NO_VALUE] =>
[SHOW_NO_VALUE] => Y
)
[LANGUAGE_ID] => ru
[EDIT_FORM_LABEL] => Статус клиента при обращении
[LIST_COLUMN_LABEL] => Статус клиента при обращении
[LIST_FILTER_LABEL] => Статус клиента при обращении
[ERROR_MESSAGE] => Статус клиента при обращении
[HELP_MESSAGE] => Статус клиента при обращении
)
*/