Свойства: поиск и создание
Свойства ищет, создаёт и переносит между инфоблоками сам DevBx\Core\Iblock. Здесь работает
собственный кэш: свойства инфоблока читаются один раз за запрос, и у типов «список» и «привязка
к элементу» дополнительно собирается карта «значение в нижнем регистре — номер».
Поиск
use DevBx\Core\Iblock;
$property = Iblock::findPropByCode($iblockId, 'COLOR'); // код или номер
$property = Iblock::findPropByName($iblockId, 'Цвет'); // название
Регистр не важен в обоих случаях. Не нашли — false. Возвращается массив свойства, а не объект;
объектная обёртка — в IblockProperties.
Методы Iblock::getPropertyByCode и Iblock::getEnumValuesForProperty помечены @deprecated.
Вместо них берите IblockProperties.
Создание
$property = Iblock::addProperty([
'IBLOCK_ID' => $iblockId,
'NAME' => 'Цвет',
'PROPERTY_TYPE' => 'L',
]);
addProperty возвращает массив свойства — созданного или уже существовавшего. Правила, по
которым он достраивает поля:
- кода нет — соберёт транслитерацией из названия;
- код приводится к верхнему регистру и обрезается до 50 знаков;
- код из одних цифр получает префикс
P_: чисто числовой код Битрикс принял бы за номер; - тип по умолчанию —
S, строка; - сортировка — на сотню больше самой большой в инфоблоке;
- активность —
Y.
Бросает SystemException, если не передан номер инфоблока, если название пустое и если Битрикс
отказался создавать свойство.
Есть более простой вариант — addPropertyIfNotExists($arFields). Он ищет только по полю CODE
и возвращает номер свойства, а не массив; при отказе отдаёт false, а не бросает
исключение. Две разные подписи у похожих методов — повод не перепутать, что именно вы
присваиваете.
Перенос свойств между инфоблоками
Iblock::copyIblockProperties($sourceIblockId, $targetIblockId);
Iblock::copyIblockProperties($sourceIblockId, $targetIblockId, ['XML_ID', 'CODE']);
Iblock::copyIblockProperties($sourceIblockId, $targetIblockId, 'CODE', ['ACTIVE' => 'Y']);
Переносит описания свойств и, для списков, сами значения — по внешнему коду XML_ID, поэтому
повторный запуск не плодит дубли. Существующие свойства не трогаются.
- Третий аргумент — поле или список полей, по которым свойство ищется в приёмнике. Первое совпадение выигрывает.
- Четвёртый — фильтр по свойствам источника.
- Нет инфоблока-приёмника —
SystemException.
Учтите при своём наборе полей сравнения. Проверка «код уже занят другим свойством» в этом
методе не срабатывает: в её фильтре стоит COPDE вместо CODE. Пока в списке сравнения есть
CODE, это незаметно — свойство находится раньше. Если сравнивать только по XML_ID, свойство
с занятым кодом дойдёт до создания, и SystemException бросит уже сам Битрикс.