if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
//@var array $arParams
//@var array $arResult
$arParams["FILTER_NAME"] = trim($arParams["FILTER_NAME"]);
if ($arParams["FILTER_NAME"] === '' || !preg_match("/^[A-Za-z_][A-Za-z01-9_]*$/", $arParams["FILTER_NAME"])){
$arParams["FILTER_NAME"] = "arrFilter";
}
global ${$arParams['FILTER_NAME']};
$arrFilter = &${$arParams['FILTER_NAME']};
if ($this->StartResultCache()){
if(!CModule::IncludeModule("catalog")) {
$this->AbortResultCache();
ShowError("CATALOG_MODULE_NOT_INSTALLED");
return false;
}
if(!CModule::IncludeModule("iblock")) {
$this->AbortResultCache();
ShowError("IBLOCK_MODULE_NOT_INSTALLED");
return false;
}
include('functions.php');
//////////////////////////////////////////////////////////////////
// get start data //
//////////////////////////////////////////////////////////////////
$arFilter = array('ACTIVE'=>'Y',
"!>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"))
);
if(count($arParams['DISCOUNT_ID'])>0){
$arFilter['=ID'] = $arParams['DISCOUNT_ID'];
}
$dbDiscount = CCatalogDiscount::GetList(array(), $arFilter, false, false, array());
$catalogInfo = CCatalog::GetByID($arParams["IBLOCK_ID"]);
if($catalogInfo === false){
$catalogInfo = CIBlockPriceTools::GetOffersIBlock($arParams["IBLOCK_ID"]);
$catalogInfo ["IBLOCK_ID"] = $arParams["IBLOCK_ID"];
}
$arrFilterTemp = array('LOGIC'=>'OR');
$firstConditions = TRUE;
$idDiscount = array();
$priceTypeId = array();
if(array_key_exists("PRICE_CODE", $arParams) and is_array($arParams["PRICE_CODE"]) and count($arParams["PRICE_CODE"])>0){
$dbPriceType = CCatalogGroup::GetList(
array("SORT" => "ASC"),
array("NAME" => $arParams["PRICE_CODE"])
);
while ($arPriceType = $dbPriceType->Fetch()){
$priceTypeId[] = $arPriceType['ID'];
}
}
//////////////////////////////////////////////////////////////////
// work with data //
//////////////////////////////////////////////////////////////////
while($discount = $dbDiscount->Fetch()){
if(!in_array($discount['ID'], $idDiscount)){
$conditions = unserialize($discount['CONDITIONS']);
$idDiscount[] = $discount['ID'];
if (is_array($conditions) && !empty($conditions) && $firstConditions){
$obCond = new CCatalogCondTree();
$boolCond = $obCond->Init(BT_COND_MODE_SEARCH, BT_COND_BUILD_CATALOG, array());
$firstConditions = FALSE;
}
$arrFilterTemp[] = MakeFilter(
array(
"CONDITIONS" => $conditions,
"OB_COND" => $obCond,
"CATALOG_INFO" => $catalogInfo
)
);
}
}
if(count($arrFilterTemp)==1){
$arrFilter = array('IBLOCK_ID'=>$arParams["IBLOCK_ID"],'ID'=>'-1');
}
else{
if(count($priceTypeId)>0){
//добавляем условие в АрФильтр, чтобы товары с нулевыми ценами не выводились
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if($catalogInfo["OFFERS_IBLOCK_ID"] == ""){
//нет офферсов, тогда только по цене каталога фильтруем
$arTemp = array('LOGIC'=>'OR');
foreach ($priceTypeId as $key => $price) {
$arTemp[">CATALOG_PRICE_".$price] = 0;
}
$arrFilterTemp= array('LOGIC'=>'AND', $arrFilterTemp, $arTemp);
}
elseif(!array_key_exists("ID", $catalogInfo)){
//есть офферсы, которые являются торговым каталогом, а сам инфоблок не является торговым каталогом
$filterSubQuery = array(
"IBLOCK_ID" => $catalogInfo['OFFERS_IBLOCK_ID']
);
$arTemp = array('LOGIC'=>'OR');
foreach ($priceTypeId as $key => $price) {
$arTemp[">CATALOG_PRICE_".$price] = 0;
}
$filterSubQuery[] = $arTemp;
unset($arTemp);
$arTemp['=ID']=CIBlockElement::SubQuery(
"PROPERTY_".$catalogInfo['OFFERS_PROPERTY_ID'],
$filterSubQuery
);
$arrFilterTemp= array('LOGIC'=>'AND', $arrFilterTemp, $arTemp);
}
else{
//есть офферсы, которые являются торговым каталогом, и сам инфоблок является торговым каталогом
$arTemp1 = array('LOGIC'=>'OR');
foreach ($priceTypeId as $key => $price) {
$arTemp1[">CATALOG_PRICE_".$price] = 0;
}
$arTemp = array('LOGIC'=>'OR');
foreach ($priceTypeId as $key => $price) {
$arTemp[">CATALOG_PRICE_".$price] = 0;
}
$filterSubQuery[] = $arTemp;
unset($arTemp);
$arTemp['=ID']=CIBlockElement::SubQuery(
"PROPERTY_".$catalogInfo['OFFERS_PROPERTY_ID'],
$filterSubQuery
);
$arrFilterTemp= array('LOGIC'=>'AND', $arrFilterTemp, array('LOGIC'=>'OR',$arTemp, $arTemp1));
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
$arrFilter = array('IBLOCK_ID'=>$arParams["IBLOCK_ID"],$arrFilterTemp);
}
$arResult['DISCOUNT_FILTER'] = $arrFilter;
/* echo "<pre>";
print_r($arrFilter);
echo "</pre>";*/
$this -> EndResultCache();
}
else{
$arrFilter = $arResult['DISCOUNT_FILTER'];
}
|