Документация

Свойства: справочник

DevBx\Core\IblockProperties — описание свойств одного инфоблока: типы, коды, настройки, значения списков. Это справочник, а не значения свойств у элементов.

Коллекция читается как массив, обходится циклом и считается через count() — класс реализует ArrayAccess, SeekableIterator и Countable.

Получение и чтение

php
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. Коллекция только читает.

Отбор

php
$property = $properties->getByName('Цвет');          // по названию, регистр не важен
$property = $properties->getByName('Цвет', false);   // с учётом регистра

$ids = $properties->getId();                          // номера всех свойств
$iblockId = $properties->getIblockId();

Есть и filter(), но пользоваться им нужно с оглядкой: он сравнивает значения, а не пары «поле и значение». filter(['MULTIPLE' => 'Y']) вернёт все свойства, у которых буква Y стоит в любом поле — множественные, обязательные, участвующие в поиске. Для отбора по конкретному полю надёжнее обычный цикл.

Одно свойство

IblockProperty — обёртка над массивом свойства с теми же интерфейсами.

php
$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 запись через [] разрешена, но правит она только копию в памяти: в базу ничего не уходит.

Значения списка

php
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().