1С Битрикс: создание фильтра товаров, сортировка товаров по скидке, по названию, по цене
Задача: создать фильтр, в котором будут выводится товары со скидкой, ниже товары без скидки. А также будет сортировка цены по возрастанию и убыванию, по названию в алфавитном порядке и обратном. Также будет фильтрация по популярности (просто рандомная фильтрация).
1. Создание формы с выбором значений для фильтрации товаров в 1С Bitrix
Для начала создадим саму форму, для выбора значений фильтрации. Для этой цели подойдет простейший select. Но проблема в том, что для тегов option сложно задать определенные отступы и стили, и поэтому можно сделать выбор значений используя обычный список, и доработав его стилями и скриптом подменять нужное значение.
Там где у нас находится каталог в файле section_horizontal.php (может и быть section_vertical.php, зависит от настроек компонента) добавляем следующий код, который задает параметры сортировки:
// здесь задаются параметры сортировки
if ($_GET["sort"] === "price") $arParams["ELEMENT_SORT_FIELD"] = "catalog_PRICE_1";
if ($_GET["order"] === "up") $arParams["ELEMENT_SORT_ORDER"] = "asc";
if ($_GET["order"] === "down") $arParams["ELEMENT_SORT_ORDER"] = "desc";
if ($_GET["sort"] === "name") $arParams["ELEMENT_SORT_FIELD"] = "NAME";
if ($_GET["order"] === "asc") $arParams["ELEMENT_SORT_ORDER"] = "asc";
if ($_GET["order"] === "desc") $arParams["ELEMENT_SORT_ORDER"] = "desc";
if ($_GET["order"] === "popular") $arParams["ELEMENT_SORT_FIELD"] = "rand";
if ($_GET["order"] === "sale"){
// эта функция сортировки по скидке, класс находится в /local/php_interface/init.php
$res = AllProductDiscount::getFull(
array("ACTIVE" => "Y", "SITE_ID" => SITE_ID),
array()
);
foreach($res['IDS'] as $ID) {
$sale_id[] = $ID;
}
$GLOBALS['arrFilter'] = array("ID"=>$sale_id);
}
Далее уже подключаем форму, в которой задаются и отправляются все параметры сортировки, а также подключаем стили, скрипты.
<link rel="stylesheet" type="text/css" href="<?=SITE_TEMPLATE_PATH?>/css/generic.css" />
<div class="select">
<input class="select__input" type="hidden" name="">
<div class="select__head">
<? if (isset($_GET["sort"]) && !empty($_GET["sort"])) {
if($_GET["order"]==="up"){?>
По возрастанию цены
<?}elseif($_GET["order"]==="down"){?>
По убыванию цены
<?}elseif($_GET["sort"] == "name"){?>
<?if($_GET["order"]==="asc"){?>
По алфавиту А-Я
<?}elseif($_GET["order"]==="desc"){?>
По алфавиту Я-А
<?}elseif($_GET["order"]==="popular"){?>
Популярности
<?}elseif($_GET["order"]==="sale"){?>
Со скидкой
<?}?>
<?
}
}else{?>
Популярности
<?}?>
</div>
<ul class="select__list" style="display: none;">
<? if (isset($_GET["sort"]) && !empty($_GET["sort"])) {
if($_GET["order"]==="up"){?>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=price&order=up">По возрастанию цены</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=price&order=down">По убыванию цены</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=sale">Со скидкой</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=popular">Популярности</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=desc">По алфавиту Я-А</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=asc">По алфавиту А-Я</li>
<?}elseif($_GET["order"]==="down"){?>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=price&order=down">По убыванию цены</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=price&order=up">По возрастанию цены</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=sale">Со скидкой</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=popular">Популярности</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=desc">По алфавиту Я-А</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=asc">По алфавиту А-Я</li>
<?}elseif($_GET["sort"] == "name"){?>
<?if($_GET["order"]==="asc"){?>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=asc">По алфавиту А-Я</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=desc">По алфавиту Я-А</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=popular">Популярности</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=price&order=up">По возрастанию цены</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=price&order=down">По убыванию цены</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=sale">Со скидкой</li>
<?}elseif($_GET["order"]==="desc"){?>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=desc">По алфавиту Я-А</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=asc">По алфавиту А-Я</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=popular">Популярности</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=price&order=up">По возрастанию цены</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=price&order=down">По убыванию цены</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=sale">Со скидкой</li>
<?}elseif($_GET["order"]==="popular"){?>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=popular">Популярности</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=desc">По алфавиту Я-А</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=asc">По алфавиту А-Я</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=price&order=up">По возрастанию цены</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=price&order=down">По убыванию цены</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=sale">Со скидкой</li>
<?}elseif($_GET["order"]==="sale"){?>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=sale">Со скидкой</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=popular">Популярности</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=desc">По алфавиту Я-А</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=asc">По алфавиту А-Я</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=price&order=up">По возрастанию цены</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=price&order=down">По убыванию цены</li>
<?}?>
<?
}
}else{?>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=popular">Популярности</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=price&order=up">По возрастанию цены</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=price&order=down">По убыванию цены</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=sale">Со скидкой</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=asc">По алфавиту А-Я</li>
<li class="select__item" data-url="<?=$arResult["SECTION_PAGE_URL"]?>?sort=name&order=desc">По алфавиту Я-А</li>
<?}?>
</ul>
</div>
Да код не претендует на мега вау, зато работает как нужно.
Также добавляем скрипт, который будет открывать наш стилизированный "select", список значений для фильтрации.
jQuery(($) => {
$('.select').on('click', '.select__head', function () {
if ($(this).hasClass('open')) {
$(this).removeClass('open');
$(this).next().fadeOut();
} else {
$('.select__head').removeClass('open');
$('.select__list').fadeOut();
$(this).addClass('open');
$(this).next().fadeIn();
}
});
$('.select').on('click', '.select__item', function () {
$('.select__head').removeClass('open');
$(this).parent().fadeOut();
$(this).parent().prev().text($(this).text());
$(this).parent().prev().prev().val($(this).text());
//здесь происходит переход по ссылке, чтобы сразу фильтр срабатывал
window.location.href = $(this).context.dataset.url;
console.log($(this).context.dataset.url);
});
$(document).click(function (e) {
if (!$(e.target).closest('.select').length) {
$('.select__head').removeClass('open');
$('.select__list').fadeOut();
}
});
});
В папку шаблона добавляем папку css добавляем файл generic.css, файл будет в архиве.
Также проверяем параметры компонента, чтобы обязательно были следующие параметры:
"ELEMENT_SORT_FIELD" => $arParams["ELEMENT_SORT_FIELD"], "ELEMENT_SORT_ORDER" => $arParams["ELEMENT_SORT_ORDER"],
Далее уже идет запуск компонента "bitrix:catalog.section","". То есть шаблон у меня находится в папке /local/ и кастомизирован. Но если и используется шаблон по умолчанию, то тоже должно все прекрасно работать.
И также в файле section_horizontal.php добавим следующий код, который будет при фильтре со скидкой, выводить ниже отфильтрованных товаров скидкой, товары без скидки.
if ($_GET["order"] === "sale"){
// эта функция сортировки по скидке, класс находится в /local/php_interface/init.php
$res = AllProductDiscount::getFull(
array("ACTIVE" => "Y", "SITE_ID" => SITE_ID),
array()
);
foreach($res['IDS'] as $ID) {
$sale_id[] = $ID;
}
$sect_params["ADD_SECTIONS_CHAIN"] = "N";
$GLOBALS['arrFilter'] = array("!ID"=>$sale_id);
$intSectionID1 = $APPLICATION->IncludeComponent(
"bitrix:catalog.section",
"catalog_sale",
$sect_params,
$component
);
}
Функцию(точнее класс) AllProductDiscount::getFull был найден в сети интернет, поэтому не публикую здесь его, будет в архиве. Чтобы вывести товары без скидки пришлось выводить только товар один, без описания. Для этого в компоненте catalog_sale нужно убрать описание секции, например так:
if ($arParams['HIDE_SECTION_DESCRIPTION'] !== 'Y')
{
?>
<div class="bx-section-desc bx-<?=$arParams['TEMPLATE_THEME']?>">
<p style="font-weight: 600;font-size: 24px;color:#574E5D; text-align: center;" class="bx-section-desc-post"><?//=$arResult['DESCRIPTION']?></p>
</div>
<?
}
Далее в самом дефолтном компоненте catalog.section также убрать описание.
if ($arParams['HIDE_SECTION_DESCRIPTION'] !== 'Y')
{
?>
<div class="bx-section-desc bx-<?=$arParams['TEMPLATE_THEME']?>">
<p style="font-weight: 600;font-size: 24px;color:#574E5D; text-align: center;" class="bx-section-desc-post"><?if($_GET['order']==="sale"){}else echo $arResult['DESCRIPTION'];?></p>
</div>
<?
}
И таким образом можно создать сортировку со скидкой в каталоге товаров 1С Битрикс, сортировку по названию и цене в Bitrix.


Комментарии находятся на модерации или не добавлены.
Для добавления комментариев необходимо зарегистрироваться и авторизоваться
Также возможно авторизоваться через Социальную сеть Вконтакте (VK)