Пользователь и Пользовательские поля в Битрикс D7

Получение полей пользователя в 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] => Статус клиента при обращении
)
*/