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