Abr@X@bra.ru
Сортировка торговых предложений по цене Bitrix

Сортировка торговых предложений по цене Bitrix

26.08.2016
1327

Привет мой юный друг) В данном посте хочу с тобой поделиться и разложить по полочкам весь процесс, как средствами Битрикс можно сделать сортировку по цене из торговых предложений товара. Что с подвигло меня на это дело, так это то, что в сети нет не одного нормально описанного метода, хотя на первый взгляд кажется, что информации на эту тему много, но увы она давольно скудна и не описывает всего процесса. И так давай засучим рукава и перейдем к делу.

И так давай сначала опишем, что мы имеем и что мы будем делать. У нас есть установленное для примера типовое решения Битрикс интернет-магазин. Там по дефолту забиты демо товары у которых есть торговые предложения. В торг. предложениях забита цена для товара.

Чтобы мы смогли сортировать товар по цене нам нужно изначально вывести свойство в товаре с минимальной ценой. Тесть в дальнейшем мы с тобой напишем код, чтобы за нас все это делал Битрикс, проставил в каждом товаре мин. цену. из торг.предложений по которой мы и будем настраивать нашу сортировку. Надеюсь понятно, если нет то вот еще один пример за чем мы это делаем. Товар он по сути один, ну пусть это будут, тапочки домашние мужские, у этих тапочек есть разные размеры 39, 40, 41, 42 и тд. и у каждого размера может быть своя цена 100р, 200р, 300р и тд. Соответсвенно тут встает вопрос, товар один а цен у него много, а наша задача сделать сортировку, именно по цене для товара. 

Давай теперь создадим то самое свойство, для мин. цены товара. Идем в настройки ИБ (Инфоблока) нашего каталога, вкладка свойство и создаем тут новое свойство, называние  «Минимальная цена», тип «Число»,  код «MINIMUM_PRICE»


Отлично свойство у нас готово, теперь давай заглянем под капот и все там настроим. Открываем наш редактор кода и подключаемся к нашему сайту. Весь процесс будет проходить в папке local. Открываем local/php_interface/init.php, если у тебя в структуре твоего проекта нет этих папок их нужно создать. Открываем фил init.php и в него кидаем вот этот код: 

<?php

namespace AB;

class ElementSever

{

public static function setPrise(&$arFields)

{

    if ($arFields['IBLOCK_ID'] == 2) {

      $skuIblock = 3;

      $res = \CIBlockElement::GetList(

       Array('catalog_PRICE_1' => 'ASC'),

       array(

        'PROPERTY_CML2_LINK' => $arFields['ID'],

        'IBLOCK_ID' => $skuIblock

       ),

       false,

       array('nTopCount' => '1'),

       array('ID', 'IBLOCK_ID', 'CATALOG_GROUP_1')

      );

      $artSku = array();

      while ($element = $res->Fetch()) {

        $artSku[] = $element;

      }

      \CIBlockElement::SetPropertyValuesEx($arFields['ID'], $arFields['IBLOCK_ID'], array('MINIMUM_PRICE' => intval($artSku[0]['CATALOG_PRICE_1'])));

    }//endif

}

}

Каждую строчку кода и что за что отвечает описывать не буду. Думаю, что кто в теме поймет, ну а если ты не в теме ищи того кто в ней.

В  autoload_register (Автозагрузка классов) который в самом верху мы указали, что наши классы будут лажать в папке local/lib/… в ней мы и продолжим нашу работу. Создадим наши папки local/lib/ и в папке lib я создам еще одну папку и назову ее AB (AbraXabra))) нужна она для того, чтобы наши классы если они будут иметь одинаковые имена не путались. И так вот какой путь из папок получился у меня local/lib/AB в папке AB создаем собственно наш класс и называем его ElementSever.php и в него кидаем вот этот код: 

<?php

namespace AB;

class ElementSever

