Сортировать товары по названию, цене и свойствам в каталоге 1С-Битрикс
Задача: реализовать возможность сортировки товаров в разделах каталога. Сортировка должна работать с использованием AJAX. В качестве параметров сортировки используются: по алфавиту, по цене, по новизне, просмотрам и по брендам.
В файле section.php комплексного шаблона каталога, до вывода bitrix:catalog.section добавляем:
Этот код отображает форму с элементом select для выбора способа сортировки элементов на странице. Форма отправляется методом POST на адрес /local/ajax/sort.php, когда пользователь выбирает один из вариантов сортировки.
Атрибут name элемента select имеет значение sortten, что указывает на то, что выбранный вариант сортировки будет передан на сервер с помощью POST-запроса в виде массива $_POST[‘sortten’].
Для каждого варианта сортировки определено свое значение атрибута value, которое соответствует выбранному пользователем варианту. Также в каждой опции используется PHP-код для проверки значения куки ‘sortten’, хранящей выбранный пользователем вариант сортировки. Если значение куки равно значению атрибута value текущей опции, то устанавливается атрибут selected, чтобы эта опция была выбрана по умолчанию.
Таким образом, при отправке формы методом POST на сервер будет передано значение выбранного варианта сортировки в виде массива $_POST[‘sortten’]. Значение куки ‘sortten’ будет обновлено на сервере в соответствии с выбранным пользователем вариантом сортировки.
Отправка формы с ajax, без кнопки отправки
Здесь же, в section.php или в подключаемом js файле (рекомендую), добавляем javascript код. Обратите внимаение, что в нем используется jquery — не забудте его подключить
$(".sortline").change(function (event) < event.preventDefault(); var form = $(this).closest('form')[0]; var formData = new FormData(form); $('body').addClass('loading_body'); $.ajax(< url: form.action, type: form.method, data: formData, processData: false, contentType: false, success: function (response) < location.reload(); >, error: function () < console.log("Произошла ошибка при отправке запроса."); >>); >);
Этот код реализует функцию, которая выполняется при изменении элемента с классом «sortline». Когда происходит изменение, функция отправляет AJAX-запрос на сервер с данными из формы, содержащей элемент с классом «sortline».
Затем данные формы обрабатываются объектом FormData, который позволяет удобно собирать данные формы и отправлять их в виде multipart/form-data.
После этого происходит отправка AJAX-запроса с помощью функции $.ajax(), где указывается адрес url и метод type запроса, а также данные formData.
Если запрос успешен, то функция обновляет обновляет страницу в текщем уровне прокрутки. На время отправки запроса для элемента body добавляется class ‘loading_body’, что бы можно было стилизовать его на время отправки запроса.
Запись в COOKIE данных из формы
В деректории «/local/ajax/» создаем файл sort.php c содержимым:
function process_form_data($data) < // Обработка данных формы if (empty($data['sortten'])) < return false; >return $data['sortten']; > function set_cookie($name, $value, $expire = 0) < // Установка куки setcookie($name, $value, $expire, '/', '', false, true); >// Обработка данных формы if ($_SERVER['REQUEST_METHOD'] === 'POST') < $sortten = process_form_data($_POST); if ($sortten !== false) < set_cookie('sortten', $sortten); >>
Этот код выполняет следующие действия:
- Определяется функция process_form_data, которая принимает данные формы в качестве аргумента $data.
- Функция проверяет, содержит ли массив $data ключ ‘sortten’, и если нет, то возвращает false.
- Если ключ ‘sortten’ присутствует в массиве $data, то функция возвращает его значение.
- Определяется функция set_cookie, которая принимает имя куки $name, значение $value и необязательный срок истечения действия куки $expire.
- Функция set_cookie вызывает функцию setcookie() для установки куки с заданным именем, значением и сроком истечения.
Если метод запроса на сервер является POST ($_SERVER[‘REQUEST_METHOD’] === ‘POST’), то выполняется следующее:
- вызывается функция process_form_data с массивом данных формы $_POST в качестве аргумента;
- если функция process_form_data возвращает не false, то вызывается функция set_cookie для установки куки с именем ‘sortten’ и значением, возвращенным функцией process_form_data.
Собственно, дело осталось за малым: нужно добавить параметры сортировки из установленных COOKIE
'0') < $sort = $_COOKIE['sortten']; >else < $sort = $arParams["ELEMENT_SORT_FIELD"]; >$intSectionID = $APPLICATION->IncludeComponent( "bitrix:catalog.section", "section", array( //. сокращен catalog.section "ELEMENT_SORT_FIELD" => $sort, "ELEMENT_SORT_ORDER" => ($_COOKIE['sortten'] === 'show_counter') ? 'desc' : 'asc', //. сокращен catalog.section ), $component ); ?>
Если сортировка еще не выбиралась, значит в COOKIE нет ключа [‘sortten’], тогда используем сортировку из настроек компонента. Если ключ есть, используем параметр сортировки из него.
Обратите внимение: направление для сортировки по просмотрам перевернуто («по убыванию»), так что бы более просматриваемые товары были в начале. Для остальных сортировок используется параметр «по возрастанию»
Михаил Базаров 22.04.2023
Сортировку можно произвести по стандартным полям, для чего можно воспользоваться приведенным ниже списком:
id — ID элемента;
sort — индекс сортировки;
timestamp_x — дата изменения;
name — название;
active_from или date_active_from — начало периода действия элемента;
active_to или date_active_to — окончание периода действия элемента;
status — код статуса элемента в документообороте;
code — мнемонический код элемента;
iblock_id — числовой код информационного блока;
modified_by — код последнего изменившего пользователя;
active — признак активности элемента;
show_counter — количество показов элемента (учитывается функцией CIBlockElement::CounterInc);
show_counter_start — время первого показа элемента (учитывается функцией CIBlockElement::CounterInc);
shows — усредненное количество показов (количество показов / продолжительность показа);
rand — случайный порядок;
xml_id или external_id — внешний код;
tags — теги;
created — время создания;
created_date — дата создания без учета времени;
cnt — количество элементов (только при заданной группировке)
SCALED_PRICE_ — по ID типа цены
Гость 01.08.2023
А есть ли статья по сортировке категорий по алфавиту()?
Ни одной статьи и адекватного ответа не попалось.
Михаил Базаров 01.08.2023
Если выводите разделы компонентом catalog.section.list можете передать ему параметр
CUSTOM_SECTION_SORT в котором массив из правил сортировки для метода CIBlockSection::GetList.
Что-то вроде этого:
'CUSTOM_SECTION_SORT' => array ( 'NAME' => 'ASC' )
Это есть в документации к catalog.section.list
Если что-то другое имели ввиду, нужен более развернутый вопрос.
Мои видео на Boosty:
Поделиться страницей:
Сортировка товаров в каталоге Bitrix

1С-Битрикс
Задача: Сортировать торговый каталог Битрикс по цене, свойству и имени
Сортировка — базовая штука в каталоге, однако, чтобы реализовать ее хорошо — придется немного подумать.
В интернете масса вариантов сортировки каталога на битриксе, но вот только некоторые варианты достойны внимания, остальное все — полная чушь, поэтому и было принято решение записать тут вариант, чтобы не искать его по всему интернету.
Итак, в section.php комплексного компонента «каталог» пишем:
if( isset($_GET["sort"]) && isset($_GET["method"]) && ( $_GET["sort"] == "name" || $_GET["sort"] == "catalog_PRICE_1" || $_GET["sort"] == "property_NOVINKA") )
В строке перебора будет столько условий, сколько у вас сортировок, у меня сортировка идет по имени, цене и свойству — «НОВИНКА».
Для сортировки по цене необходимо в поле дописать ID цены, в моем случае — 1, однако бывает по разному — обратите на это внимание!
Теперь формируем список:
Тут 2 важных момента:
1. Для определения текущего элемента в списке будем использовать класс «active»,чтобы это сделать — пишем условие типа
2. Для того, чтобы ссылки формировались правильно и учитывались GET параметры, нам необходимо воспользоваться битриксовым методом GetCurPageParam() .
Как отсортировать товары в каталоге?
Текущую редакцию Вашего 1С-Битрикс можно просмотреть на странице Обновление платформы ( Marketplace > Обновление платформы ).
Ограничений нет
Сортировка по-умолчанию
Чтобы настроить сортировку товаров в нужном вам порядке, необходимо перейти в административную часть сайта.

Контент -> Каталог -> Основной каталог товаров -> Элемент. В карточке элемента необходимо назначить номер сортировки. Номер сортировки можно внести внутри элемента, а также с помощью быстрого редактирования, в общем списке элементов.
Сортировка по цене
Чтобы отсортировать товары по цене необходимо включить режим правки в публичной части сайта.
Наведите курсор мыши на изменяемый элемент и нажмите на всплывающую иконку «Шестеренка».
Во всплывающем окне параметры компонента выберите раздел «Настройки списка». В первом поле «По какому полю сортируем товары в разделе» выберите вариант — (другое), во втором поле пропишите: property_PRICE, в поле «Порядок сортировки товаров в разделе» выберите вариант — по возрастанию.
После внесения изменений сохраните настройки.
Пользовательские комментарии
Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.
Для этого нужно всего лишь авторизоваться на сайте
Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.
Также Пользовательские комментарии не являются местом для обсуждения функционала.
ООО «Некстайп» 2022 © Все права защищены
Сортировка по наличию товара
До сих пор в ядре CMS 1C-Битрикс не добавлена возможность сортировки по наличию товара на складе, т.е. не по количеству, а по наличию — факту того если ли товар на складе или он отсутствует. Пока на просьбу клиента, чтобы при любой сортировке выдачи каталога товаров те товары, которых нет на складе были в конце списка приходится решать с помощью нижепредставленного велосипеда. 1. Нужно создать свойство в информационном блоке, где должна быть такая фильтрация — IS_AVAILABLE . Это свойство можно сделать просто символьного типа. Оно у нас будет принимать всего 2 значения: 0 — если товара нет на складе, 1- если товар есть на складе.
2. Нужно сделать так, чтобы при заведении нового товара или обновлении старого товара свойство IS_AVAILABLE автоматически обновлялось. Этого можно добиться, добавив такой код в файл /bitrix/php_interface/init.php (либо в файл /bitrix/php_interface/Ваш_идентификатор_сайта/init.php при использовании многосайтовости) .
AddEventHandler("catalog", "OnBeforeProductAdd", "OnBeforeIBlockElement"); AddEventHandler("catalog", "OnBeforeProductUpdate", "OnBeforeIBlockElement"); function OnBeforeIBlockElement($ID, $arFields = false) < if(is_array($ID)) < $arFields = $ID; $IS_AVAILABLE = $arFields["QUANTITY"] >0? 1: 0; $ELEMENT_ID = $arFields["ID"]; CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, false, array("IS_AVAILABLE" => $IS_AVAILABLE)); > elseif(is_int($ID) && is_array($arFields) && isset($arFields["QUANTITY"])) < $IS_AVAILABLE = $arFields["QUANTITY"] >0? 1: 0; $ELEMENT_ID = $ID; CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, false, array("IS_AVAILABLE" => $IS_AVAILABLE)); > >
3. Нужно добавить сортировку в компонент bitrix:catalog.section и поставить ее первой. Сортировка должна быть по PROPERTY_IS_AVAILABLE , направление DESC.
4. Если у вас уже есть записанные товары и вы не хотите их пересохранять вручную, чтобы свойство перезаписалось, то нужно запустить примерно такой скрипт:
1); $res = CIBlockElement::GetList(Array(), $arFilter, false, Array("nPageSize"=>10000000), $arSelect); while($ob = $res->GetNext()) < $IS_AVAILABLE = $ob["CATALOG_QUANTITY"] >0? 1: 0; $ELEMENT_ID = $ob["ID"]; CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, false, array("IS_AVAILABLE" => $IS_AVAILABLE)); > ?>
В этом скрипте вам нужно заменить в $arFilter = Array(«IBLOCK_ID»=>1); идентификатор инфоблока, на тот, который должен быть у вас.
После этого у вас должна заработать эта сортировка.
