• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblocksection.php
  • Класс: CAllIBlockSection
  • Вызов: CAllIBlockSection::GetFilter
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;
}