{

public static function setPrise(&$arFields)

{

    if ($arFields['IBLOCK_ID'] == 2) {

      $skuIblock = 3;

      $res = \CIBlockElement::GetList(

       Array('catalog_PRICE_1' => 'ASC'),

       array(

        'PROPERTY_CML2_LINK' => $arFields['ID'],

        'IBLOCK_ID' => $skuIblock

       ),

       false,

       array('nTopCount' => '1'),

       array('ID', 'IBLOCK_ID', 'CATALOG_GROUP_1')

      );

      $artSku = array();

      while ($element = $res->Fetch()) {

        $artSku[] = $element;

      }

      \CIBlockElement::SetPropertyValuesEx($arFields['ID'], $arFields['IBLOCK_ID'], array('MINIMUM_PRICE' => intval($artSku[0]['CATALOG_PRICE_1'])));

    }//endif

}

}

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

Открываем папку, где лежит наш компонент каталог, а точнее нам нужен файл section.php для старых шаблонах, для новых либо section_horizontal.php или section_vertical.php в зависимости от расположения на сайте. Ищем там, где лежит наш компонент catalog.section и перед ним нужно вставить следующий код:

  

<?

if ($request->get('PROPERTY_MINIMUM_PRICE')) {

        $arParams["ELEMENT_SORT_FIELD"] = 'PROPERTY_MINIMUM_PRICE';

        $arParams["ELEMENT_SORT_ORDER"] = $request->get('PROPERTY_MINIMUM_PRICE');

      }

?>

Данный кусок коды отвечает за сортировку от большего к меньшему или наоборот. 

Дальше, так как мы работает с типовым решением Битрикс в дизайне шаблона нет кнопки сортировки по ценам, предлагаю ее сделать. Так же перед выводом компонента catalog.section закину ссылку по которой мы будем в дальнейшем кликать, чтобы сортировать по цене товар. 

<div class="container">

        <div class="row">

          <div class="col-xs-6">

            <div class="sort_test" style="margin-bottom: 50px">

              <a href=«#">Сортировка по цене</a>

            </div>

          </div>

        </div>

      </div>


Дальше нужно из всего этого дела нам нужно собрать url и положить в ссылку, для нашей кнопки. Вставляем данный код ПЕРЕД КНОПКОЙ! 

<?

/** @var \Bitrix\Main\HttpRequest $request */

      $request = \Bitrix\Main\Context::getCurrent()->getRequest();

      use Bitrix\Main\Web;

      $Uri = new Web\Uri($request->getRequestUri());

      $Uri->addParams(['PROPERTY_MINIMUM_PRICE' => 'ASC']);

      if ($request->get('PROPERTY_MINIMUM_PRICE') == 'ASC') {

        $Uri->addParams(['PROPERTY_MINIMUM_PRICE' => 'DESC']);

      }

?>


После того как наш url готов, вставляем его в кнопку:

<div class="container">

        <div class="row">

          <div class="col-xs-6">

            <div class="sort_test" style="margin-bottom: 50px">

              <a href="<?=$Uri->getUri()?>">Сортировка по цене</a>

            </div>

          </div>

        </div>

      </div>


Вот и все! Можем перейти на сайт в любой раздел каталога и проверить как все работает. Все спасибо тебе большое за внимание, спокойной ночи))



PHP, Bitrix, Цены, Сортировка
Читайте также:
Flexbox и как делать адаптивные сайты

Flexbox и как делать адаптивные сайты

Современный front-end разработчик активно должен уметь применять на практике различные инструменты, позволяющи...
Читать
GetList вывод и фильтры инфоблоков

GetList вывод и фильтры инфоблоков

Довольно часто сталкиваешься с такой ситуацией при разработке сайта, когда нужно что-то чего нет при стандартном выводе ...
Читать
Highload выводим цвета из торговых предложений

Highload выводим цвета из торговых предложений

Привет, сегодня расскажу тебе мой юный читатель), как вывести свойства разных цветов товара в интернет-магазине на систе...
Читать