RegisterTag("iblock_property_enum_".$a["PROPERTY_ID"]);
}
return $a;
}
}
class CIBlockPropertyEnum
{
public static function GetList($arOrder = array("SORT"=>"ASC", "VALUE"=>"ASC"), $arFilter = array())
{
global $DB;
$arSqlSearch = array();
foreach ($arFilter as $key => $val)
{
if ($key[0] == "!")
{
$key = mb_substr($key, 1);
$bInvert = true;
}
else
{
$bInvert = false;
}
$key = mb_strtoupper($key);
switch ($key)
{
case "CODE":
$arSqlSearch[] = CIBlock::FilterCreate("P.CODE", $val, "string", $bInvert);
break;
case "IBLOCK_ID":
$arSqlSearch[] = CIBlock::FilterCreate("P.IBLOCK_ID", $val, "number", $bInvert);
break;
case "DEF":
$arSqlSearch[] = CIBlock::FilterCreate("BEN.DEF", $val, "string_equal", $bInvert);
break;
case "EXTERNAL_ID":
$arSqlSearch[] = CIBlock::FilterCreate("BEN.XML_ID", $val, "string_equal", $bInvert);
break;
case "VALUE":
case "XML_ID":
case "TMP_ID":
$arSqlSearch[] = CIBlock::FilterCreate("BEN.".$key, $val, "string", $bInvert);
break;
case "PROPERTY_ID":
if(is_numeric(mb_substr($val, 0, 1)))
$arSqlSearch[] = CIBlock::FilterCreate("P.ID", $val, "number", $bInvert);
else
$arSqlSearch[] = CIBlock::FilterCreate("P.CODE", $val, "string", $bInvert);
break;
case "PROPERTY_ACTIVE":
$arSqlSearch[] = CIBlock::FilterCreate("P.ACTIVE", $val, "string_equal", $bInvert);
break;
case "ID":
case "SORT":
$arSqlSearch[] = CIBlock::FilterCreate("BEN.".$key, $val, "number", $bInvert);
break;
}
}
$strSqlSearch = "";
foreach(array_filter($arSqlSearch) as $sqlCondition)
$strSqlSearch .= " AND (".$sqlCondition.") ";
$arSqlOrder = array();
foreach ($arOrder as $by => $order)
{
$order = mb_strtolower($order) != "asc"? "desc": "asc";
$by = mb_strtoupper($by);
switch ($by)
{
case "ID":
case "PROPERTY_ID":
case "VALUE":
case "XML_ID":
case "EXTERNAL_ID":
case "DEF":
$arSqlOrder[$by] = "BEN.".$by." ".$order;
break;
case "PROPERTY_SORT":
$arSqlOrder[$by] = "P.SORT ".$order;
break;
case "PROPERTY_CODE":
$arSqlOrder[$by] = "P.CODE ".$order;
break;
default:
$arSqlOrder["SORT"] = " BEN.SORT ".$order;
break;
}
}
if (!empty($arSqlOrder))
$strSqlOrder = "ORDER BY ".implode(", ", $arSqlOrder);
else
$strSqlOrder = "";
$strSql = "
SELECT
BEN.*,
BEN.XML_ID as EXTERNAL_ID,
P.NAME as PROPERTY_NAME,
P.CODE as PROPERTY_CODE,
P.SORT as PROPERTY_SORT
FROM
b_iblock_property_enum BEN,
b_iblock_property P
WHERE
BEN.PROPERTY_ID=P.ID
$strSqlSearch
$strSqlOrder
";
$rs = $DB->Query($strSql, false, "FILE: ".__FILE__."
LINE: ".__LINE__);
return new CIBlockPropertyEnumResult($rs);
}
public static function Add($arFields)
{
global $DB, $CACHE_MANAGER;
if($arFields["VALUE"] == '')
return false;
if(CACHED_b_iblock_property_enum !== false)
$GLOBALS["CACHE_MANAGER"]->CleanDir("b_iblock_property_enum");
$allowedKeys = ["PROPERTY_ID", "VALUE", "DEF", "SORT", "XML_ID", "TMP_ID"];
$arFields = array_intersect_key($arFields, array_flip($allowedKeys));
if(is_set($arFields, "DEF") && $arFields["DEF"]!="Y")
$arFields["DEF"]="N";
if(is_set($arFields, "EXTERNAL_ID"))
$arFields["XML_ID"] = $arFields["EXTERNAL_ID"];
if(!is_set($arFields, "XML_ID"))
$arFields["XML_ID"] = md5(uniqid("", true));
$ID = $DB->Add("b_iblock_property_enum", $arFields);
if (defined("BX_COMP_MANAGED_CACHE"))
$CACHE_MANAGER->ClearByTag("iblock_property_enum_".$arFields["PROPERTY_ID"]);
return $ID;
}
public static function Update($ID, $arFields)
{
global $DB, $CACHE_MANAGER;
$ID = intval($ID);
if(is_set($arFields, "VALUE") && $arFields["VALUE"] == '')
return false;
if(CACHED_b_iblock_property_enum !== false)
$CACHE_MANAGER->CleanDir("b_iblock_property_enum");
if(is_set($arFields, "EXTERNAL_ID"))
$arFields["XML_ID"] = $arFields["EXTERNAL_ID"];
if(is_set($arFields, "DEF") && $arFields["DEF"]!="Y")
$arFields["DEF"]="N";
$strUpdate = $DB->PrepareUpdate("b_iblock_property_enum", $arFields);
if($strUpdate <> '')
$DB->Query("UPDATE b_iblock_property_enum SET ".$strUpdate." WHERE ID=".$ID);
if (defined("BX_COMP_MANAGED_CACHE") && intval($arFields["PROPERTY_ID"]) > 0)
$CACHE_MANAGER->ClearByTag("iblock_property_enum_".$arFields["PROPERTY_ID"]);
return true;
}
public static function DeleteByPropertyID($PROPERTY_ID, $bIgnoreError=false)
{
global $DB, $CACHE_MANAGER;
if(CACHED_b_iblock_property_enum !== false)
$CACHE_MANAGER->CleanDir("b_iblock_property_enum");
if (defined("BX_COMP_MANAGED_CACHE"))
$CACHE_MANAGER->ClearByTag("iblock_property_enum_".$PROPERTY_ID);
return $DB->Query("
DELETE FROM b_iblock_property_enum
WHERE PROPERTY_ID=".intval($PROPERTY_ID)."
", $bIgnoreError
);
}
public static function Delete($ID)
{
global $DB, $CACHE_MANAGER;
if(CACHED_b_iblock_property_enum !== false)
$CACHE_MANAGER->CleanDir("b_iblock_property_enum");
$DB->Query("
DELETE FROM b_iblock_property_enum
WHERE ID=".intval($ID)."
"
);
return true;
}
public static function GetByID($ID)
{
global $DB, $CACHE_MANAGER;
static $BX_IBLOCK_ENUM_CACHE = array();
static $bucket_size = null;
if ($bucket_size === null)
{
$bucket_size = intval(CACHED_b_iblock_property_enum_bucket_size);
if ($bucket_size <= 0)
$bucket_size = 10;
}
$ID = intval($ID);
$bucket = intval($ID/$bucket_size);
if (
!isset($BX_IBLOCK_ENUM_CACHE[$bucket])
|| !array_key_exists($ID, $BX_IBLOCK_ENUM_CACHE[$bucket])
)
{
if (CACHED_b_iblock_property_enum === false)
{
$rs = $DB->Query("SELECT * from b_iblock_property_enum WHERE ID=".$ID);
$BX_IBLOCK_ENUM_CACHE[$bucket][$ID] = $rs->Fetch();
}
elseif (!isset($BX_IBLOCK_ENUM_CACHE[$bucket]))
{
if ($CACHE_MANAGER->Read(CACHED_b_iblock_property_enum, $cache_id="b_iblock_property_enum".$bucket, "b_iblock_property_enum"))
{
$arEnums = $CACHE_MANAGER->Get($cache_id);
}
else
{
$arEnums = array();
$rs = $DB->Query("
SELECT *
FROM b_iblock_property_enum
WHERE ID between ".($bucket*$bucket_size)." AND ".(($bucket+1)*$bucket_size-1)
);
while($ar = $rs->Fetch())
{
$arEnums[$ar["ID"]] = $ar;
}
$CACHE_MANAGER->Set($cache_id, $arEnums);
}
$BX_IBLOCK_ENUM_CACHE[$bucket] = $arEnums;
}
}
return $BX_IBLOCK_ENUM_CACHE[$bucket][$ID];
}
}
?>