• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblockelement.php
  • Класс: CAllIBlockElement
  • Вызов: CAllIBlockElement::GetProperty
static function GetProperty($IBLOCK_ID, $ELEMENT_ID, $by="sort", $order="asc", $arFilter = Array())
{
	global $DB;
	if(is_array($by))
	{
		if($order!="asc")
			$arFilter = $order;
		$arOrder = $by;
	}
	else
	{
		$arOrder = false;
	}

	$IBLOCK_ID = (int)$IBLOCK_ID;
	$ELEMENT_ID = (int)$ELEMENT_ID;
	$VERSION = CIBlockElement::GetIBVersion($IBLOCK_ID);

	$strSqlSearch = "";
	foreach($arFilter as $key=>$val)
	{
		switch(mb_strtoupper($key))
		{
			case "ACTIVE":
				if($val == "Y" || $val == "N")
				{
					$strSqlSearch .= "AND BP.ACTIVE='".$val."'n";
				}
				break;
			case "SEARCHABLE":
				if($val == "Y" || $val == "N")
				{
					$strSqlSearch .= "AND BP.SEARCHABLE='".$val."'n";
				}
				break;
			case "NAME":
				if($val <> '')
				{
					$strSqlSearch .= "AND ".CIBlock::_Upper("BP.NAME")." LIKE ".CIBlock::_Upper("'".$DB->ForSql($val)."'")."n";
				}
				break;
			case "ID":
				if(is_array($val))
				{
					if(!empty($val))
					{
						$strSqlSearch .= "AND BP.ID in (".implode(", ", array_map("intval", $val)).")n";
					}
				}
				elseif($val <> '')
				{
					$strSqlSearch .= "AND BP.ID=".intval($val)."n";
				}
				break;
			case "PROPERTY_TYPE":
				if($val <> '')
				{
					$strSqlSearch .= "AND BP.PROPERTY_TYPE='".$DB->ForSql($val)."'n";
				}
				break;
			case "CODE":
				if($val <> '')
				{
					$strSqlSearch .= "AND ".CIBlock::_Upper("BP.CODE")." LIKE ".CIBlock::_Upper("'".$DB->ForSql($val)."'")."n";
				}
				break;
			case "EMPTY":
				if($val <> '')
				{
					if($val == "Y")
					{
						$strSqlSearch .= "AND BEP.ID IS NULLn";
					}
					elseif($VERSION != 2)
					{
						$strSqlSearch .= "AND BEP.ID IS NOT NULLn";
					}
				}
				break;
		}
	}

	$arSqlOrder = array();
	if($arOrder)
	{
		foreach($arOrder as $by=>$order)
		{
			$order = mb_strtolower($order);
			if($order!="desc")
				$order = "asc";

			$by = mb_strtolower($by);
			if($by == "sort")		$arSqlOrder["BP.SORT"]=$order;
			elseif($by == "id")		$arSqlOrder["BP.ID"]=$order;
			elseif($by == "name")		$arSqlOrder["BP.NAME"]=$order;
			elseif($by == "active")		$arSqlOrder["BP.ACTIVE"]=$order;
			elseif($by == "value_id")	$arSqlOrder["BEP.ID"]=$order;
			elseif($by == "enum_sort")	$arSqlOrder["BEPE.SORT"]=$order;
			else
				$arSqlOrder["BP.SORT"]=$order;
		}
	}
	else
	{
		if($by == "id")			$arSqlOrder["BP.ID"]="asc";
		elseif($by == "name")		$arSqlOrder["BP.NAME"]="asc";
		elseif($by == "active")		$arSqlOrder["BP.ACTIVE"]="asc";
		elseif($by == "value_id")	$arSqlOrder["BEP.ID"]=$order;
		elseif($by == "enum_sort")	$arSqlOrder["BEPE.SORT"]=$order;
		else
		{
			$arSqlOrder["BP.SORT"]="asc";
			$by = "sort";
		}

		if ($order!="desc")
		{
			$arSqlOrder["BP.SORT"]="asc";
			$arSqlOrder["BP.ID"]="asc";
			$arSqlOrder["BEPE.SORT"]="asc";
			$arSqlOrder["BEP.ID"]="asc";
			$order = "asc";
		}
		else
		{
			$arSqlOrder["BP.SORT"]="desc";
			$arSqlOrder["BP.ID"]="desc";
			$arSqlOrder["BEPE.SORT"]="desc";
			$arSqlOrder["BEP.ID"]="desc";
		}
	}

	$strSqlOrder = "";
	foreach($arSqlOrder as $key=>$val)
		$strSqlOrder.=", ".$key." ".$val;

	if($strSqlOrder!="")
		$strSqlOrder = ' ORDER BY '.mb_substr($strSqlOrder, 1);

	if($VERSION==2)
		$strTable = "b_iblock_element_prop_m".$IBLOCK_ID;
	else
		$strTable = "b_iblock_element_property";

	$strSql = "
		SELECT BP.*, BEP.ID as PROPERTY_VALUE_ID, BEP.VALUE, BEP.DESCRIPTION, BEPE.VALUE VALUE_ENUM, BEPE.XML_ID VALUE_XML_ID, BEPE.SORT VALUE_SORT
		FROM b_iblock B
			INNER JOIN b_iblock_property BP ON B.ID=BP.IBLOCK_ID
			LEFT JOIN ".$strTable." BEP ON (BP.ID = BEP.IBLOCK_PROPERTY_ID AND BEP.IBLOCK_ELEMENT_ID = ".$ELEMENT_ID.")
			LEFT JOIN b_iblock_property_enum BEPE ON (BP.PROPERTY_TYPE = 'L' AND BEPE.ID=BEP.VALUE_ENUM AND BEPE.PROPERTY_ID=BP.ID)
		WHERE B.ID = ".$IBLOCK_ID."
			".$strSqlSearch."
		".$strSqlOrder;

	if($VERSION==2)
	{
		$emptyFilter = !isset($arFilter['EMPTY']) || $arFilter['EMPTY'] === 'Y';
		$notEmptyFilter = isset($arFilter['EMPTY']) && $arFilter['EMPTY'] === 'N';
		$result = array();
		$arElements = array();
		$rs = $DB->Query($strSql);
		while($ar = $rs->Fetch())
		{
			if($ar["VERSION"]==2 && $ar["MULTIPLE"]=="N")
			{
				if (!isset($arElements[$ELEMENT_ID]))
				{
					$strSql = "
						SELECT *
						FROM b_iblock_element_prop_s".$ar["IBLOCK_ID"]."
						WHERE IBLOCK_ELEMENT_ID = ".$ELEMENT_ID."
					";
					$rs2 = $DB->Query($strSql);
					$arElements[$ELEMENT_ID] = $rs2->Fetch();
					unset($rs2);
				}
				$notEmptyValue =
					is_array($arElements[$ELEMENT_ID])
					&& isset($arElements[$ELEMENT_ID]["PROPERTY_".$ar["ID"]])
					&& $arElements[$ELEMENT_ID]["PROPERTY_".$ar["ID"]] !== ''
				;
				if ($emptyFilter || $notEmptyValue)
				{
					$val = $arElements[$ELEMENT_ID]["PROPERTY_".$ar["ID"]] ?? null;
					$ar["PROPERTY_VALUE_ID"] = $ELEMENT_ID . ":" . $ar["ID"];
					if ($ar["PROPERTY_TYPE"]=="L" && (int)$val > 0)
					{
						$arEnum = CIBlockPropertyEnum::GetByID($val);
						if($arEnum!==false)
						{
							$ar["VALUE_ENUM"] = $arEnum["VALUE"];
							$ar["VALUE_XML_ID"] = $arEnum["XML_ID"];
							$ar["VALUE_SORT"] = $arEnum["SORT"];
						}
					}
					else
					{
						$ar["VALUE_ENUM"] = "";
					}
					if($ar["PROPERTY_TYPE"]=="N" && $val <> '')
					{
						$val = CIBlock::NumberFormat($val);
					}
					$ar["DESCRIPTION"] = $arElements[$ELEMENT_ID]["DESCRIPTION_".$ar["ID"]] ?? null;
					$ar["VALUE"] = $val;
				}
				else
				{
					continue;
				}
			}
			if ($notEmptyFilter && $ar["PROPERTY_VALUE_ID"] == "")
				continue;
			$result[]=$ar;
		}
		$rs = new CIBlockPropertyResult;
		$rs->InitFromArray($result);
	}
	else
	{
		$rs = new CIBlockPropertyResult($DB->Query($strSql));
	}
	return $rs;
}