Как отсортировать категории каталога в битриксе по произвольным полям и вывести их на странице?

Как можно выбрать элементы каталога с отмеченным чекбоксом UF_SHOW_ON_MP и отсортировать их по значению поля UF_SORT_ON_MP при использовании компонента bitrix:catalog.section.list? Текущий код приводит к получению только категорий первого уровня и не сортирует их.
  • 13 декабря 2023 г. 15:17
Ответы на вопрос 2
Чтобы отсортировать категории каталога в Битриксе по произвольным полям и вывести их на странице, вам потребуется изменить настройки компонента bitrix:catalog.section.list и добавить свою сортировку. 

Вот пример кода, который позволит вам выбирать и сортировать категории с помощью указанных полей:

```php
$arParams["SECTION_SORT_FIELD"] = "UF_SORT_ON_MP"; // поле для сортировки
$arParams["SECTION_SORT_ORDER"] = "ASC"; // направление сортировки

$arParams["SECTION_USER_FIELDS"][] = "UF_SHOW_ON_MP"; // добавляем поле в список выборки

$arFilter = array(
    "IBLOCK_ID" => $arParams["IBLOCK_ID"],
    "ACTIVE" => "Y",
    "GLOBAL_ACTIVE" => "Y",
);

if ($arParams["SECTION_ID"] > 0) {
    $arFilter["ID"] = $arParams["SECTION_ID"];
} else {
    $arFilter["DEPTH_LEVEL"] = $arParams["SECTION_DEPTH"];
}

// добавляем фильтр по полю UF_SHOW_ON_MP
$arFilter["UF_SHOW_ON_MP"] = 1;

$arSelect = array_merge($arParams["SECTION_FIELDS"], $arParams["SECTION_USER_FIELDS"]);

$arOrder = array(
    $arParams["SECTION_SORT_FIELD"] => $arParams["SECTION_SORT_ORDER"],
);

$rsSections = CIBlockSection::GetList($arOrder, $arFilter, false, $arSelect);
while ($arSection = $rsSections->GetNext()) {
    // выводить категорию на странице
}
```

Вы можете добавить этот код в обработчик события OnPrepareComponentParams, чтобы он выполнялся перед вызовом компонента bitrix:catalog.section.list:
```php
$arParams["SECTION_SORT_FIELD"] = "UF_SORT_ON_MP";
$arParams["SECTION_SORT_ORDER"] = "ASC";
$arParams["SECTION_USER_FIELDS"][] = "UF_SHOW_ON_MP";
```

Затем обновите настройки компонента bitrix:catalog.section.list, чтобы использовать новые параметры:

```php
Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'main',
    'OnPrepareComponentParams',
    function (&$arParams, &$arResult) {
        $arParams["SECTION_SORT_FIELD"] = "UF_SORT_ON_MP";
        $arParams["SECTION_SORT_ORDER"] = "ASC";
        $arParams["SECTION_USER_FIELDS"][] = "UF_SHOW_ON_MP";
    }
);
```

Помимо этого, нужно также указать параметры сортировки и фильтрации в компоненте bitrix:catalog.section.list:
```html
<bitrix:catalog.section.list 
    // ...
    ORDER_BY="$arParams[SECTION_SORT_FIELD]" 
    ORDER="$arParams[SECTION_SORT_ORDER]" 
    // ...
>
</bitrix:catalog.section.list>
```

Надеюсь, эта информация будет полезной для вас!
В общем, не знаю, насколько правильно с точки зрения разработки на Битрикс, но сделал сортировку так. 
В файл result_modifier.php скопированного в шаблон сайта компонента catalog.section.list добавил функцию сортировки массива
Похожие вопросы