| Задача: Вывести товары по определенной скидке Компонент формирует фильтр. Делала давно, наверняка, уже не работает, но оставлю на память |
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'];
}
|
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
function GetField($arVars){
$nameField = "";
$simpleCondition = array(
'CLASS_ID' => 'CondGroup',
'DATA' => array(
'All'=>'AND',
'True' => 'True'
),
'CHILDREN' => array(
array(
'CLASS_ID'=>$arVars['CLASS_ID'],
'DATA' => array(
'logic'=>'Equal',
'value' => $arVars['CONDITION_VALUE']
)
)
)
);
$field = $arVars['OB_COND']->GetConditionValues($simpleCondition);
foreach ($field as $key => $value) {
$nameField = $value['FIELD'];
}
unset($field);
if(stripos($arVars['CLASS_ID'],'CondIBProp:')!== false){
$field = explode(":",$arVars['CLASS_ID']);
if($field[1]==$arVars['IBLOCK_ID']){
$whoIs="product";
}
else{
$whoIs = "offers";
}
$nameFieldTemp = explode("_",$nameField);
unset($nameFieldTemp[2]);
$nameField = implode("_",$nameFieldTemp);
}
else{
$whoIs = 'product';
}
return array('WHO'=>$whoIs, 'NAME'=>$nameField);
}
function MakeFilter($arVars){
$conditions = $arVars['CONDITIONS'];
$catalogInfo = $arVars['CATALOG_INFO'];
$logicOperators = array(
"Equal"=>array('True'=>'=','False'=>'!='),
"Great"=>array('True'=>'>','False'=>'<='),
"Not"=>array('True'=>'!=','False'=>'='),
"Less"=>array('True'=>'<','False'=>'>='),
"EqGr"=>array('True'=>'>=','False'=>'<'),
"EqLs"=>array('True'=>'<=','False'=>'>'),
"Contain"=>array('True'=>'','False'=>'!')
);
foreach ($conditions['CHILDREN'] as $key => $children) {
$arrFilter['LOGIC']=$conditions['DATA']['All'];
if ($children['CLASS_ID']=='CondGroup'){
$arrFilter[] = MakeFilter(
array(
"CONDITIONS" => $children,
"OB_COND" => $arVars["OB_COND"],
"CATALOG_INFO" => $catalogInfo,
)
);
}
else{
$logic = $logicOperators[$children['DATA']['logic']][$conditions['DATA']['True']];
$field = GetField(
array(
"OB_COND" => $arVars["OB_COND"],
"CLASS_ID" => $children['CLASS_ID'],
'CONDITION_VALUE' => $children['DATA']['value'],
'IBLOCK_ID'=> $catalogInfo['IBLOCK_ID']
)
);
if($field["NAME"] != ""){
if($field['WHO'] =='offers'){
$filterSubQuery = array(
"IBLOCK_ID" => $catalogInfo['OFFERS_IBLOCK_ID'],
$logic.$field['NAME'] => $children['DATA']['value']
);
$arrFilter[]['=ID']=CIBlockElement::SubQuery(
"PROPERTY_".$catalogInfo['OFFERS_PROPERTY_ID'],
$filterSubQuery
);
}
elseif($field['NAME'] == 'SECTION_ID'){
$arrFilterTemp[$logic.$field['NAME']][] = $children['DATA']['value'];
$arrFilterTemp['INCLUDE_SUBSECTIONS'] = "Y";
$arrFilter[] = $arrFilterTemp;
unset($arrFilterTemp);
}
elseif(($field['NAME'] == 'NAME')and ($catalogInfo["OFFERS_IBLOCK_ID"] != "")){
$filterSubQuery = array(
"IBLOCK_ID" => $catalogInfo['OFFERS_IBLOCK_ID'],
$logic.$field['NAME'] => "%".$children['DATA']['value']."%"
);
$arrFilter[]['=ID']=CIBlockElement::SubQuery(
"PROPERTY_".$catalogInfo['OFFERS_PROPERTY_ID'],
$filterSubQuery
);
}
elseif ($field['NAME'] == 'NAME') {
if($arrFilter['LOGIC']=='OR'){
$arrFilter[$logic.$field['NAME']][] = "%".$children['DATA']['value']."%";
}
else{
$arrFilter[][$logic.$field['NAME']] = "%".$children['DATA']['value']."%";
}
}
else{
if($arrFilter['LOGIC']=='OR'){
$arrFilter[$logic.$field['NAME']][] = $children['DATA']['value'];
}
else{
$arrFilter[][$logic.$field['NAME']] = $children['DATA']['value'];
}
}
}
}
}
if(count($arrFilter)==2){
unset($arrFilter['LOGIC']);
if(array_key_exists(0, $arrFilter)){
$arrFilter=$arrFilter[0];
}
}
return $arrFilter;
} |