Свойства: справочник
DevBx\Core\IblockProperties — описание свойств одного инфоблока: типы, коды, настройки,
значения списков. Это справочник, а не значения свойств у элементов.
Коллекция читается как массив, обходится циклом и считается через count() —
класс реализует ArrayAccess, SeekableIterator и Countable.
Получение и чтение
use DevBx\Core\IblockProperties;
$properties = IblockProperties::getInstance($iblockId);
$byCode = $properties['COLOR']; // строковый ключ — символьный код
$byId = $properties[42]; // числовой ключ — номер свойства
if (isset($properties['COLOR'])) {
echo $properties['COLOR']['NAME'];
}
foreach ($properties as $id => $property) {
echo $property['CODE'];
}
getInstance отдаёт один и тот же экземпляр на инфоблок в пределах запроса. Свойства
перечитываются вызовом refresh() — после того, как код сам добавил свойство, это обязательно,
иначе коллекция его не увидит.
Записывать через [] нельзя: offsetSet и offsetUnset бросают SystemException. Коллекция
только читает.
Отбор
$property = $properties->getByName('Цвет'); // по названию, регистр не важен
$property = $properties->getByName('Цвет', false); // с учётом регистра
$ids = $properties->getId(); // номера всех свойств
$iblockId = $properties->getIblockId();
Есть и filter(), но пользоваться им нужно с оглядкой: он сравнивает значения, а не пары
«поле и значение». filter(['MULTIPLE' => 'Y']) вернёт все свойства, у которых буква Y стоит
в любом поле — множественные, обязательные, участвующие в поиске. Для отбора по конкретному полю
надёжнее обычный цикл.
Одно свойство
IblockProperty — обёртка над массивом свойства с теми же интерфейсами.
$property = $properties['COLOR'];
$array = $property->toArray(); // исходный массив свойства
$default = $property->getDefaultValue();
$enum = $property->getEnumValues();
getDefaultValue() отвечает по типу свойства:
| Тип | Что вернётся |
|---|---|
L (список) |
номер значения, отмеченного как «по умолчанию», иначе false |
S + directory (справочник) |
UF_XML_ID записи, у которой UF_DEF равно единице |
| остальные | поле DEFAULT_VALUE |
Для справочника нужны поля UF_DEF и UF_XML_ID — их нет, вернётся false.
В отличие от коллекции, у IblockProperty запись через [] разрешена, но правит она только
копию в памяти: в базу ничего не уходит.
Значения списка
use DevBx\Core\IblockPropertyEnum;
$enum = IblockPropertyEnum::getInstance($propertyId);
foreach ($enum as $id => $value) {
echo $value['VALUE'];
}
$default = $enum->getDefault(); // первое значение с DEF = 'Y', иначе false
$all = $enum->toArray();
Порядок — по сортировке, затем по значению, затем по номеру. Экземпляр тоже один на свойство в
пределах запроса, перечитывается через refresh().