• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblockproperty.php
  • Класс: CAllIBlockProperty
  • Вызов: CAllIBlockProperty::GetList
static function GetList($arOrder=Array(), $arFilter=Array())
{
	global $DB;

	$strSql = "
		SELECT BP.*
		FROM b_iblock_property BP
	";

	$bJoinIBlock = false;
	$arSqlSearch = array();
	foreach($arFilter as $key => $val)
	{
		$val = $DB->ForSql($val);
		$key = mb_strtoupper($key);

		switch($key)
		{
		case "ACTIVE":
		case "SEARCHABLE":
		case "FILTRABLE":
		case "IS_REQUIRED":
		case "MULTIPLE":
			if($val=="Y" || $val=="N")
				$arSqlSearch[] = "BP.".$key." = '".$val."'";
			break;
		case "?CODE":
		case "?NAME":
			$arSqlSearch[] = CIBlock::FilterCreate("BP.".mb_substr($key, 1), $val, "string", "E");
			break;
		case "CODE":
		case "NAME":
			$arSqlSearch[] = "UPPER(BP.".$key.") LIKE UPPER('".$val."')";
			break;
		case "XML_ID":
		case "EXTERNAL_ID":
			$arSqlSearch[] = "BP.XML_ID LIKE '".$val."'";
			break;
		case "!XML_ID":
		case "!EXTERNAL_ID":
			$arSqlSearch[] = "(BP.XML_ID IS NULL OR NOT (BP.XML_ID LIKE '".$val."'))";
			break;
		case "TMP_ID":
			$arSqlSearch[] = "BP.TMP_ID LIKE '".$val."'";
			break;
		case "!TMP_ID":
			$arSqlSearch[] = "(BP.TMP_ID IS NULL OR NOT (BP.TMP_ID LIKE '".$val."'))";
			break;
		case "PROPERTY_TYPE":
			$ar = explode(":", $val);
			if (count($ar) == 2)
			{
				$val = $ar[0];
				$arSqlSearch[] = "BP.USER_TYPE = '".$ar[1]."'";
			}
			$arSqlSearch[] = "BP.".$key." = '".$val."'";
			break;
		case "USER_TYPE":
			$arSqlSearch[] = "BP.".$key." = '".$val."'";
			break;
		case "ID":
		case "IBLOCK_ID":
		case "LINK_IBLOCK_ID":
		case "VERSION":
			$arSqlSearch[] = "BP.".$key." = ".(int)$val;
			break;
		case "IBLOCK_CODE":
			$arSqlSearch[] = "UPPER(B.CODE) = UPPER('".$val."')";
			$bJoinIBlock = true;
			break;
		}
	}

	if($bJoinIBlock)
		$strSql .= "
			INNER JOIN b_iblock B ON B.ID = BP.IBLOCK_ID
		";

	if(!empty($arSqlSearch))
		$strSql .= "
			WHERE ".implode("nttttAND ", $arSqlSearch)."
		";

	$allowKeys = array(
		"ID" => true,
		"IBLOCK_ID" => true,
		"NAME" => true,
		"ACTIVE" => true,
		"SORT" => true,
		"FILTRABLE" => true,
		"SEARCHABLE" => true
	);
	$orderKeys = array();
	$arSqlOrder = array();
	foreach($arOrder as $by => $order)
	{
		$by = mb_strtoupper($by);
		if (!isset($allowKeys[$by]))
			$by = "TIMESTAMP_X";
		if (isset($orderKeys[$by]))
			continue;
		$orderKeys[$by] = true;
		$order = mb_strtoupper($order) == "ASC"? "ASC": "DESC";

		$arSqlOrder[] = "BP.".$by." ".$order;
	}

	if(!empty($arSqlOrder))
		$strSql .= "
			ORDER BY ".implode(", ", $arSqlOrder)."
		";

	$res = $DB->Query($strSql, false, "FILE: ".__FILE__."
LINE: ".__LINE__); return new CIBlockPropertyResult($res); }