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

	if(is_set($arFields, "ACTIVE") && $arFields["ACTIVE"]!="Y")
		$arFields["ACTIVE"]="N";
	if(!isset($arFields["SEARCHABLE"]) || $arFields["SEARCHABLE"] != "Y")
		$arFields["SEARCHABLE"]="N";
	if(!isset($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))
	{
		$Result = false;
		$arFields["RESULT_MESSAGE"] = &$this->LAST_ERROR;
	}
	else
	{
		$arFields["VERSION"] = CIBlockElement::GetIBVersion($arFields["IBLOCK_ID"]);
		unset($arFields["ID"]);
		if(isset($arFields["USER_TYPE"]))
		{
			$arUserType = CIBlockProperty::GetUserType($arFields["USER_TYPE"]);
			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))
			{
				$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);
				}
			}
			else
			{
				$arFields["USER_TYPE_SETTINGS"] = false;
			}
		}
		else
		{
			$arFields["USER_TYPE_SETTINGS"] = false;
		}
		$ID = $DB->Add("b_iblock_property", $arFields, array('USER_TYPE_SETTINGS'), "iblock");

		if($arFields["VERSION"]==2)
		{
			if($this->_Add($ID, $arFields))
			{
				$Result = $ID;
				$arFields["ID"] = &$ID;
			}
			else
			{
				$DB->Query("DELETE FROM b_iblock_property WHERE ID = ".(int)$ID);
				$this->LAST_ERROR = GetMessage("IBLOCK_PROPERTY_ADD_ERROR",array(
					"#ID#"=>$ID,
					"#CODE#"=>"[14]".$DB->GetErrorSQL(),
				));
				$Result = false;
				$arFields["RESULT_MESSAGE"] = &$this->LAST_ERROR;
			}
		}
		else
		{
			$Result = $ID;
			$arFields["ID"] = &$ID;
		}

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

			if(CIBlock::GetArrayByID($arFields["IBLOCK_ID"], "SECTION_PROPERTY") === "Y")
			{
				if(
					!array_key_exists("SECTION_PROPERTY", $arFields)
					|| $arFields["SECTION_PROPERTY"] !== "N"
				)
				{
					$arLink = array(
						"SMART_FILTER" => $arFields["SMART_FILTER"] ?? null,
					);
					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::Add(0, $ID, $arLink);
				}
			}

			if (!empty($arFields['FEATURES']) && is_array($arFields['FEATURES']))
			{
				$featureResult = IblockModelPropertyFeature::addFeatures(
					$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"]);
	}

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

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

	return $Result;
}