столкнулся с задачей (распространенной) Выбрать все товары со скидкой (причем скидки со всеми параметрами условий скидки)
в течении года я делал такую вещь как "выкраивал" данный функционал (конструктор условий) из модуля скидок чтобы применить с своем модуле
и тут я про это вспомнил
что же надо сделать:
1. выбрать все скидки
выбираем в массив все скидки (по ходу приводим к нормальному виду массив с условиями)
2. Приведем наши товары -которые надо отфильтровать (к нужному виду) для этого
- надо их выбрать
-выделить все поля
-выделить все свойства (ведь в условиях скидки свойства и поля ВСЕ причем принимают участие)
для приведения к нужному виду используется функция
ну и собственно выбор всех и все (тестил на малом количестве)- поэтому код для выбора ВСЕГО и отовсюду
повторюсь у меня на тесте всего 10 элементов по разным инфоблокам
3. т.к. скидок может быть МНОГО то сделаем массив условий
данный код подключает класс (который работает с деревом условий скидок)
генерит из массива условий нужную нам строку и складывает ее в наш массив
4. ну и крайний шаг - это фильтруем все товары (написал топорно)-но думаю мысль всем понятна будет!
на выходе имеем массив отфильтрованный по всем условиям ВСЕХ скидок!!!!
ну вот как то так.. очень принимаются комментарии по улучшению, быстродействию и вообще СКОРЕЕ БЫ ПОЯВИЛСЯ ШТАТНЫЙ ФУНКЦИОНАЛ ВЫВОДА ТОВАРОВ СО СКИДКАМИ!!!!
в течении года я делал такую вещь как "выкраивал" данный функционал (конструктор условий) из модуля скидок чтобы применить с своем модуле
и тут я про это вспомнил
что же надо сделать:
1. выбрать все скидки
$dbProductDiscounts = CCatalogDiscount::GetList(array("SORT" => "ASC"), array("ACTIVE" => "Y"),false,false,array());
while ($arProductDiscounts = $dbProductDiscounts->Fetch()) {
$arProductDiscounts["CONDITIONS"]=unserialize($arProductDiscounts["CONDITIONS"]);
$disc[]=$arProductDiscounts;
} |
2. Приведем наши товары -которые надо отфильтровать (к нужному виду) для этого
- надо их выбрать
-выделить все поля
-выделить все свойства (ведь в условиях скидки свойства и поля ВСЕ причем принимают участие)
для приведения к нужному виду используется функция
function CreateFields($item)
{
$newItem=array();
$prop=$item["PROPERTIES"];unset($item["PROPERTIES"]);
$newItem=$item;
foreach($prop as $id=>$props)
{
$newItem["PROPERTY_".$props["ID"]."_VALUE"]=$props["VALUE"];
}
return $newItem;
} |
$res=CIBlockElement::GetList(array(),array(),false,false,array());
while($b=$res->GetNextElement())
{ $a=$b->GetFields();
$a["PROPERTIES"]=$b->GetProperty();
$offer[]=self::CreateFields($a);
} |
3. т.к. скидок может быть МНОГО то сделаем массив условий
CModule::IncludeModule('catalog');
$obCond=new CCatalogCondTree();
$boolsCond=$obCond->Init(BT_COND_MODE_GENERATE,BT_COND_BUILD_CATALOG);
if($boolsCond)
foreach($disc as $dsc){
$filter[]=$obCond->Generate($dsc["CONDITIONS"],array("FIELD"=>'$arItems'));
} |
генерит из массива условий нужную нам строку и складывает ее в наш массив
4. ну и крайний шаг - это фильтруем все товары (написал топорно)-но думаю мысль всем понятна будет!
foreach($offer as $arItems){
foreach($filter as $fltr){
$newOffers[]=(eval('return '.$fltr.';')==1) ? $arItems : '';
}
}
$newOffers=array_filter($newOffers); |
ну вот как то так.. очень принимаются комментарии по улучшению, быстродействию и вообще СКОРЕЕ БЫ ПОЯВИЛСЯ ШТАТНЫЙ ФУНКЦИОНАЛ ВЫВОДА ТОВАРОВ СО СКИДКАМИ!!!!