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 дней гарантии