1С-Битрикс. Сквозная сортировка свойств в компоненте catalog.smart.filter
Свойства, которые выводит catalog.smart.filter можно сортировать по полю SORT, которое заполнено у каждого свойства в настройках инфоблока. А что если это торговый каталог SKU и у торговых предложений есть свои свойства, которые тоже участвую в фильтрации?
Пример
Есть такая структура:
Основной каталог товаров:
— Свойство 1 (SORT 100)
— Свойство 2 (SORT 110)
— Свойство 3 (SORT 140)
Каталог торговых предложений:
— Свойство 4 (SORT 120)
— Свойство 5 (SORT 130)
По идее и логике, свойства 4 и 5 должны идти за свойством 2. Но не тут то было.
Свойства торговых предложений будут добавлены в самый конец, то есть после всех свойств обычного инфоблока.
Это можно поправить следующем кодом, добавленным в result_modifier.php шаблона:
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); // {{{ Сквозная пересортировка свойств каталога и свойст SKU на основе поля SORT $arItemsProps = array(); foreach($arResult["ITEMS"] as $prop){ if(!isset($arItemsProps[$prop['IBLOCK_ID']])) $arItemsProps[$prop['IBLOCK_ID']] = array(); if(!empty($prop['VALUES'])){ $arItemsProps[$prop['IBLOCK_ID']][] = $prop['ID']; } } $arIblockProps = array(); foreach($arItemsProps as $arItemsPropIblockId => $arItemsPropIds){ $propsIds = array_flip($arItemsPropIds); $res = CIBlock::GetProperties($arItemsPropIblockId, Array(), Array()); while($arRes = $res->Fetch()){ if(isset($propsIds[$arRes['ID']])){ $arIblockProps[$arRes['ID']] = $arRes['SORT']; } } } if(!empty($arIblockProps)){ asort($arIblockProps); usort($arResult["ITEMS"], function($a, $b) use ($arIblockProps) { if($arIblockProps[$a['ID']] == $arIblockProps[$b['ID']]){ return 0; } return ($arIblockProps[$a['ID']] < $arIblockProps[$b['ID']]) ? -1 : 1; }); } // }}}
2 комментария
Спасибо. Долго искал данное решение. Не смотря на то что коду уже 6 лет, всё отлично работает.
Спасибо огромное! Присоединяюсь к автору предыдущего комментария! Отлично работает код так, как нужно.