Фильтрация товаров по свойствам торговых предложений (SKU)

December 12, 2014

При разработке одного крупного магазина была поставлена задача: Необходимо было вывести на главной странице "Новинки", "Товары по "Акции", "Скоро в продаже". В стандартном окружении Битрикса нельзя сделать фильтр по торговым предложениям. Сортировку сделать можно, фильтр нельзя. После суток общения с тех поддержкой, понял, самому сделать быстрее и, как оказалось в итоге, довольно банально и просто.

Теперь по порядку.

Новинки


Для вывода всех трех блоков я использую обычный bitrix:catalog.section.

Привожу ПРИМЕР компонента. Часть параметров вырезал, ибо там много левого ненужного нам барахла.

IncludeComponent(
"bitrix:catalog.section",
"",
Array(
"IBLOCK_TYPE" => "catalog",
"IBLOCK_ID" => "4",
"SECTION_CODE" => $_REQUEST["SECTION_CODE"],

"ELEMENT_SORT_FIELD" => "sort",
"ELEMENT_SORT_ORDER" => "asc",
"ELEMENT_SORT_FIELD2" => "id",
"ELEMENT_SORT_ORDER2" => "desc",
"FILTER_NAME" => "arrFilter",
"INCLUDE_SUBSECTIONS" => "Y",
"SHOW_ALL_WO_SECTION" => "Y",
"HIDE_NOT_AVAILABLE" => "Y",
"PAGE_ELEMENT_COUNT" => "5",
"LINE_ELEMENT_COUNT" => "3",

"OFFERS_LIMIT" => "1",

"SECTION_URL" => "#SITE_DIR#/#SECTION_CODE_PATH#",
"DETAIL_URL" => "#SITE_DIR#/#SECTION_CODE_PATH#/#ELEMENT_CODE#",
"SECTION_ID_VARIABLE" => "SECTION_ID",
"AJAX_MODE" => "N",
"AJAX_OPTION_JUMP" => "N",
"AJAX_OPTION_STYLE" => "N",
"AJAX_OPTION_HISTORY" => "N",
"CACHE_TYPE" => "A",
"CACHE_TIME" => "36000000",
"CACHE_GROUPS" => "Y",

"CACHE_FILTER" => "N",
"ACTION_VARIABLE" => "action",
"PRODUCT_ID_VARIABLE" => "id",
"PRICE_CODE" => array("BASE"),

"USE_PRODUCT_QUANTITY" => "Y",
"ADD_PROPERTIES_TO_BASKET" => "Y",

"ADD_TO_BASKET_ACTION" => "ADD",
"DISPLAY_COMPARE" => "Y",

"OFFERS_SORT_FIELD" => "sort",
"OFFERS_SORT_ORDER" => "asc",
"OFFERS_SORT_FIELD2" => "id",
"OFFERS_SORT_ORDER2" => "desc",
"PRODUCT_DISPLAY_MODE" => "Y",

"CURRENCY_ID" => "RUB",
"PRODUCT_QUANTITY_VARIABLE" => "quantity",
"COMPARE_PATH" => "compare"
)
);?>


Первым делом сортируем товарные предложения как вам нужно. В моем случае это "индекс сортировки".

"OFFERS_SORT_FIELD" => "sort",
"OFFERS_SORT_ORDER" => "asc",
"OFFERS_SORT_FIELD2" => "id",
"OFFERS_SORT_ORDER2" => "desc",

Далее указываем, что нам достаточно только 1 торгового предложения на 1 основной товар

"OFFERS_LIMIT" => "1",

А далее начинается веселье. Далее не зависимо от параметра "Скрывать недоступные для заказа товары", отображаются все товары, имеющие SKU

"HIDE_NOT_AVAILABLE" => "Y",

Тут приходится прибегнуть к хитрости. В интернете сутки искал и нашел такое решение. Объявляем переменную фильтра $arrFilter и вносим в него информацию о фильтрации по SKU:

global $arrFilter; // обязательно, иначе фильтр работать не будет
CModule::includeModule('catalog'); // В шаблонах не подключен этот модуль

$arSubQuery = ["IBLOCK_ID" => 5, ">CATALOG_QUANTITY" => 0]; // у меня IBLOCK_ID=5 это торговые предложения. Фильтрую все товары, у которых "Доступное количество" больше нуля.
$arrFilter = ['ID' => CIBlockElement::SubQuery('PROPERTY_CML2_LINK', $arSubQuery) ];// Делаю подзапрос


Готово. Фильтр сделал свое дело и вы легко и просто можете сделать оставшиеся два пункта - "акции", "скоро в продаже".

Акции


У торговых предложений создаем свойство "Акция", тип список, символьный код = AKCIA. В дополнительных настройках укажите вид = "Флажки" и введите одно значение "Да".
Перейдите в список торговых предложений и укажите у нескольких товаров галочку "Акция".
Затем переходите в код страницы, где необходимо разместить блок акций. Вставляете все тот же компонент bitrix:catalog.section, настраиваете его как настраивали выше. Далее необходимо нам снова прибегнуть к фильтру

global $arrFilter; // обязательно, иначе фильтр работать не будет
CModule::includeModule('catalog'); // В шаблонах не подключен этот модуль

$arSubQuery = ["IBLOCK_ID" => 5, "PROPERTY_AKCIA_VALUE" => "Да"]; // Фильтрую все товары, у которых стоит галочка "Акция"
$arrFilter = ['ID' => CIBlockElement::SubQuery('PROPERTY_CML2_LINK', $arSubQuery) ];// Делаю подзапрос

Скоро в продаже


У торговых предложений создаем свойство "Скоро в продаже", тип список, символьный код = COMINGSOON. В дополнительных настройках укажите вид = "Флажки" и введите одно значение "Да". Создайте еще одно свойство "Дата ожидания продаж", тип Дата, символьный код = COMINGSOONDATE.

Перейдите в список торговых предложений и укажите у нескольких товаров галочку "Скоро в продаже", укажите предполагаемую дату начала продаж.

Затем переходите в код страницы, где необходимо разместить блок акций. Вставляете все тот же компонент bitrix:catalog.section, настраиваете его как настраивали выше. Далее необходимо нам снова прибегнуть к фильтру

global $arrFilter; // обязательно, иначе фильтр работать не будет
CModule::includeModule('catalog'); // В шаблонах не подключен этот модуль

$arSubQuery = ["IBLOCK_ID" => 5, "PROPERTY_COMINGSOON_VALUE" => "Да"]; // Фильтрую все товары, у которых стоит галочка "Скоро в продаже"
$arrFilter = ['ID' => CIBlockElement::SubQuery('PROPERTY_CML2_LINK', $arSubQuery) ];// Делаю подзапрос


В настройках компонента поставьте сортировку по дате ожидаемого поступления.

Комментарии

comments powered by Disqus