• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/comp_pricetools.php
  • Класс: CIBlockPriceTools
  • Вызов: CIBlockPriceTools::GetProductProperties
static function GetProductProperties(
	$IBLOCK_ID,
	/** @noinspection PhpUnusedParameterInspection */$ELEMENT_ID,
	$arPropertiesList,
	$arPropertiesValues
)
{
	static $cache = array();
	static $userTypeList = array();
	$propertyTypeSupport = array(
		'Y' => array(
			'N' => true,
			'S' => true,
			'L' => true,
			'G' => true,
			'E' => true
		),
		'N' => array(
			'L' => true,
			'E' => true
		)
	);

	$result = array();
	foreach ($arPropertiesList as $pid)
	{
		if (preg_match("/[^A-Za-z0-9_]/", $pid) || !isset($arPropertiesValues[$pid]))
			continue;
		$prop = $arPropertiesValues[$pid];
		$prop['ID'] = (int)$prop['ID'];
		if (!isset($propertyTypeSupport[$prop['MULTIPLE']][$prop['PROPERTY_TYPE']]))
		{
			continue;
		}
		$emptyValues = true;
		$productProp = array('VALUES' => array(), 'SELECTED' => false, 'SET' => false);

		$userTypeProp = false;
		$userType = null;
		if (isset($prop['USER_TYPE']) && !empty($prop['USER_TYPE']))
		{
			if (!isset($userTypeList[$prop['USER_TYPE']]))
			{
				$userTypeDescr = CIBlockProperty::GetUserType($prop['USER_TYPE']);
				if (isset($userTypeDescr['GetPublicViewHTML']))
				{
					$userTypeList[$prop['USER_TYPE']] = $userTypeDescr['GetPublicViewHTML'];
				}
			}
			if (isset($userTypeList[$prop['USER_TYPE']]))
			{
				$userTypeProp = true;
				$userType = $userTypeList[$prop['USER_TYPE']];
			}
		}

		if ($prop["MULTIPLE"] == "Y" && !empty($prop["VALUE"]) && is_array($prop["VALUE"]))
		{
			if ($userTypeProp)
			{
				$countValues = 0;
				foreach($prop["VALUE"] as $value)
				{
					if (!is_scalar($value))
						continue;
					$value = (string)$value;
					$displayValue = (string)call_user_func_array($userType,
						array(
							$prop,
							array('VALUE' => $value),
							array(array('MODE' => 'SIMPLE_TEXT'))
						));
					if ('' !== $displayValue)
					{
						if ($productProp["SELECTED"] === false)
							$productProp["SELECTED"] = $value;
						$productProp["VALUES"][$value] = htmlspecialcharsbx($displayValue);
						$emptyValues = false;
						$countValues++;
					}
				}
				$productProp['SET'] = ($countValues === 1);
			}
			else
			{
				switch($prop["PROPERTY_TYPE"])
				{
				case "S":
				case "N":
					$countValues = 0;
					foreach($prop["VALUE"] as $value)
					{
						if (!is_scalar($value))
							continue;
						$value = (string)$value;
						if($value !== '')
						{
							if($productProp["SELECTED"] === false)
								$productProp["SELECTED"] = $value;
							$productProp["VALUES"][$value] = $value;
							$emptyValues = false;
							$countValues++;
						}
						$productProp['SET'] = ($countValues === 1);
					}
					break;
				case "G":
					$ar = array();
					foreach($prop["VALUE"] as $value)
					{
						$value = (int)$value;
						if($value > 0)
							$ar[] = $value;
					}
					if (!empty($ar))
					{
						$countValues = 0;
						$rsSections = CIBlockSection::GetList(
							array("LEFT_MARGIN"=>"ASC"),
							array("=ID" => $ar),
							false,
							array('ID', 'NAME')
						);
						while ($arSection = $rsSections->GetNext())
						{
							$arSection["ID"] = (int)$arSection["ID"];
							if ($productProp["SELECTED"] === false)
								$productProp["SELECTED"] = $arSection["ID"];
							$productProp["VALUES"][$arSection["ID"]] = $arSection["NAME"];
							$emptyValues = false;
							$countValues++;
						}
						$productProp['SET'] = ($countValues === 1);
					}
					break;
				case "E":
					$ar = array();
					foreach($prop["VALUE"] as $value)
					{
						$value = (int)$value;
						if($value > 0)
							$ar[] = $value;
					}
					if (!empty($ar))
					{
						$countValues = 0;
						$rsElements = CIBlockElement::GetList(
							array("ID" => "ASC"),
							array("=ID" => $ar),
							false,
							false,
							array("ID", "NAME")
						);
						while($arElement = $rsElements->GetNext())
						{
							$arElement['ID'] = (int)$arElement['ID'];
							if($productProp["SELECTED"] === false)
								$productProp["SELECTED"] = $arElement["ID"];
							$productProp["VALUES"][$arElement["ID"]] = $arElement["NAME"];
							$emptyValues = false;
							$countValues++;
						}
						$productProp['SET'] = ($countValues === 1);
					}
					break;
				case "L":
					$countValues = 0;
					foreach($prop["VALUE"] as $i => $value)
					{
						$prop["VALUE_ENUM_ID"][$i] = (int)$prop["VALUE_ENUM_ID"][$i];
						if($productProp["SELECTED"] === false)
							$productProp["SELECTED"] = $prop["VALUE_ENUM_ID"][$i];
						$productProp["VALUES"][$prop["VALUE_ENUM_ID"][$i]] = $value;
						$emptyValues = false;
						$countValues++;
					}
					$productProp['SET'] = ($countValues === 1);
					break;
				}
			}
		}
		elseif($prop["MULTIPLE"] == "N")
		{
			switch($prop["PROPERTY_TYPE"])
			{
			case "L":
				if (0 == (int)$prop["VALUE_ENUM_ID"])
				{
					if (isset($cache[$prop['ID']]))
					{
						$productProp = $cache[$prop['ID']];
						$emptyValues = false;
					}
					else
					{
						$rsEnum = CIBlockPropertyEnum::GetList(
							array("SORT"=>"ASC", "VALUE"=>"ASC"),
							array("IBLOCK_ID"=>$IBLOCK_ID, "PROPERTY_ID" => $prop['ID'])
						);
						while ($arEnum = $rsEnum->GetNext())
						{
							$arEnum["ID"] = (int)$arEnum["ID"];
							$productProp["VALUES"][$arEnum["ID"]] = $arEnum["VALUE"];
							if ($arEnum["DEF"] == "Y")
								$productProp["SELECTED"] = $arEnum["ID"];
							$emptyValues = false;
						}
						if (!$emptyValues)
						{
							$cache[$prop['ID']] = $productProp;
						}
					}
				}
				else
				{
					$prop['VALUE_ENUM_ID'] = (int)$prop['VALUE_ENUM_ID'];
					$productProp['VALUES'][$prop['VALUE_ENUM_ID']] = $prop['VALUE'];
					$productProp['SELECTED'] = $prop['VALUE_ENUM_ID'];
					$productProp['SET'] = true;
					$emptyValues = false;
				}
				break;
			case "E":
				if (0 == (int)$prop['VALUE'])
				{
					if (isset($cache[$prop['ID']]))
					{
						$productProp = $cache[$prop['ID']];
						$emptyValues = false;
					}
					else
					{
						if($prop["LINK_IBLOCK_ID"] > 0)
						{
							$rsElements = CIBlockElement::GetList(
								array("NAME"=>"ASC", "SORT"=>"ASC"),
								array("IBLOCK_ID"=>$prop["LINK_IBLOCK_ID"], "ACTIVE"=>"Y"),
								false, false,
								array("ID", "NAME")
							);
							while ($arElement = $rsElements->GetNext())
							{
								$arElement['ID'] = (int)$arElement['ID'];
								if($productProp["SELECTED"] === false)
									$productProp["SELECTED"] = $arElement["ID"];
								$productProp["VALUES"][$arElement["ID"]] = $arElement["NAME"];
								$emptyValues = false;
							}
							if (!$emptyValues)
							{
								$cache[$prop['ID']] = $productProp;
							}
						}
					}
				}
				else
				{
					$rsElements = CIBlockElement::GetList(
						array(),
						array('ID' => $prop["VALUE"], 'ACTIVE' => 'Y'),
						false,
						false,
						array('ID', 'NAME')
					);
					if ($arElement = $rsElements->GetNext())
					{
						$arElement['ID'] = (int)$arElement['ID'];
						$productProp['VALUES'][$arElement['ID']] = $arElement['NAME'];
						$productProp['SELECTED'] = $arElement['ID'];
						$productProp['SET'] = true;
						$emptyValues = false;
					}
				}
				break;
			}
		}

		if (!$emptyValues)
		{
			$result[$pid] = $productProp;
		}
	}

	return $result;
}