В 1C-Bitrix для фильтрации разделов по свойствам товаров, находящихся в этих разделах, можно использовать следующий алгоритм:
- Получите список всех разделов, которые нужно отфильтровать. Для этого можно воспользоваться методом
CIBlockSection::GetList()
и передать нужные параметры фильтрации, например,IBLOCK_ID
для указания инфоблока, иSECTION_ID
для указания родительского раздела.
- Для каждого раздела из полученного списка, получите список товаров, находящихся в этом разделе. Для этого можно использовать метод
CIBlockElement::GetList()
и передать параметры фильтрации, например,IBLOCK_ID
для указания инфоблока,SECTION_ID
для указания раздела, и т.д.
- Для каждого товара из полученного списка, проверьте значение нужного свойства. Для этого можно использовать метод
CIBlockElement::GetProperty()
и передать параметры, такие какIBLOCK_ID
,ID
товара и код свойства.
- Если значение свойства соответствует заданным условиям, то добавьте соответствующий раздел в новый список разделов, удовлетворяющих условиям фильтрации.
- По завершении цикла обработки товаров, у вас будет получен список разделов, отфильтрованных по свойству товара.
Пример кода, реализующего эту задачу, может выглядеть следующим образом:
$filteredSections = []; $sectionList = CIBlockSection::GetList( [], ["IBLOCK_ID" => $iblockId, "SECTION_ID" => $parentSectionId] ); while ($section = $sectionList->GetNext()) { $productList = CIBlockElement::GetList( [], ["IBLOCK_ID" => $iblockId, "SECTION_ID" => $section["ID"]] ); while ($product = $productList->GetNext()) { $propertyValue = CIBlockElement::GetProperty( $iblockId, $product["ID"], [], ["CODE" => $propertyCode] ); if ($propertyValue = $propertyFilterValue) { $filteredSections[] = $section; break; } } }
Не забывайте заменить $iblockId
, $parentSectionId
, $propertyCode
и $propertyFilterValue
на соответствующие значения из вашей системы.
В итоге, в переменной $filteredSections
будут содержаться только те разделы, у которых находятся товары с нужным свойством, удовлетворяющим условиям фильтрации.