- Модуль: iblock
- Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblockproperty.php
- Класс: CAllIBlockProperty
- Вызов: CAllIBlockProperty::UpdateEnum
function UpdateEnum($ID, $arVALUES, $bForceDelete = true)
{
global $DB, $CACHE_MANAGER;
$ID = intval($ID);
if(!is_array($arVALUES) || (empty($arVALUES) && $bForceDelete))
{
CIBlockPropertyEnum::DeleteByPropertyID($ID);
return true;
}
$ar_XML_ID = array();
$db_res = $this->GetPropertyEnum($ID);
while($res = $db_res->Fetch())
{
$ar_XML_ID[rtrim($res["XML_ID"], " ")] = $res["ID"];
}
$sqlWhere = "";
if(!$bForceDelete)
{
$rsProp = CIBlockProperty::GetByID($ID);
if($arProp = $rsProp->Fetch())
{
if($arProp["VERSION"] == 1)
$sqlWhere = "AND NOT EXISTS (
SELECT *
FROM b_iblock_element_property
WHERE b_iblock_element_property.IBLOCK_PROPERTY_ID = b_iblock_property_enum.PROPERTY_ID
AND b_iblock_element_property.VALUE_ENUM = b_iblock_property_enum.ID
)";
elseif($arProp["MULTIPLE"] == "N")
$sqlWhere = "AND NOT EXISTS (
SELECT *
FROM b_iblock_element_prop_s".$arProp["IBLOCK_ID"]."
WHERE b_iblock_element_prop_s".$arProp["IBLOCK_ID"].".PROPERTY_".$arProp["ID"]." = b_iblock_property_enum.ID
)";
else
$sqlWhere = "AND NOT EXISTS (
SELECT *
FROM b_iblock_element_prop_m".$arProp["IBLOCK_ID"]."
WHERE b_iblock_element_prop_m".$arProp["IBLOCK_ID"].".IBLOCK_PROPERTY_ID = b_iblock_property_enum.PROPERTY_ID
AND b_iblock_element_prop_m".$arProp["IBLOCK_ID"].".VALUE_ENUM = b_iblock_property_enum.ID
)";
}
}
$db_res = $this->GetPropertyEnum($ID);
while($res = $db_res->Fetch())
{
$VALUE = $arVALUES[$res["ID"]];
$VAL = is_array($VALUE)? $VALUE["VALUE"]: $VALUE;
UnSet($arVALUES[$res["ID"]]);
if((string)$VAL == '')
{
unset($ar_XML_ID[rtrim($res["XML_ID"], " ")]);
$strSql = "
DELETE FROM b_iblock_property_enum
WHERE ID=".$res["ID"]."
".$sqlWhere."
";
$DB->Query($strSql);
}
else
{
$DEF = "";
$SORT = 0;
$XML_ID = "";
if(is_array($VALUE))
{
if(array_key_exists("DEF", $VALUE))
$DEF = $VALUE["DEF"]=="Y"? "Y": "N";
if(array_key_exists("SORT", $VALUE))
$SORT = intval($VALUE["SORT"]);
if($SORT < 0)
$SORT = 0;
if(array_key_exists("XML_ID", $VALUE) && mb_strlen($VALUE["XML_ID"]))
$XML_ID = mb_substr(rtrim($VALUE["XML_ID"], " "), 0, 200);
elseif(array_key_exists("EXTERNAL_ID", $VALUE) && mb_strlen($VALUE["EXTERNAL_ID"]))
$XML_ID = mb_substr(rtrim($VALUE["EXTERNAL_ID"], " "), 0, 200);
}
if($XML_ID)
{
unset($ar_XML_ID[mb_strtolower(rtrim($res["XML_ID"], " "))]);
if (isset($ar_XML_ID[mb_strtolower($XML_ID)]))
$XML_ID = md5(uniqid(""));
$ar_XML_ID[mb_strtolower($XML_ID)] = $res["ID"];
}
$strSql = "
UPDATE b_iblock_property_enum
SET
".($DEF? " DEF = '".$DEF."', ":"")."
".($SORT? " SORT = ".$SORT.", ":"")."
".($XML_ID? " XML_ID = '".$DB->ForSQL($XML_ID, 200)."', ":"")."
VALUE = '".$DB->ForSQL($VAL, 255)."'
WHERE
ID = ".$res["ID"]."
";
$DB->Query($strSql);
}
}
foreach($arVALUES as $id => $VALUE)
{
$VAL = is_array($VALUE)? $VALUE["VALUE"]: $VALUE;
if((string)$id <> '' && (string)$VAL <> '')
{
$DEF = "";
$SORT = 0;
$XML_ID = "";
if(is_array($VALUE))
{
if(array_key_exists("DEF", $VALUE))
$DEF = $VALUE["DEF"]=="Y"? "Y": "N";
if(array_key_exists("SORT", $VALUE))
$SORT = intval($VALUE["SORT"]);
if($SORT < 0)
$SORT = 0;
if(array_key_exists("XML_ID", $VALUE) && mb_strlen($VALUE["XML_ID"]))
$XML_ID = mb_substr(rtrim($VALUE["XML_ID"], " "), 0, 200);
elseif(array_key_exists("EXTERNAL_ID", $VALUE) && mb_strlen($VALUE["EXTERNAL_ID"]))
$XML_ID = mb_substr(rtrim($VALUE["EXTERNAL_ID"], " "), 0, 200);
}
if($XML_ID)
{
if (isset($ar_XML_ID[mb_strtolower($XML_ID)]))
$XML_ID = md5(uniqid("", true));
}
else
{
$XML_ID = md5(uniqid("", true));
}
$ar_XML_ID[mb_strtolower($XML_ID)] = 0;
$strSql = "
INSERT INTO b_iblock_property_enum
(
PROPERTY_ID
".($DEF? ",DEF": "")."
".($SORT? ",SORT": "")."
,VALUE
,XML_ID
) VALUES (
".$ID."
".($DEF? ",'".$DEF."'": "")."
".($SORT? ",".$SORT."": "")."
,'".$DB->ForSQL($VAL, 255)."'
,'".$DB->ForSQL($XML_ID, 200)."'
)
";
$DB->Query($strSql);
}
}
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_".$ID);
return true;
}