Битрикс

Фильтрация по пользовательским свойствам getList на D7

Когда-то давно разработчики Битрикс обещали лёгкую выборку пользовательских свойств из инфоблка на «новом ядре D7». Много времени прошла. Новое ядро уже не такое уж и новое, а подвижек в этом вопросе всё нет.

Всё-таки выход есть

Для того, что бы выбрать пользовательские свойства инфоблока или же отфильтровать по ним — нужно прилинковать таблицу с пользовательскими свойствами к запросу.

Вот как это может выглядеть для инфоблока, хранящего свои свойства в отдельной таблице:

 

$entityPropsSingle = Bitrix\Main\Entity\Base::compileEntity(
    sprintf('PROPS_SINGLE_%s', CATALOG_IBLOCK_ID),
    [
        'IBLOCK_ELEMENT_ID' => ['data_type' => 'integer'],
        'PROPERTY_1' => ['data_type' => 'float'],
        'PROPERTY_2' => ['data_type' => 'float'],
        'PROPERTY_3' => ['data_type' => 'float'],
    ],
    [
        'table_name' => sprintf('b_iblock_element_prop_s%s', CATALOG_IBLOCK_ID),
    ]
);

Далее дёргаем эти свойства через runtime. Примерно вот так:

 

$elementsIterator = ElementTable::getList([
    'select' => [
        'ID',
        'PROPS_SINGLE.PROPERTY_1',
        'PROPS_SINGLE.PROPERTY_2',
        'PROPS_SINGLE.PROPERTY_3',
    ],
    'filter' => [
        'IBLOCK_ID' => CATALOG_IBLOCK_ID,
        'PROPS_SINGLE.PROPERTY_1' => 10,
    ],
    'order' => [
        'available' => 'DESC',
        'price' => 'ASC',
    ],
    'limit' => $limit,
    'offset' => $offset,
    'runtime' => [
        'PROPS_SINGLE' => [
            'data_type' => $entityPropsSingle->getDataClass(),
            'reference' => [
                '=this.ID' => 'ref.IBLOCK_ELEMENT_ID'
            ],
            'join_type' => 'left'
        ],
    ],
]);

print_r($elementsIterator->fetchAll());

Кое-что из происходящего описано в официальной документации. В целом getList на D7 удобная вещь, если работать со стандартными полями. Но и с пользовательские можно укротить без особых усилий.

Такой способ выборки подходит и для SectionTable, и для UserTable, и для любой другой сущности. Прилинковывать можно не только таблицу свойств, но и другу. Например в к тому-же ElementTable можно прилинковать таблицу с ценами каталога и работать с ними в выборке, фильтрации и т.д.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *