function Update($ID, $arFields)
{
/** @global CDatabase $DB */
global $DB;
$ID = (int)$ID;
$SAVED_PICTURE = null;
if(is_set($arFields, "EXTERNAL_ID"))
$arFields["XML_ID"] = $arFields["EXTERNAL_ID"];
if (array_key_exists("PICTURE", $arFields))
{
if (
!is_array($arFields["PICTURE"])
|| (
($arFields["PICTURE"]["name"] ?? '') === ''
&& ($arFields["PICTURE"]["del"] ?? '') === ''
)
)
{
unset($arFields["PICTURE"]);
}
else
{
$pic_res = $DB->Query("SELECT PICTURE FROM b_iblock WHERE ID=".$ID);
if($pic_res = $pic_res->Fetch())
{
$arFields["PICTURE"]["old_file"] = $pic_res["PICTURE"];
}
$arFields["PICTURE"]["MODULE_ID"] = "iblock";
}
}
if(is_set($arFields, "ACTIVE") && $arFields["ACTIVE"]!="Y")
$arFields["ACTIVE"]="N";
if(is_set($arFields, "WORKFLOW") && $arFields["WORKFLOW"]!="N")
$arFields["WORKFLOW"]="Y";
if(is_set($arFields, "BIZPROC") && $arFields["BIZPROC"]!="Y")
$arFields["BIZPROC"]="N";
if(is_set($arFields, "SECTION_CHOOSER") && $arFields["SECTION_CHOOSER"]!="D" && $arFields["SECTION_CHOOSER"]!="P")
$arFields["SECTION_CHOOSER"]="L";
if(is_set($arFields, "INDEX_SECTION") && $arFields["INDEX_SECTION"]!="Y")
$arFields["INDEX_SECTION"]="N";
if(is_set($arFields, "INDEX_ELEMENT") && $arFields["INDEX_ELEMENT"]!="Y")
$arFields["INDEX_ELEMENT"]="N";
if(is_set($arFields, "DESCRIPTION_TYPE") && $arFields["DESCRIPTION_TYPE"]!="html")
$arFields["DESCRIPTION_TYPE"] = "text";
if(is_set($arFields, "SITE_ID"))
$arFields["LID"] = $arFields["SITE_ID"];
if(is_set($arFields, "SECTION_PROPERTY"))
$arFields["SECTION_PROPERTY"] = "Y";
if(is_set($arFields, "PROPERTY_INDEX") && $arFields["PROPERTY_INDEX"]!="I" && $arFields["PROPERTY_INDEX"]!="Y")
$arFields["SECTION_PROPERTY"] = "N";
$RIGHTS_MODE = CIBlock::GetArrayByID($ID, "RIGHTS_MODE");
if(!$this->CheckFields($arFields, $ID))
{
$Result = false;
$arFields["RESULT_MESSAGE"] = &$this->LAST_ERROR;
}
else
{
$arLID = array();
$str_LID = "";
if(is_set($arFields, "LID"))
{
if(is_array($arFields["LID"]))
$arLID = $arFields["LID"];
else
$arLID[] = $arFields["LID"];
$arFields["LID"] = false;
$str_LID = "''";
foreach($arLID as $v)
{
$arFields["LID"] = $v;
$str_LID .= ", '".$DB->ForSql($v)."'";
}
}
unset($arFields["ID"]);
unset($arFields["VERSION"]);
if(array_key_exists("PICTURE", $arFields))
{
$SAVED_PICTURE = $arFields["PICTURE"];
CFile::SaveForDB($arFields, "PICTURE", "iblock");
}
$strUpdate = $DB->PrepareUpdate("b_iblock", $arFields, "iblock");
if(array_key_exists("PICTURE", $arFields))
$arFields["PICTURE"] = $SAVED_PICTURE;
$arBinds=Array();
if(is_set($arFields, "DESCRIPTION"))
$arBinds["DESCRIPTION"] = $arFields["DESCRIPTION"];
if($strUpdate <> '')
{
$strSql = "UPDATE b_iblock SET ".$strUpdate." WHERE ID=".$ID;
$DB->QueryBind($strSql, $arBinds);
}
$this->SetMessages($ID, $arFields);
if(isset($arFields["FIELDS"]) && is_array($arFields["FIELDS"]))
$this->SetFields($ID, $arFields["FIELDS"]);
if(array_key_exists("RIGHTS_MODE", $arFields))
{
if($arFields["RIGHTS_MODE"] === "E" && $RIGHTS_MODE !== "E")
{
CIBlock::SetPermission($ID, array());
}
elseif($arFields["RIGHTS_MODE"] !== "E" && $RIGHTS_MODE === "E")
{
$obIBlockRights = new CIBlockRights($ID);
$obIBlockRights->DeleteAllRights();
}
if($arFields["RIGHTS_MODE"] === "E")
$RIGHTS_MODE = "E";
}
if($RIGHTS_MODE === "E")
{
if(
!array_key_exists("RIGHTS", $arFields)
&& array_key_exists("GROUP_ID", $arFields)
&& is_array($arFields["GROUP_ID"])
)
{
$obIBlockRights = new CIBlockRights($ID);
$obIBlockRights->SetRights($obIBlockRights->ConvertGroups($arFields["GROUP_ID"]));
}
elseif(
array_key_exists("RIGHTS", $arFields)
&& is_array($arFields["RIGHTS"])
)
{
$obIBlockRights = new CIBlockRights($ID);
$obIBlockRights->SetRights($arFields["RIGHTS"]);
}
}
else
{
if(array_key_exists("GROUP_ID", $arFields) && is_array($arFields["GROUP_ID"]))
CIBlock::SetPermission($ID, $arFields["GROUP_ID"]);
}
if (array_key_exists("IPROPERTY_TEMPLATES", $arFields))
{
$ipropTemplates = new BitrixIblockInheritedPropertyIblockTemplates($ID);
$ipropTemplates->set($arFields["IPROPERTY_TEMPLATES"]);
}
if(!empty($arLID))
{
$strSql = "DELETE FROM b_iblock_site WHERE IBLOCK_ID=".$ID;
$DB->Query($strSql, false, "FILE: ".__FILE__."
LINE: ".__LINE__);
$strSql =
"INSERT INTO b_iblock_site(IBLOCK_ID, SITE_ID) ".
"SELECT ".$ID.", LID ".
"FROM b_lang ".
"WHERE LID IN (".$str_LID.") ";
$DB->Query($strSql, false, "FILE: ".__FILE__."
LINE: ".__LINE__);
}
if(CModule::IncludeModule("search"))
{
$dbAfter = $DB->Query("SELECT ACTIVE FROM b_iblock WHERE ID=".$ID);
$arAfter = $dbAfter->Fetch();
if($arAfter["ACTIVE"] != "Y")
CSearch::DeleteIndex("iblock", false, false, $ID);
}
CDiskQuota::recalculateDb();
$Result = true;
}
$this->CleanCache($ID);
$arFields["ID"] = $ID;
$arFields["RESULT"] = &$Result;
foreach (GetModuleEvents("iblock", "OnAfterIBlockUpdate", true) as $arEvent)
ExecuteModuleEventEx($arEvent, array(&$arFields));
self::clearIblockTagCache($ID);
return $Result;
}