static function GetFilter($arFilter=Array())
{
global $DB;
$arIBlockFilter = Array();
$arSqlSearch = Array();
$bSite = false;
foreach($arFilter as $key => $val)
{
$res = CIBlock::MkOperationFilter($key);
$key = $res["FIELD"];
$cOperationType = $res["OPERATION"];
$key = mb_strtoupper($key);
switch($key)
{
case "ACTIVE":
case "GLOBAL_ACTIVE":
$arSqlSearch[] = CIBlock::FilterCreate("BS.".$key, $val, "string_equal", $cOperationType);
break;
case "IBLOCK_ACTIVE":
$arIBlockFilter[] = CIBlock::FilterCreate("B.ACTIVE", $val, "string_equal", $cOperationType);
break;
case "LID":
case "SITE_ID":
$str = CIBlock::FilterCreate("BS.SITE_ID", $val, "string_equal", $cOperationType);
if($str <> '')
{
$arIBlockFilter[] = $str;
$bSite = true;
}
break;
case "IBLOCK_NAME":
$arIBlockFilter[] = CIBlock::FilterCreate("B.NAME", $val, "string", $cOperationType);
break;
case "IBLOCK_EXTERNAL_ID":
case "IBLOCK_XML_ID":
$arIBlockFilter[] = CIBlock::FilterCreate("B.XML_ID", $val, "string", $cOperationType);
break;
case "IBLOCK_TYPE":
$arIBlockFilter[] = CIBlock::FilterCreate("B.IBLOCK_TYPE_ID", $val, "string", $cOperationType);
break;
case "TIMESTAMP_X":
case "DATE_CREATE":
$arSqlSearch[] = CIBlock::FilterCreate("BS.".$key, $val, "date", $cOperationType);
break;
case "IBLOCK_CODE":
$arIBlockFilter[] = CIBlock::FilterCreate("B.CODE", $val, "string", $cOperationType);
break;
case "IBLOCK_ID":
$arSqlSearch[] = CIBlock::FilterCreate("BS.".$key, $val, "number", $cOperationType);
$arIBlockFilter[] = CIBlock::FilterCreate("B.ID", $val, "number", $cOperationType);
break;
case "NAME":
case "XML_ID":
case "TMP_ID":
case "CODE":
$arSqlSearch[] = CIBlock::FilterCreate("BS.".$key, $val, "string", $cOperationType);
break;
case "EXTERNAL_ID":
$arSqlSearch[] = CIBlock::FilterCreate("BS.XML_ID", $val, "string", $cOperationType);
break;
case "ID":
case "DEPTH_LEVEL":
case "MODIFIED_BY":
case "CREATED_BY":
case "SOCNET_GROUP_ID":
case "PICTURE":
case "DETAIL_PICTURE":
$arSqlSearch[] = CIBlock::FilterCreate("BS.".$key, $val, "number", $cOperationType);
break;
case "SECTION_ID":
if(!is_array($val) && (int)$val<=0)
$arSqlSearch[] = CIBlock::FilterCreate("BS.IBLOCK_SECTION_ID", "", "number", $cOperationType, false);
else
$arSqlSearch[] = CIBlock::FilterCreate("BS.IBLOCK_SECTION_ID", $val, "number", $cOperationType);
break;
case "RIGHT_MARGIN":
$arSqlSearch[] = "BS.RIGHT_MARGIN ".($cOperationType=="N"?">":"<=").(int)$val;
break;
case "LEFT_MARGIN":
$arSqlSearch[] = "BS.LEFT_MARGIN ".($cOperationType=="N"?"<":">=").(int)$val;
break;
case "LEFT_BORDER":
$arSqlSearch[] = CIBlock::FilterCreate("BS.LEFT_MARGIN", $val, "number", $cOperationType);
break;
case "RIGHT_BORDER":
$arSqlSearch[] = CIBlock::FilterCreate("BS.RIGHT_MARGIN", $val, "number", $cOperationType);
break;
case "HAS_ELEMENT":
$arSqlSearch[] = "EXISTS (
SELECT BS1.ID
FROM b_iblock_section BS1
INNER JOIN b_iblock_section_element BSE1 ON BSE1.IBLOCK_SECTION_ID = BS1.ID
AND BSE1.ADDITIONAL_PROPERTY_ID IS NULL
INNER JOIN b_iblock_element BE1 ON BE1.ID = BSE1.IBLOCK_ELEMENT_ID
WHERE BE1.ID = ".intval($val)."
AND BS1.LEFT_MARGIN >= BS.LEFT_MARGIN
AND BS1.RIGHT_MARGIN <= BS.RIGHT_MARGIN
)";
break;
}
}
static $IBlockFilter_cache = array();
if($bSite)
{
if(is_array($arIBlockFilter) && count($arIBlockFilter)>0)
{
$sIBlockFilter = "";
foreach($arIBlockFilter as $val)
if($val <> '')
$sIBlockFilter .= " AND ".$val;
if(!array_key_exists($sIBlockFilter, $IBlockFilter_cache))
{
$strSql =
"SELECT DISTINCT B.ID ".
"FROM b_iblock B, b_iblock_site BS ".
"WHERE B.ID = BS.IBLOCK_ID ".
$sIBlockFilter;
$arIBLOCKFilter = array();
$dbRes = $DB->Query($strSql);
while($arRes = $dbRes->Fetch())
$arIBLOCKFilter[] = $arRes["ID"];
$IBlockFilter_cache[$sIBlockFilter] = $arIBLOCKFilter;
}
else
{
$arIBLOCKFilter = $IBlockFilter_cache[$sIBlockFilter];
}
if(count($arIBLOCKFilter) > 0)
$arSqlSearch[] = "B.ID IN (".implode(", ", $arIBLOCKFilter).") ";
}
}
else
{
foreach($arIBlockFilter as $val)
if($val <> '')
$arSqlSearch[] = $val;
}
return $arSqlSearch;
}