столкнулся с задачей (распространенной) Выбрать все товары со скидкой (причем скидки со всеми параметрами условий скидки)
в течении года я делал такую вещь как "выкраивал" данный функционал (конструктор условий) из модуля скидок чтобы применить с своем модуле
и тут я про это вспомнил
что же надо сделать:
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); |
ну вот как то так.. очень принимаются комментарии по улучшению, быстродействию и вообще СКОРЕЕ БЫ ПОЯВИЛСЯ ШТАТНЫЙ ФУНКЦИОНАЛ ВЫВОДА ТОВАРОВ СО СКИДКАМИ!!!!