Yandex Metrika
sanches.free

Свойства-списки инфоблока: PropertyEnumerationTable и карты XML_ID

Зачем отдельная таблица перечислений

Свойства типа «Список» хранят варианты в b_iblock_property_enum. В D7 удобно ходить через \Bitrix\Iblock\PropertyEnumerationTable, не собирая сырой SQL.

Все значения одного свойства

use Bitrix\Iblock\PropertyEnumerationTable;

$variants = PropertyEnumerationTable::getList([
    'filter' => ['PROPERTY_ID' => 10],
]);
while ($row = $variants->fetch()) {
    print_r($row);
}

Карты XML_ID ⇄ ID по инфоблоку

Сначала находим все L-свойства инфоблока, затем для каждого тянем enum-строки и заполняем два зеркальных массива по символьному коду свойства.

use Bitrix\Iblock\PropertyTable;
use Bitrix\Iblock\PropertyEnumerationTable;

$byXml = [];
$byId = [];

$props = PropertyTable::getList([
    'filter' => [
        'IBLOCK_ID' => 8,
        '=PROPERTY_TYPE' => 'L',
    ],
    'select' => ['ID', 'CODE'],
]);

while ($prop = $props->fetch()) {
    $code = $prop['CODE'];
    $byXml[$code] = [];
    $byId[$code] = [];

    $enums = PropertyEnumerationTable::getList([
        'filter' => ['PROPERTY_ID' => $prop['ID']],
    ]);
    while ($item = $enums->fetch()) {
        $byXml[$code][$item['XML_ID']] = $item['ID'];
        $byId[$code][$item['ID']] = $item['XML_ID'];
    }
}

Пример структуры

// $byXml['type']['price-drop'] === 47
// $byId['type'][47] === 'price-drop'

Итог

PropertyEnumerationTable даёт единообразный ORM-доступ к спискам, а двойная карта ускоряет импорты и обмены, где внешний мир оперирует XML_ID, а ядро — числовыми ID.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии