Bitrix - создание раздела со скидками

  • 2018-10-04
  • Дмитрий М.
  • 1617

Bitrix - создание раздела со скидками

<p>При разработке интернет магазина потребовалось создать страницу, на которой бы отображались <b>товары со скидками</b>. <b>Скидки </b>в системе устанавливаются через <b>Маркетинговые Предложения</b> по средствам <b>Правил работы с корзиной.</b> </p> <p> По сути задача сводится к созданию страницы <b>/sale/</b> на которой необходимо разместить компонент bitrix:catalog.section и настроить у него выборку по товарам, на которые действует <b>скидка</b>. </p> <h3>Как создать страницу товаров со скидками?</h3> <p> Для примера создадим такую страницу на базе стандартного шаблона Интернет Магазина Bitrix. Для начала необходимо создать страницу <b>/sale/</b> и добавить её в меню для вывода. </p> <div class="picture"> <img width="100%" alt="Screenshot_1.png" src="/upload/medialibrary/a0a/a0aaf88a97f2873c4125bee58792b6e9.png" height="auto" title="Screenshot_1.png"> </div> <p> На странице <b>/sale/</b> необходимо разместить компонент элементы раздела - <b>bitrix:catalog.section</b>, в настройках обязательно выбрать <b>"Показывать все элементы, если не указан раздел"</b>. </p> <p> Теперь настроим массив со значениями фильтра для фильтрации элементов (<b>arrFilter</b>). Для этого создадим класс, который формирует массив с <b>ID</b> товаров у которых есть действующая скидка в данный момент и для данного пользователя: </p> <pre class="line-numbers"><code class="language-php">use Bitrix\Main\Loader; use Bitrix\Main\SystemException; class AllProductDiscount{ /** * @return XML_ID|array * @throws SystemException * @throws \Bitrix\Main\LoaderException */ public static function getFull($arrFilter = array(), $arSelect = array()){ if(!Loader::includeModule('sale')) throw new SystemException('Не подключен модуль Sale'); //Все товары со скидкой!!! // Группы пользователей global $USER; $arUserGroups = $USER-&gt;GetUserGroupArray(); if (!is_array($arUserGroups)) $arUserGroups = array($arUserGroups); // Достаем старым методом только ID скидок привязанных к группам пользователей по ограничениям $actionsNotTemp = \CSaleDiscount::GetList(array("ID" =&gt; "ASC"),array("USER_GROUPS" =&gt; $arUserGroups),false,false,array("ID")); while($actionNot = $actionsNotTemp-&gt;fetch()){ $actionIds[] = $actionNot['ID']; } $actionIds=array_unique($actionIds); sort($actionIds); // Подготавливаем необходимые переменные для разборчивости кода global $DB; $conditionLogic = array('Equal'=&gt;'=','Not'=&gt;'!','Great'=&gt;'&gt;','Less'=&gt;'&lt;','EqGr'=&gt;'&gt;=','EqLs'=&gt;'&lt;='); $arSelect = array_merge(array("ID","IBLOCK_ID","XML_ID"),$arSelect); $city='MSK'; // Теперь достаем новым методом скидки с условиями. P.S. Старым методом этого делать не нужно из-за очень высокой нагрузки (уже тестировал) $actions = \Bitrix\Sale\Internals\DiscountTable::getList(array( 'select' =&gt; array("ID","ACTIONS_LIST"), 'filter' =&gt; array("ACTIVE"=&gt;"Y","USE_COUPONS"=&gt;"N","DISCOUNT_TYPE"=&gt;"P","LID"=&gt;SITE_ID, "ID"=&gt;$actionIds, array( "LOGIC" =&gt; "OR", array( "&lt;=ACTIVE_FROM"=&gt;$DB-&gt;FormatDate(date("Y-m-d H:i:s"),"YYYY-MM-DD HH:MI:SS",\CSite::GetDateFormat("FULL")), "&gt;=ACTIVE_TO"=&gt;$DB-&gt;FormatDate(date("Y-m-d H:i:s"),"YYYY-MM-DD HH:MI:SS",\CSite::GetDateFormat("FULL")) ), array( "=ACTIVE_FROM"=&gt;false, "&gt;=ACTIVE_TO"=&gt;$DB-&gt;FormatDate(date("Y-m-d H:i:s"),"YYYY-MM-DD HH:MI:SS",\CSite::GetDateFormat("FULL")) ), array( "&lt;=ACTIVE_FROM"=&gt;$DB-&gt;FormatDate(date("Y-m-d H:i:s"),"YYYY-MM-DD HH:MI:SS",\CSite::GetDateFormat("FULL")), "=ACTIVE_TO"=&gt;false ), array( "=ACTIVE_FROM"=&gt;false, "=ACTIVE_TO"=&gt;false ), )) )); // Перебираем каждую скидку и подготавливаем условия фильтрации для CIBlockElement::GetList while($arrAction = $actions-&gt;fetch()){ $arrActions[$arrAction['ID']] = $arrAction; } foreach($arrActions as $actionId =&gt; $action){ $arPredFilter = array_merge(array("ACTIVE_DATE"=&gt;"Y", "CAN_BUY"=&gt;"Y"),$arrFilter); //Набор предустановленных параметров $arFilter = $arPredFilter; //Основной фильтр $dopArFilter = $arPredFilter; //Фильтр для доп. запроса $dopArFilter["=XML_ID"] = array(); //Пустое значения для первой отработки array_merge //Магия генерации фильтра foreach($action['ACTIONS_LIST']['CHILDREN'] as $condition){ foreach($condition['CHILDREN'] as $keyConditionSub=&gt;$conditionSub){ $cs=$conditionSub['DATA']['value']; //Значение условия $cls=$conditionLogic[$conditionSub['DATA']['logic']]; //Оператор условия //$arFilter["LOGIC"]=$conditionSub['DATA']['All']?:'AND'; $CLASS_ID = explode(':',$conditionSub['CLASS_ID']); if($CLASS_ID[0]=='ActSaleSubGrp') { foreach($conditionSub['CHILDREN'] as $keyConditionSubElem=&gt;$conditionSubElem){ $cse=$conditionSubElem['DATA']['value']; //Значение условия $clse=$conditionLogic[$conditionSubElem['DATA']['logic']]; //Оператор условия //$arFilter["LOGIC"]=$conditionSubElem['DATA']['All']?:'AND'; $CLASS_ID_EL = explode(':',$conditionSubElem['CLASS_ID']); if($CLASS_ID_EL[0]=='CondIBProp') { $arFilter["IBLOCK_ID"]=$CLASS_ID_EL[1]; $arFilter[$clse."PROPERTY_".$CLASS_ID_EL[2]]=array_merge((array)$arFilter[$clse."PROPERTY_".$CLASS_ID_EL[2]],(array)$cse); $arFilter[$clse."PROPERTY_".$CLASS_ID_EL[2]]=array_unique($arFilter[$clse."PROPERTY_".$CLASS_ID_EL[2]]); }elseif($CLASS_ID_EL[0]=='CondIBName') { $arFilter[$clse."NAME"]=array_merge((array)$arFilter[$clse."NAME"],(array)$cse); $arFilter[$clse."NAME"]=array_unique($arFilter[$clse."NAME"]); }elseif($CLASS_ID_EL[0]=='CondIBElement') { $arFilter[$clse."ID"]=array_merge((array)$arFilter[$clse."ID"],(array)$cse); $arFilter[$clse."ID"]=array_unique($arFilter[$clse."ID"]); }elseif($CLASS_ID_EL[0]=='CondIBTags') { $arFilter[$clse."TAGS"]=array_merge((array)$arFilter[$clse."TAGS"],(array)$cse); $arFilter[$clse."TAGS"]=array_unique($arFilter[$clse."TAGS"]); }elseif($CLASS_ID_EL[0]=='CondIBSection') { $arFilter[$clse."SECTION_ID"]=array_merge((array)$arFilter[$clse."SECTION_ID"],(array)$cse); $arFilter[$clse."SECTION_ID"]=array_unique($arFilter[$clse."SECTION_ID"]); }elseif($CLASS_ID_EL[0]=='CondIBXmlID') { $arFilter[$clse."XML_ID"]=array_merge((array)$arFilter[$clse."XML_ID"],(array)$cse); $arFilter[$clse."XML_ID"]=array_unique($arFilter[$clse."XML_ID"]); }elseif($CLASS_ID_EL[0]=='CondBsktAppliedDiscount') { //Условие: Были применены скидки (Y/N) foreach($arrActions as $tempAction){ if(($tempAction['SORT']&lt;$action['SORT']&amp;&amp;$tempAction['PRIORITY']&gt;$action['PRIORITY']&amp;&amp;$cse=='N')||($tempAction['SORT']&gt;$action['SORT']&amp;&amp;$tempAction['PRIORITY']&lt;$action['PRIORITY']&amp;&amp;$cse=='Y')){ $arFilter=false; break 4; } } } } }elseif($CLASS_ID[0]=='CondIBProp') { $arFilter["IBLOCK_ID"]=$CLASS_ID[1]; $arFilter[$cls."PROPERTY_".$CLASS_ID[2]]=array_merge((array)$arFilter[$cls."PROPERTY_".$CLASS_ID[2]],(array)$cs); $arFilter[$cls."PROPERTY_".$CLASS_ID[2]]=array_unique($arFilter[$cls."PROPERTY_".$CLASS_ID[2]]); }elseif($CLASS_ID[0]=='CondIBName') { $arFilter[$cls."NAME"]=array_merge((array)$arFilter[$cls."NAME"],(array)$cs); $arFilter[$cls."NAME"]=array_unique($arFilter[$cls."NAME"]); }elseif($CLASS_ID[0]=='CondIBElement') { $arFilter[$cls."ID"]=array_merge((array)$arFilter[$cls."ID"],(array)$cs); $arFilter[$cls."ID"]=array_unique($arFilter[$cls."ID"]); }elseif($CLASS_ID[0]=='CondIBTags') { $arFilter[$cls."TAGS"]=array_merge((array)$arFilter[$cls."TAGS"],(array)$cs); $arFilter[$cls."TAGS"]=array_unique($arFilter[$cls."TAGS"]); }elseif($CLASS_ID[0]=='CondIBSection') { $arFilter[$cls."SECTION_ID"]=array_merge((array)$arFilter[$cls."SECTION_ID"],(array)$cs); $arFilter[$cls."SECTION_ID"]=array_unique($arFilter[$cls."SECTION_ID"]); }elseif($CLASS_ID[0]=='CondIBXmlID') { $arFilter[$cls."XML_ID"]=array_merge((array)$arFilter[$cls."XML_ID"],(array)$cs); $arFilter[$cls."XML_ID"]=array_unique($arFilter[$cls."XML_ID"]); }elseif($CLASS_ID[0]=='CondBsktAppliedDiscount') { //Условие: Были применены скидки (Y/N) foreach($arrActions as $tempAction){ if(($tempAction['SORT']&lt;$action['SORT']&amp;&amp;$tempAction['PRIORITY']&gt;$action['PRIORITY']&amp;&amp;$cs=='N')||($tempAction['SORT']&gt;$action['SORT']&amp;&amp;$tempAction['PRIORITY']&lt;$action['PRIORITY']&amp;&amp;$cs=='Y')){ $arFilter=false; break 3; } } } } } if($arFilter!==false&amp;&amp;$arFilter!=$arPredFilter){ if(!isset($arFilter['=XML_ID'])){ //Делаем запрос по каждому из фильтров, т.к. один фильтр не получится сделать из-за противоречий условий каждой скидки $res = \CIBlockElement::GetList(array(), $arFilter, false, false, $arSelect); while($ob = $res-&gt;GetNextElement()){ $arFields = $ob-&gt;GetFields(); $poductsArray['IDS'][] = $arFields["ID"]; } }elseif(!empty($arFilter['=XML_ID'])){ //Подготавливаем массив для отдельного запроса $dopArFilter['=XML_ID'] = array_unique(array_merge($arFilter['=XML_ID'],$dopArFilter['=XML_ID'])); } } } if(isset($dopArFilter)&amp;&amp;!empty($dopArFilter['=XML_ID'])){ //Делаем отдельный запрос по конкретным XML_ID $res = \CIBlockElement::GetList(array(), $dopArFilter, false, array("nTopCount"=&gt;count($dopArFilter['=XML_ID'])), $arSelect); while($ob = $res-&gt;GetNextElement()){ $arFields = $ob-&gt;GetFields(); $poductsArray['IDS'][] = $arFields["ID"]; } } $poductsArray['ids']=array_unique($poductsArray['ids']); return $poductsArray; } }</code></pre> <p> Этот код нужно разместить в файле <b>init.php</b> ( /bitrix/php_interface/init.php ), после этого можем использовать класс <b>AllProductDiscount. </b>Преимущество данного класса заключается в быстрой обработки большого количества товаров со скидками. </p> <p> Откроем файл <b>/sale/index.php</b>, перед вызовом компонента <b>bitrix:catalog.section</b> разместим код: </p> <pre class="line-numbers"><code class="language-php">&lt;? $res = AllProductDiscount::getFull( array("ACTIVE" =&gt; "Y", "SITE_ID" =&gt; SITE_ID), array() ); foreach($res['IDS'] as $ID) { $sale_id[] = $ID; } $GLOBALS['arrFilter'] = array("ID"=&gt;$sale_id); ?&gt;</code></pre> <p> <b><i>Внимание!</i></b> Не забываем, чтобы <i><b>имя массива со значениями фильтра для фильтрации элементов </b></i>в настройках компонента <b>bitrix:catalog.section</b> было <b>arrFilter</b>. </p>

03.12.2018 16:42:47

SALE-.png

SALE-.png

Bitrix - создание раздела со скидками

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

По сути задача сводится к созданию страницы /sale/ на которой необходимо разместить компонент bitrix:catalog.section и настроить у него выборку по товарам, на которые действует скидка.

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

По сути задача сводится к созданию страницы /sale/ на которой необходимо разместить компонент bitrix:catalog.section и настроить у него выборку по товарам, на которые действует скидка.

Как создать страницу товаров со скидками?

Для примера создадим такую страницу на базе стандартного шаблона Интернет Магазина Bitrix. Для начала необходимо создать страницу /sale/ и добавить её в меню для вывода.

Screenshot_1.png

На странице /sale/ необходимо разместить компонент элементы раздела - bitrix:catalog.section, в настройках обязательно выбрать "Показывать все элементы, если не указан раздел".

Теперь настроим массив со значениями фильтра для фильтрации элементов (arrFilter). Для этого создадим класс, который формирует массив с ID товаров у которых есть действующая скидка в данный момент и для данного пользователя:

use Bitrix\Main\Loader;
use Bitrix\Main\SystemException;
 
class AllProductDiscount{
    /**
     * @return XML_ID|array
     * @throws SystemException
     * @throws \Bitrix\Main\LoaderException
     */
    public static function getFull($arrFilter = array(), $arSelect = array()){
        if(!Loader::includeModule('sale')) throw new SystemException('Не подключен модуль Sale');
 
	//Все товары со скидкой!!!
    // Группы пользователей
    global $USER;
    $arUserGroups = $USER->GetUserGroupArray();
    if (!is_array($arUserGroups)) $arUserGroups = array($arUserGroups);
    // Достаем старым методом только ID скидок привязанных к группам пользователей по ограничениям
    $actionsNotTemp = \CSaleDiscount::GetList(array("ID" => "ASC"),array("USER_GROUPS" => $arUserGroups),false,false,array("ID"));
    while($actionNot = $actionsNotTemp->fetch()){
      $actionIds[] = $actionNot['ID'];
    }
    $actionIds=array_unique($actionIds); sort($actionIds);
    // Подготавливаем необходимые переменные для разборчивости кода
    global $DB;
    $conditionLogic = array('Equal'=>'=','Not'=>'!','Great'=>'>','Less'=>'<','EqGr'=>'>=','EqLs'=>'<=');
    $arSelect = array_merge(array("ID","IBLOCK_ID","XML_ID"),$arSelect);
    $city='MSK';
    // Теперь достаем новым методом скидки с условиями. P.S. Старым методом этого делать не нужно из-за очень высокой нагрузки (уже тестировал)
    $actions = \Bitrix\Sale\Internals\DiscountTable::getList(array(
      'select' => array("ID","ACTIONS_LIST"),
      'filter' => array("ACTIVE"=>"Y","USE_COUPONS"=>"N","DISCOUNT_TYPE"=>"P","LID"=>SITE_ID,
      "ID"=>$actionIds,
      array(
        "LOGIC" => "OR",
        array(
          "<=ACTIVE_FROM"=>$DB->FormatDate(date("Y-m-d H:i:s"),"YYYY-MM-DD HH:MI:SS",\CSite::GetDateFormat("FULL")),
          ">=ACTIVE_TO"=>$DB->FormatDate(date("Y-m-d H:i:s"),"YYYY-MM-DD HH:MI:SS",\CSite::GetDateFormat("FULL"))
        ),
        array(
          "=ACTIVE_FROM"=>false,
          ">=ACTIVE_TO"=>$DB->FormatDate(date("Y-m-d H:i:s"),"YYYY-MM-DD HH:MI:SS",\CSite::GetDateFormat("FULL"))
        ),
        array(
          "<=ACTIVE_FROM"=>$DB->FormatDate(date("Y-m-d H:i:s"),"YYYY-MM-DD HH:MI:SS",\CSite::GetDateFormat("FULL")),
          "=ACTIVE_TO"=>false
        ),
        array(
          "=ACTIVE_FROM"=>false,
          "=ACTIVE_TO"=>false
        ),
      ))
    ));
    // Перебираем каждую скидку и подготавливаем условия фильтрации для CIBlockElement::GetList
    while($arrAction = $actions->fetch()){
      $arrActions[$arrAction['ID']] = $arrAction;
    }
    foreach($arrActions as $actionId => $action){
      $arPredFilter = array_merge(array("ACTIVE_DATE"=>"Y", "CAN_BUY"=>"Y"),$arrFilter); //Набор предустановленных параметров
      $arFilter = $arPredFilter; //Основной фильтр
      $dopArFilter = $arPredFilter; //Фильтр для доп. запроса
      $dopArFilter["=XML_ID"] = array(); //Пустое значения для первой отработки array_merge
      //Магия генерации фильтра
      foreach($action['ACTIONS_LIST']['CHILDREN'] as $condition){
        foreach($condition['CHILDREN'] as $keyConditionSub=>$conditionSub){
          $cs=$conditionSub['DATA']['value']; //Значение условия
          $cls=$conditionLogic[$conditionSub['DATA']['logic']]; //Оператор условия
          //$arFilter["LOGIC"]=$conditionSub['DATA']['All']?:'AND';
          $CLASS_ID = explode(':',$conditionSub['CLASS_ID']);
 
          if($CLASS_ID[0]=='ActSaleSubGrp') {
            foreach($conditionSub['CHILDREN'] as $keyConditionSubElem=>$conditionSubElem){
              $cse=$conditionSubElem['DATA']['value']; //Значение условия
              $clse=$conditionLogic[$conditionSubElem['DATA']['logic']]; //Оператор условия
              //$arFilter["LOGIC"]=$conditionSubElem['DATA']['All']?:'AND';
              $CLASS_ID_EL = explode(':',$conditionSubElem['CLASS_ID']);
 
              if($CLASS_ID_EL[0]=='CondIBProp') {
                $arFilter["IBLOCK_ID"]=$CLASS_ID_EL[1];
                $arFilter[$clse."PROPERTY_".$CLASS_ID_EL[2]]=array_merge((array)$arFilter[$clse."PROPERTY_".$CLASS_ID_EL[2]],(array)$cse);
                $arFilter[$clse."PROPERTY_".$CLASS_ID_EL[2]]=array_unique($arFilter[$clse."PROPERTY_".$CLASS_ID_EL[2]]);
              }elseif($CLASS_ID_EL[0]=='CondIBName') {
                $arFilter[$clse."NAME"]=array_merge((array)$arFilter[$clse."NAME"],(array)$cse);
                $arFilter[$clse."NAME"]=array_unique($arFilter[$clse."NAME"]);
              }elseif($CLASS_ID_EL[0]=='CondIBElement') {
                $arFilter[$clse."ID"]=array_merge((array)$arFilter[$clse."ID"],(array)$cse);
                $arFilter[$clse."ID"]=array_unique($arFilter[$clse."ID"]);
              }elseif($CLASS_ID_EL[0]=='CondIBTags') {
                $arFilter[$clse."TAGS"]=array_merge((array)$arFilter[$clse."TAGS"],(array)$cse);
                $arFilter[$clse."TAGS"]=array_unique($arFilter[$clse."TAGS"]);
              }elseif($CLASS_ID_EL[0]=='CondIBSection') {
                $arFilter[$clse."SECTION_ID"]=array_merge((array)$arFilter[$clse."SECTION_ID"],(array)$cse);
                $arFilter[$clse."SECTION_ID"]=array_unique($arFilter[$clse."SECTION_ID"]);
              }elseif($CLASS_ID_EL[0]=='CondIBXmlID') {
                $arFilter[$clse."XML_ID"]=array_merge((array)$arFilter[$clse."XML_ID"],(array)$cse);
                $arFilter[$clse."XML_ID"]=array_unique($arFilter[$clse."XML_ID"]);
              }elseif($CLASS_ID_EL[0]=='CondBsktAppliedDiscount') { //Условие: Были применены скидки (Y/N)
                foreach($arrActions as $tempAction){
                  if(($tempAction['SORT']<$action['SORT']&&$tempAction['PRIORITY']>$action['PRIORITY']&&$cse=='N')||($tempAction['SORT']>$action['SORT']&&$tempAction['PRIORITY']<$action['PRIORITY']&&$cse=='Y')){
                    $arFilter=false;
                    break 4;
                  }
                }
              }
            }
          }elseif($CLASS_ID[0]=='CondIBProp') {
            $arFilter["IBLOCK_ID"]=$CLASS_ID[1];
            $arFilter[$cls."PROPERTY_".$CLASS_ID[2]]=array_merge((array)$arFilter[$cls."PROPERTY_".$CLASS_ID[2]],(array)$cs);
            $arFilter[$cls."PROPERTY_".$CLASS_ID[2]]=array_unique($arFilter[$cls."PROPERTY_".$CLASS_ID[2]]);
          }elseif($CLASS_ID[0]=='CondIBName') {
            $arFilter[$cls."NAME"]=array_merge((array)$arFilter[$cls."NAME"],(array)$cs);
            $arFilter[$cls."NAME"]=array_unique($arFilter[$cls."NAME"]);
          }elseif($CLASS_ID[0]=='CondIBElement') {
            $arFilter[$cls."ID"]=array_merge((array)$arFilter[$cls."ID"],(array)$cs);
            $arFilter[$cls."ID"]=array_unique($arFilter[$cls."ID"]);
          }elseif($CLASS_ID[0]=='CondIBTags') {
            $arFilter[$cls."TAGS"]=array_merge((array)$arFilter[$cls."TAGS"],(array)$cs);
            $arFilter[$cls."TAGS"]=array_unique($arFilter[$cls."TAGS"]);
          }elseif($CLASS_ID[0]=='CondIBSection') {
            $arFilter[$cls."SECTION_ID"]=array_merge((array)$arFilter[$cls."SECTION_ID"],(array)$cs);
            $arFilter[$cls."SECTION_ID"]=array_unique($arFilter[$cls."SECTION_ID"]);
          }elseif($CLASS_ID[0]=='CondIBXmlID') {
            $arFilter[$cls."XML_ID"]=array_merge((array)$arFilter[$cls."XML_ID"],(array)$cs);
            $arFilter[$cls."XML_ID"]=array_unique($arFilter[$cls."XML_ID"]);
          }elseif($CLASS_ID[0]=='CondBsktAppliedDiscount') { //Условие: Были применены скидки (Y/N)
            foreach($arrActions as $tempAction){
              if(($tempAction['SORT']<$action['SORT']&&$tempAction['PRIORITY']>$action['PRIORITY']&&$cs=='N')||($tempAction['SORT']>$action['SORT']&&$tempAction['PRIORITY']<$action['PRIORITY']&&$cs=='Y')){
                $arFilter=false;
                break 3;
              }
            }
          }
        }
      }
      if($arFilter!==false&&$arFilter!=$arPredFilter){
        if(!isset($arFilter['=XML_ID'])){
          //Делаем запрос по каждому из фильтров, т.к. один фильтр не получится сделать из-за противоречий условий каждой скидки
          $res = \CIBlockElement::GetList(array(), $arFilter, false, false, $arSelect);
          while($ob = $res->GetNextElement()){
            $arFields = $ob->GetFields();
            $poductsArray['IDS'][] = $arFields["ID"];
          }
        }elseif(!empty($arFilter['=XML_ID'])){
          //Подготавливаем массив для отдельного запроса
          $dopArFilter['=XML_ID'] = array_unique(array_merge($arFilter['=XML_ID'],$dopArFilter['=XML_ID']));
        }
      }
    }
 
    if(isset($dopArFilter)&&!empty($dopArFilter['=XML_ID'])){
      //Делаем отдельный запрос по конкретным XML_ID
      $res = \CIBlockElement::GetList(array(), $dopArFilter, false, array("nTopCount"=>count($dopArFilter['=XML_ID'])), $arSelect);
      while($ob = $res->GetNextElement()){
        $arFields = $ob->GetFields();
        $poductsArray['IDS'][] = $arFields["ID"];
      }
    }
    $poductsArray['ids']=array_unique($poductsArray['ids']);
 
        return $poductsArray;
    }
}

Этот код нужно разместить в файле init.php ( /bitrix/php_interface/init.php ), после этого можем использовать класс AllProductDiscount. Преимущество данного класса заключается в быстрой обработки большого количества товаров со скидками.

Откроем файл /sale/index.php, перед вызовом компонента bitrix:catalog.section разместим код:

<?
	$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);
?>

Внимание! Не забываем, чтобы имя массива со значениями фильтра для фильтрации элементов в настройках компонента bitrix:catalog.section было arrFilter.



Статья была полезна? Поблагодарите автора.

Возврат к списку