- Модуль: 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;
}