Сортировка элементов каталога
Задача
Вывести ссылки для сортировки элементов каталога и сами элементы каталога отсортированные в нужном порядке.
Решение
PHP
Перед компонентом вывода элементов каталога (bitrix:catalog.section) разместим вывод пунктов для сортировки
<?
// массив полей сортировки
$arSort = [
'default' => [
'BX_FIELD_CODE' => 'CATALOG_PRICE_'.PRICE_BASE_ID,
'TITLE' => 'по цене',
'ORDER' => 'DESC',
],
'price' => [
'BX_FIELD_CODE' => 'CATALOG_PRICE_'.PRICE_BASE_ID,
'TITLE' => 'по цене',
'ORDER' => 'ASC',
],
'name' => [
'BX_FIELD_CODE' => 'NAME',
'TITLE' => 'по названию',
'ORDER' => 'ASC',
],
];
// получим текущую сортировку
$request = \Bitrix\Main\Application::getInstance()->getContext()->getRequest();
$currentSort = $request->getQuery('sort');
// если пуст параметр сортировки или в массиве сортировок нет переданной, то применим сортировку по умолчанию
if ( !($currentSort && isset($arSort[$currentSort])) ) {
$currentSort = 'default';
}
// получим направление сортировки
$order = $request->getQuery('order');
if($arSort[$currentSort]['ORDER'] === $order) {
$arSort[$currentSort]['ORDER'] = ($arSort[$currentSort]['ORDER'] === 'ASC') ? 'DESC' : 'ASC';
}
// переопределим настройки сортировки для передачи в компонент
$arParams["ELEMENT_SORT_FIELD"] = $arSort[$currentSort]['BX_FIELD_CODE'];
$arParams["ELEMENT_SORT_ORDER"] = ($arSort[$currentSort]['ORDER'] === 'ASC') ? 'DESC' : 'ASC';
?>
<div class="sort">Сортировать:
<? foreach ($arSort as $key => $sort) :
if($key === 'default') { continue; } ?>
<a href="<?echo $APPLICATION->GetCurPageParam("sort={$key}&order={$sort['ORDER']}", array(
"sort",
"order",
));?>" class="<?=($key === $currentSort) ? 'active' : ''?> "><?=$sort['TITLE']?></a>
<? endforeach; ?>
</div>