Фильтр по торговым предложениям

Задача:

Необходимо выполнить сортировку по максимальной цене покупки из торговых  предложений .

Выполнение:

Сортировка будет происходить по пользовательскому свойству , которое заранее создадим в свойствах товара ,

У меня оно названо как FILTER_PRICE

Далее реализуем автоматическое его заполнение. Для этого в init.php

AddEventHandler("iblock", "OnAfterIBlockElementUpdate", array('AutoSaverSortField', "setPrice"));
AddEventHandler("iblock", "OnAfterIBlockElementAdd", array('AutoSaverSortField', "setPrice"));

class AutoSaverSortField {
    /*
     * CATALOG_PRICE_1 - Продажа
     * CATALOG_PURCHASING_PRICE - Покупка
     */
    const NEEDLE_FIELD = "CATALOG_PURCHASING_PRICE";
    // Инфоблок с товарами 
    const GOODS_I_BLOCK = 17;
    //Id инфоблока с товарными предложениями .
    const SKU_I_BLOCK = 18;

    const GOODS_FILTER_FIELD = "FILTER_PRICE";

    public static function setPrice(&$arFields) {

        
        if ($arFields['IBLOCK_ID'] == self::GOODS_I_BLOCK) {

            /* Выбираем первое  предложения для редактируемого товара ,
             * с сортировкой от большего к меньшего , по нужному полю с ценой  */

            $res = \CIBlockElement::GetList(
                            Array(
                        self::NEEDLE_FIELD => 'DESC'
                            ), array(
                        //Поле в тороговых предложениях  с привязкой к товарам 
                        'PROPERTY_CML2_LINK' => $arFields['ID'],
                        'IBLOCK_ID' => self::SKU_I_BLOCK,
                        'ACTIVE' => "Y"
                            ), false, array('nTopCount' => '1'), array(
                        'ID',
                        'IBLOCK_ID',
                        'CATALOG_GROUP_1'
                            )
            );

            $artSku = array();
            while ($element = $res->Fetch()) {
                $artSku[] = $element;
            }
            if (!empty($artSku) && isset($artSku[0][self::NEEDLE_FIELD])) {

                $needlePriceData = intval($artSku[0][self::NEEDLE_FIELD]);

                \CIBlockElement::SetPropertyValuesEx($arFields['ID'], $arFields['IBLOCK_ID'], array(
                    self::GOODS_FILTER_FIELD => $needlePriceData)
                );
            }
        }
    }

}

После , необходимо настроить параметры для вывода товаров для компонента  , где указать параметр для сортировки по   PROPERTY_FILTER_PRICE

в ELEMENT_SORT_FIELD и добавить к выбираемым в PROPERTY_CODE  (Пример для bitrix:catalog.section)

 

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *

четырнадцать + семнадцать =

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.