• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblock.php
  • Класс: CAllIBlock
  • Вызов: CAllIBlock::Update
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; }