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