Каждый достаточно опытный пользователь Битрикса знает что форма редактирования элементов инфоблока может быть настроена произвольным образом для каждого инфоблока. Могут быть удалены или добавлены вкладки, свойства и поля могут быть размещены на любой вкладке в любом порядке. В административном разделе это сделать достаточно просто. Здесь же мы опишем как это можно сделать программно через API Битрикса.
Сделать это достаточно просто, но информации об этом практически нет.
Информация о настройках форм редактирования элементов инфоблоков хранится в свойствах системы. Каждое свойство соответствует конкретному инфоблоку и пользователю или всем пользователям по умолчанию.
Собственно описание настроек формы заключается в создании массива, который описывает вкладки и содержащиеся в них поля. После чего этот массив записывается в свойство.
Посмотрим пример кода:
<?
use \Bitrix\Main\Loader;
Loader::includeModule("iblock");
$iblockID = 3;
// получаем свойства инфоблока
$arProps = [];
$properties = CIBlockProperty::GetList([], ["IBLOCK_ID"=>$iblockID]);
while ($arPropField = $properties->GetNext())
{
$arProps[$arPropField["CODE"]] = $arPropField["ID"];
}
$arSettings = [
"tabs" => implode(
";", [
implode(
",",
[
"edit1--#--Элемент--", // первая вкладка
"--ID--#--ID--",
"--DATE_CREATE--#--Создан--",
"--TIMESTAMP_X--#--Изменен--", // поля в виде --КОД_ПОЛЯ--#--НАЗВАНИЕ_В_ФОРМЕ--
"--ACTIVE--#--Активность--",
"--ACTIVE_FROM--#--Начало активности--",
"--ACTIVE_TO--#--Окончание активности--",
"--DETAIL_PICTURE--#--Фон--",
"--NAME--#--*Название--",
"--SORT--#--Сортировка--",
"--PROPERTY_".$arProps["COLOR"]."--#--Цвет текста--", // свойства в виде --PROPERTY_ID_СВОЙСТВА--#--НАЗВАНИЕ_В_ФОРМЕ--
"--PROPERTY_".$arProps["REF"]."--#--Ссылка--",
"--PROPERTY_".$arProps["BUTTON"]."--#--Текст кнопки--",
"--PROPERTY_".$arProps["WIDTH"]."--#--Ширина--",
"--DETAIL_TEXT--#--Текст--",
"--XML_ID--#--*Внешний код--",
]
),
"--"
]
)
];
\CUserOptions::SetOption("form", "form_element_".$iblockID, $arSettings, true); // по умолчанию
\CUserOptions::SetOption("form", "form_element_".$iblockID, $arSettings, false, 5); // для пользователя с ID 5
?>
Что мы делаем.
Сначала получаем свойства инфоблока. Это нужно для получения ID свойства по его коду. Если вы заранее знаете ID свойств, то этот шаг можно пропустить, но в некоторых случаях мы знаем только код. Например, перед этим мы создаем эти свойства и не знаем какие ID они получат.
Следующий шаг создание самого массива. Расписывать подробно необходимости нет, все понятно по комментариям. В примере описана только одна вкладка. Их может быть любое количество.
Последнее что мы делаем - кладем наш массив в свойство, указывая ID инфоблока и, при необходимости, ID пользователя.
27.01.2022