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