function Update($ID, $arFields, $bResort=true, $bUpdateSearch=true, $bResizePictures=false)
{
global $USER, $DB, $APPLICATION;
$ID = (int)$ID;
$iterator = CIBlockSection::GetList(Array(), Array("ID"=>$ID, "CHECK_PERMISSIONS"=>"N"));
$db_record = $iterator->Fetch();
unset($iterator);
if (empty($db_record))
{
return false;
}
if(is_set($arFields, "EXTERNAL_ID"))
$arFields["XML_ID"] = $arFields["EXTERNAL_ID"];
unset($arFields["GLOBAL_ACTIVE"]);
unset($arFields["DEPTH_LEVEL"]);
unset($arFields["LEFT_MARGIN"]);
unset($arFields["RIGHT_MARGIN"]);
unset($arFields["IBLOCK_ID"]);
unset($arFields["DATE_CREATE"]);
unset($arFields["CREATED_BY"]);
$strWarning = '';
if ($this->iblock !== null && $this->iblock['ID'] === (int)$db_record["IBLOCK_ID"])
{
$arIBlock = $this->iblock;
}
else
{
$arIBlock = CIBlock::GetArrayByID($db_record["IBLOCK_ID"]);
}
if($bResizePictures)
{
$arDef = $arIBlock["FIELDS"]["SECTION_PICTURE"]["DEFAULT_VALUE"];
if(
$arDef["DELETE_WITH_DETAIL"] === "Y"
&& $arFields["DETAIL_PICTURE"]["del"] === "Y"
)
{
$arFields["PICTURE"]["del"] = "Y";
}
if(
$arDef["FROM_DETAIL"] === "Y"
&& (
$arFields["PICTURE"]["size"] <= 0
|| $arDef["UPDATE_WITH_DETAIL"] === "Y"
)
&& is_array($arFields["DETAIL_PICTURE"])
&& $arFields["DETAIL_PICTURE"]["size"] > 0
)
{
if(
$arFields["PICTURE"]["del"] !== "Y"
&& $arDef["UPDATE_WITH_DETAIL"] !== "Y"
)
{
$arOldSection = $db_record;
}
else
{
$arOldSection = false;
}
if(!$arOldSection || !$arOldSection["PICTURE"])
{
$arNewPreview = $arFields["DETAIL_PICTURE"];
$arNewPreview["COPY_FILE"] = "Y";
$arNewPreview["description"] = $arFields["PICTURE"]["description"];
$arFields["PICTURE"] = $arNewPreview;
}
}
if(
array_key_exists("PICTURE", $arFields)
&& is_array($arFields["PICTURE"])
&& $arFields["PICTURE"]["size"] > 0
&& $arDef["SCALE"] === "Y"
)
{
$arNewPicture = CIBlock::ResizePicture($arFields["PICTURE"], $arDef);
if(is_array($arNewPicture))
{
$arNewPicture["description"] = $arFields["PICTURE"]["description"];
$arFields["PICTURE"] = $arNewPicture;
}
elseif($arDef["IGNORE_ERRORS"] !== "Y")
{
unset($arFields["PICTURE"]);
$strWarning .= GetMessage("IBLOCK_FIELD_PREVIEW_PICTURE").": ".$arNewPicture."
";
}
}
if(
array_key_exists("PICTURE", $arFields)
&& is_array($arFields["PICTURE"])
&& $arDef["USE_WATERMARK_FILE"] === "Y"
)
{
if(
$arFields["PICTURE"]["tmp_name"] <> ''
&& (
$arFields["PICTURE"]["tmp_name"] === $arFields["DETAIL_PICTURE"]["tmp_name"]
|| ($arFields["PICTURE"]["COPY_FILE"] == "Y" && !$arFields["PICTURE"]["copy"])
)
)
{
$tmp_name = CTempFile::GetFileName(basename($arFields["PICTURE"]["tmp_name"]));
CheckDirPath($tmp_name);
copy($arFields["PICTURE"]["tmp_name"], $tmp_name);
$arFields["PICTURE"]["copy"] = true;
$arFields["PICTURE"]["tmp_name"] = $tmp_name;
}
CIBlock::FilterPicture($arFields["PICTURE"]["tmp_name"], array(
"name" => "watermark",
"position" => $arDef["WATERMARK_FILE_POSITION"],
"type" => "file",
"size" => "real",
"alpha_level" => 100 - min(max($arDef["WATERMARK_FILE_ALPHA"], 0), 100),
"file" => $_SERVER["DOCUMENT_ROOT"].Rel2Abs("/", $arDef["WATERMARK_FILE"]),
));
}
if(
array_key_exists("PICTURE", $arFields)
&& is_array($arFields["PICTURE"])
&& $arDef["USE_WATERMARK_TEXT"] === "Y"
)
{
if(
$arFields["PICTURE"]["tmp_name"] <> ''
&& (
$arFields["PICTURE"]["tmp_name"] === $arFields["DETAIL_PICTURE"]["tmp_name"]
|| ($arFields["PICTURE"]["COPY_FILE"] == "Y" && !$arFields["PICTURE"]["copy"])
)
)
{
$tmp_name = CTempFile::GetFileName(basename($arFields["PICTURE"]["tmp_name"]));
CheckDirPath($tmp_name);
copy($arFields["PICTURE"]["tmp_name"], $tmp_name);
$arFields["PICTURE"]["copy"] = true;
$arFields["PICTURE"]["tmp_name"] = $tmp_name;
}
CIBlock::FilterPicture($arFields["PICTURE"]["tmp_name"], array(
"name" => "watermark",
"position" => $arDef["WATERMARK_TEXT_POSITION"],
"type" => "text",
"coefficient" => $arDef["WATERMARK_TEXT_SIZE"],
"text" => $arDef["WATERMARK_TEXT"],
"font" => $_SERVER["DOCUMENT_ROOT"].Rel2Abs("/", $arDef["WATERMARK_TEXT_FONT"]),
"color" => $arDef["WATERMARK_TEXT_COLOR"],
));
}
$arDef = $arIBlock["FIELDS"]["SECTION_DETAIL_PICTURE"]["DEFAULT_VALUE"];
if(
array_key_exists("DETAIL_PICTURE", $arFields)
&& is_array($arFields["DETAIL_PICTURE"])
&& $arDef["SCALE"] === "Y"
)
{
$arNewPicture = CIBlock::ResizePicture($arFields["DETAIL_PICTURE"], $arDef);
if(is_array($arNewPicture))
{
$arNewPicture["description"] = $arFields["DETAIL_PICTURE"]["description"];
$arFields["DETAIL_PICTURE"] = $arNewPicture;
}
elseif($arDef["IGNORE_ERRORS"] !== "Y")
{
unset($arFields["DETAIL_PICTURE"]);
$strWarning .= GetMessage("IBLOCK_FIELD_DETAIL_PICTURE").": ".$arNewPicture."
";
}
}
if(
array_key_exists("DETAIL_PICTURE", $arFields)
&& is_array($arFields["DETAIL_PICTURE"])
&& $arDef["USE_WATERMARK_FILE"] === "Y"
)
{
if(
$arFields["DETAIL_PICTURE"]["tmp_name"] <> ''
&& (
$arFields["DETAIL_PICTURE"]["tmp_name"] === $arFields["PICTURE"]["tmp_name"]
|| ($arFields["DETAIL_PICTURE"]["COPY_FILE"] == "Y" && !$arFields["DETAIL_PICTURE"]["copy"])
)
)
{
$tmp_name = CTempFile::GetFileName(basename($arFields["DETAIL_PICTURE"]["tmp_name"]));
CheckDirPath($tmp_name);
copy($arFields["DETAIL_PICTURE"]["tmp_name"], $tmp_name);
$arFields["DETAIL_PICTURE"]["copy"] = true;
$arFields["DETAIL_PICTURE"]["tmp_name"] = $tmp_name;
}
CIBlock::FilterPicture($arFields["DETAIL_PICTURE"]["tmp_name"], array(
"name" => "watermark",
"position" => $arDef["WATERMARK_FILE_POSITION"],
"type" => "file",
"size" => "real",
"alpha_level" => 100 - min(max($arDef["WATERMARK_FILE_ALPHA"], 0), 100),
"file" => $_SERVER["DOCUMENT_ROOT"].Rel2Abs("/", $arDef["WATERMARK_FILE"]),
"fill" => "resize",
));
}
if(
array_key_exists("DETAIL_PICTURE", $arFields)
&& is_array($arFields["DETAIL_PICTURE"])
&& $arDef["USE_WATERMARK_TEXT"] === "Y"
)
{
if(
$arFields["DETAIL_PICTURE"]["tmp_name"] <> ''
&& (
$arFields["DETAIL_PICTURE"]["tmp_name"] === $arFields["PICTURE"]["tmp_name"]
|| ($arFields["DETAIL_PICTURE"]["COPY_FILE"] == "Y" && !$arFields["DETAIL_PICTURE"]["copy"])
)
)
{
$tmp_name = CTempFile::GetFileName(basename($arFields["DETAIL_PICTURE"]["tmp_name"]));
CheckDirPath($tmp_name);
copy($arFields["DETAIL_PICTURE"]["tmp_name"], $tmp_name);
$arFields["DETAIL_PICTURE"]["copy"] = true;
$arFields["DETAIL_PICTURE"]["tmp_name"] = $tmp_name;
}
CIBlock::FilterPicture($arFields["DETAIL_PICTURE"]["tmp_name"], array(
"name" => "watermark",
"position" => $arDef["WATERMARK_TEXT_POSITION"],
"type" => "text",
"coefficient" => $arDef["WATERMARK_TEXT_SIZE"],
"text" => $arDef["WATERMARK_TEXT"],
"font" => $_SERVER["DOCUMENT_ROOT"].Rel2Abs("/", $arDef["WATERMARK_TEXT_FONT"]),
"color" => $arDef["WATERMARK_TEXT_COLOR"],
));
}
}
$ipropTemplates = new BitrixIblockInheritedPropertySectionTemplates($db_record["IBLOCK_ID"], $db_record["ID"]);
if (array_key_exists("PICTURE", $arFields))
{
if (!is_array($arFields["PICTURE"]))
{
unset($arFields["PICTURE"]);
}
elseif (
($arFields["PICTURE"]["name"] ?? '') === ''
&& ($arFields["PICTURE"]["del"] ?? '') === ''
&& !array_key_exists("description", $arFields["PICTURE"])
)
{
unset($arFields["PICTURE"]);
}
else
{
$arFields["PICTURE"]["old_file"] = $db_record["PICTURE"];
$arFields["PICTURE"]["MODULE_ID"] = "iblock";
$arFields["PICTURE"]["name"] = BitrixIblockTemplateHelper::makeFileName(
$ipropTemplates
,"SECTION_PICTURE_FILE_NAME"
,array_merge($db_record, $arFields)
,$arFields["PICTURE"]
);
}
}
if (array_key_exists("DETAIL_PICTURE", $arFields))
{
if (!is_array($arFields["DETAIL_PICTURE"]))
{
unset($arFields["DETAIL_PICTURE"]);
}
elseif (
($arFields["DETAIL_PICTURE"]["name"] ?? '') === ''
&& ($arFields["DETAIL_PICTURE"]["del"] ?? '') === ''
&& !array_key_exists("description", $arFields["DETAIL_PICTURE"])
)
{
unset($arFields["DETAIL_PICTURE"]);
}
else
{
$arFields["DETAIL_PICTURE"]["old_file"] = $db_record["DETAIL_PICTURE"];
$arFields["DETAIL_PICTURE"]["MODULE_ID"] = "iblock";
$arFields["DETAIL_PICTURE"]["name"] = BitrixIblockTemplateHelper::makeFileName(
$ipropTemplates
,"SECTION_DETAIL_PICTURE_FILE_NAME"
,array_merge($db_record, $arFields)
,$arFields["DETAIL_PICTURE"]
);
}
}
if(is_set($arFields, "ACTIVE") && $arFields["ACTIVE"]!="Y")
$arFields["ACTIVE"]="N";
if(is_set($arFields, "DESCRIPTION_TYPE") && $arFields["DESCRIPTION_TYPE"]!="html")
$arFields["DESCRIPTION_TYPE"] = "text";
if(isset($arFields["IBLOCK_SECTION_ID"]))
{
$arFields["IBLOCK_SECTION_ID"] = intval($arFields["IBLOCK_SECTION_ID"]);
if($arFields["IBLOCK_SECTION_ID"] <= 0)
$arFields["IBLOCK_SECTION_ID"] = false;
}
$DESC_tmp = is_set($arFields, "DESCRIPTION")? $arFields["DESCRIPTION"]: $db_record["DESCRIPTION"];
$DESC_TYPE_tmp = is_set($arFields, "DESCRIPTION_TYPE")? $arFields["DESCRIPTION_TYPE"]: $db_record["DESCRIPTION_TYPE"];
$arFields["SEARCHABLE_CONTENT"] = mb_strtoupper(
(is_set($arFields, "NAME")? $arFields["NAME"]: $db_record["NAME"])."rn".
($DESC_TYPE_tmp=="html"? HTMLToTxt($DESC_tmp): $DESC_tmp)
);
if(is_object($USER))
{
if(!isset($arFields["MODIFIED_BY"]) || intval($arFields["MODIFIED_BY"]) <= 0)
$arFields["MODIFIED_BY"] = intval($USER->GetID());
}
if(!$this->CheckFields($arFields, $ID))
{
$Result = false;
$arFields["RESULT_MESSAGE"] = &$this->LAST_ERROR;
}
elseif(!$GLOBALS["USER_FIELD_MANAGER"]->CheckFields("IBLOCK_".$db_record["IBLOCK_ID"]."_SECTION", $ID, $arFields))
{
$Result = false;
$err = $APPLICATION->GetException();
if(is_object($err))
$this->LAST_ERROR .= str_replace("
", "
", $err->GetString()."
");
$arFields["RESULT_MESSAGE"] = &$this->LAST_ERROR;
}
else
{
if(array_key_exists("PICTURE", $arFields))
{
$SAVED_PICTURE = $arFields["PICTURE"];
CFile::SaveForDB($arFields, "PICTURE", "iblock");
}
if(array_key_exists("DETAIL_PICTURE", $arFields))
{
$SAVED_DETAIL_PICTURE = $arFields["DETAIL_PICTURE"];
CFile::SaveForDB($arFields, "DETAIL_PICTURE", "iblock");
}
unset($arFields["ID"]);
$strUpdate = $DB->PrepareUpdate("b_iblock_section", $arFields, "iblock");
$arFields["ID"] = $ID;
if(array_key_exists("PICTURE", $arFields))
$arFields["PICTURE"] = $SAVED_PICTURE;
if(array_key_exists("DETAIL_PICTURE", $arFields))
$arFields["DETAIL_PICTURE"] = $SAVED_DETAIL_PICTURE;
CIBlock::_transaction_lock($db_record["IBLOCK_ID"]);
if($strUpdate <> '')
{
$strSql = "UPDATE b_iblock_section SET ".$strUpdate." WHERE ID = ".$ID;
$arBinds=Array();
if(array_key_exists("DESCRIPTION", $arFields))
$arBinds["DESCRIPTION"] = $arFields["DESCRIPTION"];
if(array_key_exists("SEARCHABLE_CONTENT", $arFields))
$arBinds["SEARCHABLE_CONTENT"] = $arFields["SEARCHABLE_CONTENT"];
$DB->QueryBind($strSql, $arBinds);
}
if($bResort)
{
$this->recountTreeAfterUpdate($arFields, $db_record);
}
unset(self::$arSectionCodeCache[$ID]);
self::$arSectionPathCache = array();
self::$arSectionNavChainCache = array();
if($arIBlock["RIGHTS_MODE"] === "E")
{
$obSectionRights = new CIBlockSectionRights($arIBlock["ID"], $ID);
//Check if parent changed with extended rights mode
if(
isset($arFields["IBLOCK_SECTION_ID"])
&& $arFields["IBLOCK_SECTION_ID"] != $db_record["IBLOCK_SECTION_ID"]
)
{
$obSectionRights->ChangeParents(array($db_record["IBLOCK_SECTION_ID"]), array($arFields["IBLOCK_SECTION_ID"]));
}
if(array_key_exists("RIGHTS", $arFields) && is_array($arFields["RIGHTS"]))
$obSectionRights->SetRights($arFields["RIGHTS"]);
}
if (array_key_exists("IPROPERTY_TEMPLATES", $arFields))
{
$ipropTemplates = new BitrixIblockInheritedPropertySectionTemplates($arIBlock["ID"], $ID);
$ipropTemplates->set($arFields["IPROPERTY_TEMPLATES"]);
}
$uf_updated = $GLOBALS["USER_FIELD_MANAGER"]->Update("IBLOCK_".$db_record["IBLOCK_ID"]."_SECTION", $ID, $arFields);
if($uf_updated)
{
$DB->Query("UPDATE b_iblock_section SET TIMESTAMP_X = ".$DB->CurrentTimeFunction()." WHERE ID = ".$ID);
}
if(
CIBlock::GetArrayByID($db_record["IBLOCK_ID"], "SECTION_PROPERTY") === "Y"
&& array_key_exists("SECTION_PROPERTY", $arFields)
&& is_array($arFields["SECTION_PROPERTY"])
)
{
CIBlockSectionPropertyLink::DeleteBySection($ID, array_keys($arFields["SECTION_PROPERTY"]));
foreach($arFields["SECTION_PROPERTY"] as $PROPERTY_ID => $arLink)
CIBlockSectionPropertyLink::Set($ID, $PROPERTY_ID, $arLink);
}
if (
CIBlock::GetArrayByID($db_record["IBLOCK_ID"], "PROPERTY_INDEX") === "Y"
&& isset($arFields['IBLOCK_SECTION_ID'])
&& $arFields['IBLOCK_SECTION_ID'] != $db_record['IBLOCK_SECTION_ID']
)
{
IblockPropertyIndexManager::markAsInvalid($db_record["IBLOCK_ID"]);
}
if($bUpdateSearch)
CIBlockSection::UpdateSearch($ID);
if($arIBlock["FIELDS"]["LOG_SECTION_EDIT"]["IS_REQUIRED"] == "Y")
{
$USER_ID = is_object($USER)? intval($USER->GetID()) : 0;
$arEvents = GetModuleEvents("main", "OnBeforeEventLog", true);
if(empty($arEvents) || ExecuteModuleEventEx($arEvents[0], array($USER_ID))===false)
{
$rsSection = CIBlockSection::GetList(array(), array("=ID"=>$ID), false, array("LIST_PAGE_URL", "NAME", "CODE"));
$arSection = $rsSection->GetNext();
$res = array(
"ID" => $ID,
"CODE" => $arSection["CODE"],
"NAME" => $arSection["NAME"],
"SECTION_NAME" => $arIBlock["SECTION_NAME"],
"USER_ID" => $USER_ID,
"IBLOCK_PAGE_URL" => $arSection["LIST_PAGE_URL"],
);
CEventLog::Log(
"IBLOCK",
"IBLOCK_SECTION_EDIT",
"iblock",
$arIBlock["ID"],
serialize($res)
);
}
}
$Result = true;
/*********** QUOTA ***************/
CDiskQuota::recalculateDb();
/*********** QUOTA ***************/
}
$arFields["ID"] = $ID;
$arFields["IBLOCK_ID"] = $db_record["IBLOCK_ID"];
$arFields["RESULT"] = &$Result;
foreach (GetModuleEvents("iblock", "OnAfterIBlockSectionUpdate", true) as $arEvent)
ExecuteModuleEventEx($arEvent, array(&$arFields));
CIBlock::clearIblockTagCache($arIBlock['ID']);
return $Result;
}