Внимание! Это памятка! Корифеи, пожалуйста, не флудите комментами типа "это любой дурак знает".
Итак.
На сайте Битрикс эта тема закопана глубоко в FAQ, а между прочим она очень часто используется, особенно пользовательские поля разделов инфоблока.
Для объекта IBLOCK_<IBLOCK_ID>_SECTION: в Update() и Add() значения пользовательских полей передаются так же, как и "обычных" полей, например:
в CIBlockSection::GetList() для получения значений полей используйте четвертый, пока недокументированный параметр arSelect, в котором передавайте коды необходимых к выборке ПП в следующем виде:
$arSelect = array("UF_TEXT_1", ...); |
или
$arSelect = array("UF_*"); |
для выборки всех полей.
Фильтрация - так же, как и по "обычным" полям.
Один важный момент: в случае работы с ПП групп инфоблока обязательно в фильтре для CIBlockSection::GetList() указывайте IBLOCK_ID.
Для объекта USER:
в Update() и Add() значения пользовательских полей передаются так же, как и "обычных" полей, например:
в CUser::GetList() для получения значений полей используйте четвертый, пока недокументированный параметр arParams, в котором передавайте коды необходимых к выборке ПП в следующем виде:
$arParams["SELECT"] = array("UF_TEXT_1", ...); |
или
$arParams["SELECT"] = array("UF_*"); |
для выборки всех полей.
Фильтрация - так же, как и по "обычным" полям.
Важные особенности
Если в пользовательских полях раздела есть списочные значения или значения типа "Файл", то необходимо в селекте также выбирать поле IBLOCK_ID, иначе будет возвращаться 500-я ошибка. Пример:
$arSection['UF'] = CIBlockSection::GetList(array("ID"=>"ASC"), array("IBLOCK_ID"=>4, "ID" => $arSection['ID']), false, array("ID", "IBLOCK_ID", "UF_*"))->GetNext(); |
Если написать просто:
$arSection['UF'] = CIBlockSection::GetList(array("ID"=>"ASC"), array("IBLOCK_ID"=>4, "ID" => $arSection['ID']), false, array("UF_*"))->GetNext(); |
- даст 500 ошибку
Указанный выше код для свойств типа "Список" вернет не конкретные значения, а ID этих значений. А у значений есть еще реальное значение (на человеческом языке) и XML_ID. Получить их можно опять-же через API. Пример получения всех значений списочного свойства:
$arFields = $USER_FIELD_MANAGER->GetUserFields("IBLOCK_33_SECTION");
$obEnum = new CUserFieldEnum;
$rsEnum = $obEnum->GetList(array(), array("USER_FIELD_ID" => $arFields["UF_MY_LIST"]["ID"]));
while($arEnum = $rsEnum->GetNext())
{
} |
Здесь применяется интересная конструкция $USER_FIELD_MANAGER. Видимо, это какая-то служебная константа в Битрикс. 33 в IBLOCK_33_SECTION - ID инфоблока соответственно.
Для получения строкового значения пользовательского свойства типа "список" можно использовать следующий код:
$rsEnum = CUserFieldEnum::GetList(array(), array("ID" =>$ENUM_ID));
// $ENUM_ID - возвращаемый ID значения
$arEnum = $rsEnum->GetNext();
echo $arEnum["VALUE"]; |
Соответственно $arEnum["XML_ID"] будет содержать XML_ID значения списочного свойства.