[QUOTE]Андрей Якименко написал:
Столкнулся с похожей задачей. Старые варианты которые были на форуме почему то не работали, разбираться и мудрить не стал, набросал свой вариант для фильтра по скидкам.
Написал небольшой набросок, может кому поможет
(При корректно настроенных скидках работает отлично)
\Bitrix\Catalog\DiscountTable::getList();
\Bitrix\Sale\Internals\DiscountTable::getList();
[CODE] <?
/*** FILTER (Предустановленный список маркетинговых акций) ***/
if (CModule::IncludeModule( 'sale' )){
$result = Bitrix\Sale\Internals\DiscountTable::getList(
array (
'filter' => array ( "LID" => "s4" , 'ACTIVE' => 'Y' ), // фильтр по сайту s4, только активные (можно подставить SITE_ID)
)
);
while ( $data = $result ->fetch()){
if ( $data [ 'SHORT_DESCRIPTION_STRUCTURE' ][ 'VALUE' ] >= '15' ){ // размер скидки в списке маркетинговых акций
foreach ( $data [ 'CONDITIONS_LIST' ][ 'CHILDREN' ] as $arData ){
foreach ( $arData [ 'CHILDREN' ] as $arElements ){ // получаем ID секций и элементов
switch ( $arElements [ 'CLASS_ID' ]) {
case "CondIBSection" : // отбор секций
//echo "<pre>**";print_r($arElements['DATA']['value']);echo "**</pre>";
$sectionsvalue [ 'SECTION_ID' ][] = $arElements [ 'DATA' ][ 'value' ]; // сохраняем ID секций
//$GLOBALS["arrFilterSale"]['SECTION_ID'][] = $arElements['DATA']['value']; // укладываем в глобальный массив фильтра
break ;
case "CondIBElement" : // отбор элементов
foreach ( $arElements [ 'DATA' ][ 'value' ] as $arElementsList ){ // получаем ID элементов
//echo "<pre>*";print_r($arElementsList);echo "*</pre>";
$elementsvalue [ 'ID' ][] = $arElementsList ;
//$GLOBALS["arrFilterSale"]['ID'][] = $arElementsList; // укладываем в глобальный массив фильтра
}
break ;
}
}
}
}
}
}
function GetElementID ( $ibID , $sectID ) {
if (CModule::IncludeModule( 'iblock' ))
$arSelect = Array ( "ID" ); // берем только идентификатор
$arFilter = Array ( "IBLOCK_ID" =>IntVal( $ibID ), "SECTION_ID" => $sectID , "ACTIVE" => "Y" ); // фильтруем по инфоблоку и ID секции
$res = CIBlockElement::GetList( array ( "RAND" => "RAND" ), $arFilter , false , Array ( "nPageSize" => 50 ), $arSelect ); // выводим кол-во рандомных записей
while ( $ob = $res ->GetNextElement( false , false )){
$arFields [] = $ob ->GetFields();
}
foreach ( $arFields as $ids ){ // приводим массив к нужному виду
$result [] = $ids [ "ID" ];
}
return $result ;
}
$FilterResult = GetElementID( 18 , $sectionsvalue [ 'SECTION_ID' ]); // указываем ID инфоблока и передаем ID секций для выборки ID элементов
$arFilterResult = array_merge( $elementsvalue [ 'ID' ], $FilterResult ); // объединяем массивы
$GLOBALS [ "arrFilterSale" ][ 'ID' ] = $arFilterResult ;
?>
[/CODE][/QUOTE]
Супер спасибо!!!
Столкнулся с похожей задачей. Старые варианты которые были на форуме почему то не работали, разбираться и мудрить не стал, набросал свой вариант для фильтра по скидкам.
Написал небольшой набросок, может кому поможет
(При корректно настроенных скидках работает отлично)
\Bitrix\Catalog\DiscountTable::getList();
\Bitrix\Sale\Internals\DiscountTable::getList();
[CODE] <?
/*** FILTER (Предустановленный список маркетинговых акций) ***/
if (CModule::IncludeModule( 'sale' )){
$result = Bitrix\Sale\Internals\DiscountTable::getList(
array (
'filter' => array ( "LID" => "s4" , 'ACTIVE' => 'Y' ), // фильтр по сайту s4, только активные (можно подставить SITE_ID)
)
);
while ( $data = $result ->fetch()){
if ( $data [ 'SHORT_DESCRIPTION_STRUCTURE' ][ 'VALUE' ] >= '15' ){ // размер скидки в списке маркетинговых акций
foreach ( $data [ 'CONDITIONS_LIST' ][ 'CHILDREN' ] as $arData ){
foreach ( $arData [ 'CHILDREN' ] as $arElements ){ // получаем ID секций и элементов
switch ( $arElements [ 'CLASS_ID' ]) {
case "CondIBSection" : // отбор секций
//echo "<pre>**";print_r($arElements['DATA']['value']);echo "**</pre>";
$sectionsvalue [ 'SECTION_ID' ][] = $arElements [ 'DATA' ][ 'value' ]; // сохраняем ID секций
//$GLOBALS["arrFilterSale"]['SECTION_ID'][] = $arElements['DATA']['value']; // укладываем в глобальный массив фильтра
break ;
case "CondIBElement" : // отбор элементов
foreach ( $arElements [ 'DATA' ][ 'value' ] as $arElementsList ){ // получаем ID элементов
//echo "<pre>*";print_r($arElementsList);echo "*</pre>";
$elementsvalue [ 'ID' ][] = $arElementsList ;
//$GLOBALS["arrFilterSale"]['ID'][] = $arElementsList; // укладываем в глобальный массив фильтра
}
break ;
}
}
}
}
}
}
function GetElementID ( $ibID , $sectID ) {
if (CModule::IncludeModule( 'iblock' ))
$arSelect = Array ( "ID" ); // берем только идентификатор
$arFilter = Array ( "IBLOCK_ID" =>IntVal( $ibID ), "SECTION_ID" => $sectID , "ACTIVE" => "Y" ); // фильтруем по инфоблоку и ID секции
$res = CIBlockElement::GetList( array ( "RAND" => "RAND" ), $arFilter , false , Array ( "nPageSize" => 50 ), $arSelect ); // выводим кол-во рандомных записей
while ( $ob = $res ->GetNextElement( false , false )){
$arFields [] = $ob ->GetFields();
}
foreach ( $arFields as $ids ){ // приводим массив к нужному виду
$result [] = $ids [ "ID" ];
}
return $result ;
}
$FilterResult = GetElementID( 18 , $sectionsvalue [ 'SECTION_ID' ]); // указываем ID инфоблока и передаем ID секций для выборки ID элементов
$arFilterResult = array_merge( $elementsvalue [ 'ID' ], $FilterResult ); // объединяем массивы
$GLOBALS [ "arrFilterSale" ][ 'ID' ] = $arFilterResult ;
?>
[/CODE][/QUOTE]
Супер спасибо!!!