- Модуль: main
- Путь к файлу: ~/bitrix/modules/main/classes/general/userfieldenum.php
- Класс: CUserFieldEnum
- Вызов: CUserFieldEnum::SetEnumValues
function SetEnumValues($FIELD_ID, $values)
{
global $DB, $CACHE_MANAGER, $APPLICATION;
$aMsg = array();
$originalValues = $values;
foreach($values as $i => $row)
{
foreach($row as $key => $val)
{
if(strncmp($key, "~", 1) === 0)
{
unset($values[$i][$key]);
}
}
}
/*check unique XML_ID*/
$arAdded = array();
$salt = RandString(8);
foreach($values as $key => $value)
{
if(strncmp($key, "n", 1) === 0 && (!isset($value["DEL"]) || $value["DEL"] != "Y") && (string)$value["VALUE"] <> '')
{
if(!isset($value["XML_ID"]) || $value["XML_ID"] == '')
{
$values[$key]["XML_ID"] = $value["XML_ID"] = md5($salt . $value["VALUE"]);
}
if(array_key_exists($value["XML_ID"], $arAdded))
{
$aMsg[] = array("text" => GetMessage("USER_TYPE_XML_ID_UNIQ", array("#XML_ID#" => $value["XML_ID"])));
}
else
{
$rsEnum = $this->GetList(array(), array("USER_FIELD_ID" => $FIELD_ID, "XML_ID" => $value["XML_ID"]));
if($arEnum = $rsEnum->Fetch())
{
$aMsg[] = array("text" => GetMessage("USER_TYPE_XML_ID_UNIQ", array("#XML_ID#" => $value["XML_ID"])));
}
else
{
if (!isset($arAdded[$value["XML_ID"]]))
{
$arAdded[$value["XML_ID"]] = 0;
}
$arAdded[$value["XML_ID"]]++;
}
}
}
}
$previousValues = array();
$rsEnum = $this->GetList(array(), array("USER_FIELD_ID" => $FIELD_ID));
while($arEnum = $rsEnum->Fetch())
{
$previousValues[$arEnum["ID"]] = $arEnum;
if(array_key_exists($arEnum["ID"], $values))
{
$value = $values[$arEnum["ID"]];
if((string)$value["VALUE"] == '' || $value["DEL"] == "Y")
{
}
elseif(
$arEnum["VALUE"] != $value["VALUE"] ||
$arEnum["DEF"] != $value["DEF"] ||
$arEnum["SORT"] != $value["SORT"] ||
$arEnum["XML_ID"] != $value["XML_ID"]
)
{
if(!isset($value["XML_ID"]) || $value["XML_ID"] == '')
$value["XML_ID"] = md5($value["VALUE"]);
$bUnique = true;
if($arEnum["XML_ID"] != $value["XML_ID"])
{
if(array_key_exists($value["XML_ID"], $arAdded))
{
$aMsg[] = array("text" => GetMessage("USER_TYPE_XML_ID_UNIQ", array("#XML_ID#" => $value["XML_ID"])));
$bUnique = false;
}
else
{
$rsEnumXmlId = $this->GetList(array(), array("USER_FIELD_ID" => $FIELD_ID, "XML_ID" => $value["XML_ID"]));
if($arEnumXmlId = $rsEnumXmlId->Fetch())
{
$aMsg[] = array("text" => GetMessage("USER_TYPE_XML_ID_UNIQ", array("#XML_ID#" => $value["XML_ID"])));
$bUnique = false;
}
}
}
if($bUnique)
{
$arAdded[$value["XML_ID"]]++;
}
}
}
}
if(!empty($aMsg))
{
$e = new CAdminException($aMsg);
$APPLICATION->ThrowException($e);
return false;
}
if(CACHED_b_user_field_enum !== false)
$CACHE_MANAGER->CleanDir("b_user_field_enum");
foreach($values as $key => $value)
{
if(strncmp($key, "n", 1) === 0 && (!isset($value["DEL"]) || $value["DEL"] != "Y") && (string)$value["VALUE"] <> '')
{
if(!isset($value["XML_ID"]) || $value["XML_ID"] == '')
$value["XML_ID"] = md5($value["VALUE"]);
if($value["DEF"] != "Y")
$value["DEF"] = "N";
$value["USER_FIELD_ID"] = $FIELD_ID;
$id = $DB->Add("b_user_field_enum", $value);
$originalValues[$id] = $originalValues[$key];
unset($originalValues[$key], $values[$key]);
}
}
$rsEnum = $this->GetList(array(), array("USER_FIELD_ID" => $FIELD_ID));
while($arEnum = $rsEnum->Fetch())
{
if(array_key_exists($arEnum["ID"], $values))
{
$value = $values[$arEnum["ID"]];
if((string)$value["VALUE"] == '' || $value["DEL"] == "Y")
{
$DB->Query("DELETE FROM b_user_field_enum WHERE ID = " . $arEnum["ID"], false, "FILE: " . __FILE__ . "
LINE: " . __LINE__);
}
elseif($arEnum["VALUE"] != $value["VALUE"] ||
$arEnum["DEF"] != $value["DEF"] ||
$arEnum["SORT"] != $value["SORT"] ||
$arEnum["XML_ID"] != $value["XML_ID"])
{
if(!isset($value["XML_ID"]) || $value["XML_ID"] == '')
$value["XML_ID"] = md5($value["VALUE"]);
unset($value["ID"]);
$strUpdate = $DB->PrepareUpdate("b_user_field_enum", $value);
if($strUpdate <> '')
$DB->Query("UPDATE b_user_field_enum SET " . $strUpdate . " WHERE ID = " . $arEnum["ID"], false, "FILE: " . __FILE__ . "
LINE: " . __LINE__);
}
}
}
if(CACHED_b_user_field_enum !== false)
$CACHE_MANAGER->CleanDir("b_user_field_enum");
$event = new BitrixMainEvent('main', 'onAfterSetEnumValues', [$FIELD_ID, $originalValues, $previousValues]);
$event->send();
return true;
}