• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblockproperty.php
  • Класс: CAllIBlockProperty
  • Вызов: CAllIBlockProperty::Update
public function Update($ID, $arFields, $bCheckDescription = false)
{
	global $DB;
	$ID = (int)$ID;

	if(is_set($arFields, "ACTIVE") && $arFields["ACTIVE"]!="Y")
		$arFields["ACTIVE"]="N";
	if(is_set($arFields, "SEARCHABLE") && $arFields["SEARCHABLE"]!="Y")
		$arFields["SEARCHABLE"]="N";
	if(is_set($arFields, "FILTRABLE") && $arFields["FILTRABLE"]!="Y")
		$arFields["FILTRABLE"]="N";
	if(is_set($arFields, "MULTIPLE") && $arFields["MULTIPLE"]!="Y")
		$arFields["MULTIPLE"]="N";
	if(is_set($arFields, "LIST_TYPE") && $arFields["LIST_TYPE"]!="C")
		$arFields["LIST_TYPE"]="L";

	if(!$this->CheckFields($arFields, $ID))
	{
		$Result = false;
		$arFields["RESULT_MESSAGE"] = &$this->LAST_ERROR;
	}
	elseif(!$this->_Update($ID, $arFields, $bCheckDescription))
	{
		$Result = false;
		$arFields["RESULT_MESSAGE"] = &$this->LAST_ERROR;
	}
	else
	{
		$arUserType = [];
		$userTypeId = (string)($arFields['USER_TYPE'] ?? '');
		if ($userTypeId !== '')
		{
			$arUserType = CIBlockProperty::GetUserType($userTypeId);
		}
		if (!empty($arUserType))
		{
			if(array_key_exists("ConvertToDB", $arUserType))
			{
				$arValue = array(
					"VALUE" => $arFields["DEFAULT_VALUE"],
					"DEFAULT_VALUE" => true
				);
				$arValue = call_user_func_array($arUserType["ConvertToDB"], array($arFields, $arValue));
				if(is_array($arValue) && isset($arValue["VALUE"]) && mb_strlen($arValue["VALUE"]))
					$arFields["DEFAULT_VALUE"] = $arValue["VALUE"];
				else
					$arFields["DEFAULT_VALUE"] = false;
			}

			if(array_key_exists("PrepareSettings", $arUserType))
			{
				if (!isset($arFields["USER_TYPE_SETTINGS"]))
				{
					$oldData = IblockPropertyTable::getList(array(
						'select' => array('ID', 'PROPERTY_TYPE', 'USER_TYPE', 'USER_TYPE_SETTINGS'),
						'filter' => array('=ID' => $ID)
					))->fetch();
					if (!empty($oldData) && is_array($oldData))
					{
						if ($arFields["USER_TYPE"] == $oldData["USER_TYPE"] && !empty($oldData["USER_TYPE_SETTINGS"]))
						{
							$arFields["USER_TYPE_SETTINGS"] = (
								is_array($oldData["USER_TYPE_SETTINGS"])
									? $oldData["USER_TYPE_SETTINGS"]
									: unserialize($oldData["USER_TYPE_SETTINGS"], ['allowed_classes' => false])
							);
						}
					}
					unset($oldData);
				}
				$arFieldsResult = call_user_func_array($arUserType["PrepareSettings"], array($arFields));
				if (is_array($arFieldsResult) && array_key_exists('USER_TYPE_SETTINGS', $arFieldsResult))
				{
					$arFields = array_merge($arFields, $arFieldsResult);
					$arFields["USER_TYPE_SETTINGS"] = serialize($arFields["USER_TYPE_SETTINGS"]);
				}
				else
				{
					$arFields["USER_TYPE_SETTINGS"] = serialize($arFieldsResult);
				}
				unset($arFieldsResult);
			}
			else
			{
				$arFields["USER_TYPE_SETTINGS"] = false;
			}
		}
		else
		{
			if (isset($arFields['DEFAULT_VALUE']) && !is_scalar($arFields['DEFAULT_VALUE']))
			{
				$arFields['DEFAULT_VALUE'] = false;
			}
			if (isset($arFields["USER_TYPE_SETTINGS"]))
			{
				if (is_array($arFields["USER_TYPE_SETTINGS"]))
				{
					$arFields["USER_TYPE_SETTINGS"] = serialize($arFields["USER_TYPE_SETTINGS"]);
				}
				if (!is_scalar($arFields["USER_TYPE_SETTINGS"]))
				{
					$arFields["USER_TYPE_SETTINGS"] = false;
				}
			}
		}
		unset($arUserType);

		unset($arFields["ID"]);
		unset($arFields["VERSION"]);
		unset($arFields["TIMESTAMP_X"]);

		$strUpdate = $DB->PrepareUpdate("b_iblock_property", $arFields);
		if($strUpdate <> '')
		{
			$strSql = "UPDATE b_iblock_property SET ".$strUpdate." WHERE ID=".$ID;
			$bindList = [];
			if (isset($arFields['USER_TYPE_SETTINGS']))
			{
				$bindList['USER_TYPE_SETTINGS'] = $arFields['USER_TYPE_SETTINGS'];
			}
			$DB->QueryBind($strSql, $bindList);
		}

		if(is_set($arFields, "VALUES"))
			$this->UpdateEnum($ID, $arFields["VALUES"]);

		if(
			array_key_exists("IBLOCK_ID", $arFields)
			&& CIBlock::GetArrayByID($arFields["IBLOCK_ID"], "SECTION_PROPERTY") === "Y"
		)
		{
			if(
				!array_key_exists("SECTION_PROPERTY", $arFields)
				|| $arFields["SECTION_PROPERTY"] !== "N"
			)
			{
				$arLink = [];
				if (array_key_exists("SMART_FILTER", $arFields))
				{
					$arLink["SMART_FILTER"] = $arFields["SMART_FILTER"];
				}
				if (array_key_exists("DISPLAY_TYPE", $arFields))
					$arLink["DISPLAY_TYPE"] = $arFields["DISPLAY_TYPE"];
				if (array_key_exists("DISPLAY_EXPANDED", $arFields))
					$arLink["DISPLAY_EXPANDED"] = $arFields["DISPLAY_EXPANDED"];
				if (array_key_exists("FILTER_HINT", $arFields))
					$arLink["FILTER_HINT"] = $arFields["FILTER_HINT"];
				CIBlockSectionPropertyLink::Set(0, $ID, $arLink);
			}
			else
			{
				CIBlockSectionPropertyLink::Delete(0, $ID);
			}
		}

		if (!empty($arFields['FEATURES']) && is_array($arFields['FEATURES']))
		{
			$featureResult = IblockModelPropertyFeature::setFeatures(
				$ID,
				$arFields['FEATURES']
			);
			//TODO: add error handling
			unset($featureResult);
		}

		IblockPropertyTable::cleanCache();

		global $BX_IBLOCK_PROP_CACHE;
		if (isset($arFields["IBLOCK_ID"]))
		{
			unset($BX_IBLOCK_PROP_CACHE[$arFields["IBLOCK_ID"]]);
			CIBlock::clearIblockTagCache($arFields["IBLOCK_ID"]);
		}

		$Result = true;
	}

	$arFields["ID"] = $ID;
	$arFields["RESULT"] = &$Result;

	foreach (GetModuleEvents("iblock", "OnAfterIBlockPropertyUpdate", true) as $arEvent)
		ExecuteModuleEventEx($arEvent, array(&$arFields));

	return $Result;
}