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