Bitrix

Раздел товаров со скидками

В 1С-Битрикс «Управление сайтом» пока нет встроенного компонента, при помощи которого можно было бы вывести все товары, для которых назначена скидка на странице «Скидки на товар». В этой статье опишу один из способов сделать такой раздел.

Поскольку встроенного решения нет, то придется изобретать что-то на уровне API Битрикс. Есть замечательная функция CCatalogDiscount::GetList — с помощью нее можно получить список текущих скидок. Также нам пригодится функция CCatalogDiscount::GetDiscountProductsList, служащая для выборки товаров по конкретной скидке.

Сделаем такую функцию:


function getDiscounts()
{
global $DB;

$arDiscountElementID = array();
$arDiscountSectionID = array();
$dbProductDiscounts = CCatalogDiscount::GetList(
array("SORT" => "ASC"),
array(
"ACTIVE" => "Y",
"!>ACTIVE_FROM" => $DB->FormatDate(date("Y-m-d H:i:s"),
"YYYY-MM-DD HH:MI:SS",
CSite::GetDateFormat("FULL")),
"! $DB->FormatDate(date("Y-m-d H:i:s"),
"YYYY-MM-DD HH:MI:SS",
CSite::GetDateFormat("FULL")),
),
false,
false,
array(
"ID", "SITE_ID", "ACTIVE", "ACTIVE_FROM", "ACTIVE_TO",
"RENEWAL", "NAME", "SORT", "MAX_DISCOUNT", "VALUE_TYPE",
"VALUE", "CURRENCY", "PRODUCT_ID", "SECTION_ID"
)
);
while ($arProductDiscounts = $dbProductDiscounts->Fetch())
{
foreach (unserialize($arProductDiscounts["CONDITIONS"])["CHILDREN"] as $elem)
{
if ($elem["CLASS_ID"]=="CondIBSection")
$arDiscountSectionID[] = $elem["DATA"]["value"];
}

if($res = CCatalogDiscount::GetDiscountProductsList(array(), array(">=DISCOUNT_ID" => $arProductDiscounts['ID']), false, false, array()))
{
while($ob = $res->GetNext())
{
if(!in_array($ob["PRODUCT_ID"],$arDiscountElementID))
$arDiscountElementID[] = $ob["PRODUCT_ID"];
if(!in_array($arProductDiscounts["SECTION_ID"],$arDiscountSectionID))
$arDiscountSectionID[] = $arProductDiscounts["SECTION_ID"];
}
}
}
return Array("ID"=>$arDiscountElementID, "SECTION_ID"=> array_unique($arDiscountSectionID));
}

Функция getDiscounts() позволяет получить массив из двух полей: в первом — идентификаторы товаров со скидкой, а во втором — идентификаторы разделов товаров со скидкой.

Теперь мы можем использовать эти параметры для запроса товаров в компоненте bitrix:catalog.section, при помощи ассоциативного глобального массива $arrFilter:


$arDiscounts = getDiscounts();
$GLOBALS["arrFilter"][] = Array(
"LOGIC"=>"OR",
Array("ID" =>$arDiscounts["ID"]),
Array("SECTION_ID" =>$arDiscounts["SECTION_ID"])
);

Для увеличения скорости работы лучше кешировать запрос функции getDiscounts(), чтобы она не запрашивалась каждый раз при обращении к странице списка товаров со скидками:


$cache = new CPHPCache();
$cache_time = 3600;
$cache_id = 'special_offers';
if($cache_time > 0 && $cache->InitCache($cache_time, $cache_id, false))
{
$GLOBALS["arrFilter"][] = $cache->GetVars();
}
elseif($cache->StartDataCache())
{
$arDiscounts = getDiscounts();
$arSpecialoffers = Array(
"LOGIC"=>"OR",
Array("ID" =>$arDiscounts["ID"]),
Array("SECTION_ID" =>$arDiscounts["SECTION_ID"])
);
$GLOBALS["arrFilter"][] = $arSpecialoffers;
$cache->EndDataCache($arSpecialoffers);
}

Теперь код работает и не грузит систему. Попробуйте.

Один комментарий

  1. Спасибо за скрипт с коментами, Одно замечание в 3-ем параметре фильтра выборки списка скидок «ошибка»:
    array(
    «ACTIVE» => «Y»,
    «!>ACTIVE_FROM» => $DB->FormatDate(
    date(«Y-m-d H:i:s»),
    «YYYY-MM-DD HH:MI:SS»,
    CSite::GetDateFormat(«FULL»)
    ),
    «!FormatDate(
    date(«Y-m-d H:i:s»),
    «YYYY-MM-DD HH:MI:SS»,
    CSite::GetDateFormat(«FULL»)
    ),
    ),
    т.е. не пропечатано ACTIVE_TO

Отставить комментарий

Ваш электронный адрес не будет опубликован.Обязательные для заполнения поля отмечены *

1 × три =