Фильтр товаров со скидкой каталога 1С-Битрикс

Недавно в одном проекте меня попросили реализовать в фильтре каталога 1С-Битрикс выбор товаров со скидкой и без скидки. Задача была поставлена следующим образом: владелец сайта устанавливает скидки на товары в административном разделе сайта. Ниже представлено изображение.

Для того, чтобы потенциальный покупатель мог посмотреть товары, на которые действуют установленные скидки, или же товары без скидок, в фильтре каталога должны быть предусмотрены соответствующие галочки. Стандартных способов реализовать такой функционал — нету. Поэтому пришлось прибегнуть к набору Битрикс API. Исходя из этого, путь решения выглядит так:

  1. создать свойство «Наличие скидки» в инфоблоке, который имеет отношение к каталогу товаров. Свойство должно быть множественное, с возможностью выбора одного значения из двух: «Без скидки» и «Со скидкой»;
  2. получить абсолютно все товары каталога и в свойстве «Наличие скидки» задать им значение «Без скидки»;
  3. получить товары со скидкой и в свойстве «Наличие скидки» задать им значение «Со скидкой»;
  4. автоматизировать вышеописанные действия.

Создание свойства инфоблока

С этим пунктом не должно возникнуть проблем, здесь всё довольно просто. Переходим в настройки инфоблока и во вкладке «Свойства» создаём. Указываем параметры:

  • название;
  • тип — «Список»;
  • множественное: галочку не выставляем;
  • код.

Далее нажмите на троеточие в колонке «Изменить» напротив данного свойства и проведите настройки:

  1. поставьте галочку у пункта «Показывать в умном фильтре»;
  2. выберите пункт в «Вид в умном фильтре» — «Флажки»;
  3. уберите галочку «Показать развёрнутым»;
  4. укажите «Внешний вид» — «Флажки».

Чтобы у вас появилось несколько значений для выбора укажите «Значения списка», как показано на изображении ниже.

Сохраните настройки.

Изменение свойства с помощью Bitrix Framework

Приведу следующий код, который извлекает все элементы инфоблока и проделывает действие описанное в заголовке.

if(CModule::IncludeModule("iblock") && CModule::IncludeModule("catalog")) {
 
  /* Параметры */
  $arParamsAPI = array(
      "IBLOCK" => 6,
      "SKIDKA" => array(
        "FALSE" => 1292,
        "TRUE" => 1293,
    ),
  );
 
  /* Получение всех элементов */
  $arOrder = array("SORT" => "ASC");
  $arFilter = array("IBLOCK_ID" => $arParamsAPI["IBLOCK"]);
  $arGroupBy = false;
  $arNavStartParams = false;
  $arSelectFields = array("ID","PROPERTY_SKIDKA");
 
  $GetListElement = CIBlockElement::GetList($arOrder, $arFilter, $arGroupBy, $arNavStartParams, $arSelectFields);
  while($GetListElementRow = $GetListElement->GetNextElement()) {
    $GetListElementItem = $GetListElementRow->GetFields();
    $arPrice = CCatalogProduct::GetOptimalPrice($GetListElementItem["ID"], 1, array(), "N", array(), "s2", array());
    $arResultPrice = $arPrice["RESULT_PRICE"];
 
    /* Изменение свойства */
    if($arResultPrice["BASE_PRICE"] == $arResultPrice["DISCOUNT_PRICE"]) {
      CIBlockElement::SetPropertyValues($GetListElementItem["ID"], $arParamsAPI["IBLOCK"], $arParamsAPI["SKIDKA"]["FALSE"], "SKIDKA");
    }
    else {
      CIBlockElement::SetPropertyValues($GetListElementItem["ID"], $arParamsAPI["IBLOCK"], $arParamsAPI["SKIDKA"]["TRUE"], "SKIDKA");
    }
  }
 
}

Автоматизация изменения свойства скидки

Осталось выполнить последний шаг. Поместим наш код в функцию MyUpdateFilter и будем вызывать её в момент, когда создаётся, редактируется или удаляется скидка на товары. С помощью функции AddEventHandler мы можем отслеживать эти события. Итого получившийся код имеет вид представленный ниже.

if(CModule::IncludeModule("iblock") && CModule::IncludeModule("catalog")) {
 
  AddEventHandler("catalog", "OnDiscountAdd", "MyUpdateFilter");
  AddEventHandler("catalog", "OnDiscountUpdate", "MyUpdateFilter");
  AddEventHandler("catalog", "OnDiscountDelete", "MyUpdateFilter");
 
  function MyUpdateFilter() {
    /* Параметры */
    $arParamsAPI = array(
        "IBLOCK" => 6,
        "SKIDKA" => array(
          "FALSE" => 1292,
          "TRUE" => 1293,
      ),
    );
 
    /* Получение всех элементов */
    $arOrder = array("SORT" => "ASC");
    $arFilter = array("IBLOCK_ID" => $arParamsAPI["IBLOCK"]);
    $arGroupBy = false;
    $arNavStartParams = false;
    $arSelectFields = array("ID","PROPERTY_SKIDKA");
 
    $GetListElement = CIBlockElement::GetList($arOrder, $arFilter, $arGroupBy, $arNavStartParams, $arSelectFields);
    while($GetListElementRow = $GetListElement->GetNextElement()) {
      $GetListElementItem = $GetListElementRow->GetFields();
      $arPrice = CCatalogProduct::GetOptimalPrice($GetListElementItem["ID"], 1, array(), "N", array(), "s2", array());
      $arResultPrice = $arPrice["RESULT_PRICE"];
 
      /* Изменение свойства */
      if($arResultPrice["BASE_PRICE"] == $arResultPrice["DISCOUNT_PRICE"]) {
        CIBlockElement::SetPropertyValues($GetListElementItem["ID"], $arParamsAPI["IBLOCK"], $arParamsAPI["SKIDKA"]["FALSE"], "SKIDKA");
      }
      else {
        CIBlockElement::SetPropertyValues($GetListElementItem["ID"], $arParamsAPI["IBLOCK"], $arParamsAPI["SKIDKA"]["TRUE"], "SKIDKA");
      }
    }
 
  }
}

Как видим, ничего сложного. Код получился не громоздким. Сохраните его в файле /bitrix/php_interface/init.php и можете использовать в вашем интернет-магазине.

Полезные ссылки к статье

Понравилась статья? Поделись: