• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/mysql/iblockelement.php
  • Класс: CIBlockElement
  • Вызов: CIBlockElement::Update
public function Update($ID, $arFields, $bWorkFlow=false, $bUpdateSearch=true, $bResizePictures=false, $bCheckDiskQuota=true)
{
	global $DB;
	$ID = (int)$ID;

	$db_element = CIBlockElement::GetList(array(), array("ID"=>$ID, "SHOW_HISTORY"=>"Y"), false, false,
		array(
			"ID",
			"TIMESTAMP_X",
			"MODIFIED_BY",
			"DATE_CREATE",
			"CREATED_BY",
			"IBLOCK_ID",
			"IBLOCK_SECTION_ID",
			"ACTIVE",
			"ACTIVE_FROM",
			"ACTIVE_TO",
			"SORT",
			"NAME",
			"PREVIEW_PICTURE",
			"PREVIEW_TEXT",
			"PREVIEW_TEXT_TYPE",
			"DETAIL_PICTURE",
			"DETAIL_TEXT",
			"DETAIL_TEXT_TYPE",
			"WF_STATUS_ID",
			"WF_PARENT_ELEMENT_ID",
			"WF_NEW",
			"WF_COMMENTS",
			"IN_SECTIONS",
			"CODE",
			"TAGS",
			"XML_ID",
			"TMP_ID",
		)
	);
	if(!($ar_element = $db_element->Fetch()))
		return false;

	if ($this->iblock !== null && $this->iblock['ID'] === (int)$ar_element["IBLOCK_ID"])
	{
		$arIBlock = $this->iblock;
	}
	else
	{
		$arIBlock = CIBlock::GetArrayByID($ar_element["IBLOCK_ID"]);
	}

	$bWorkFlow = $bWorkFlow && is_array($arIBlock) && ($arIBlock["WORKFLOW"] != "N") && $this->workflowIncluded;

	$ar_wf_element = $ar_element;

	self::$elementIblock[$ID] = $arIBlock["ID"];

	$LAST_ID = 0;
	if($bWorkFlow)
	{
		$LAST_ID = CIBlockElement::WF_GetLast($ID);
		if($LAST_ID!=$ID)
		{
			$db_element = CIBlockElement::GetByID($LAST_ID);
			if(!($ar_wf_element = $db_element->Fetch()))
				return false;
		}

		$arFields["WF_PARENT_ELEMENT_ID"] = $ID;

		if(!isset($arFields["PROPERTY_VALUES"]) || !is_array($arFields["PROPERTY_VALUES"]))
			$arFields["PROPERTY_VALUES"] = array();

		$bFieldProps = array();
		foreach($arFields["PROPERTY_VALUES"] as $k=>$v)
			$bFieldProps[$k]=true;

		$arFieldProps = &$arFields['PROPERTY_VALUES'];
		$props = CIBlockElement::GetProperty($ar_element["IBLOCK_ID"], $ar_wf_element["ID"]);
		while($arProp = $props->Fetch())
		{
			$pr_val_id = $arProp['PROPERTY_VALUE_ID'];
			if($arProp['PROPERTY_TYPE']=='F' && $pr_val_id <> '')
			{
				if($arProp["CODE"] <> '' && is_set($arFieldProps, $arProp["CODE"]))
					$pr_id = $arProp["CODE"];
				else
					$pr_id = $arProp['ID'];

				if(
					array_key_exists($pr_id, $arFieldProps)
					&& array_key_exists($pr_val_id, $arFieldProps[$pr_id])
					&& is_array($arFieldProps[$pr_id][$pr_val_id])
				)
				{
					$new_value = $arFieldProps[$pr_id][$pr_val_id];
					if(
						$new_value['name'] == ''
						&& $new_value['del'] != "Y"
						&& $new_value['VALUE']['name'] == ''
						&& $new_value['VALUE']['del'] != "Y"
					)
					{
						if(
							array_key_exists('DESCRIPTION', $new_value)
							&& ($new_value['DESCRIPTION'] != $arProp['DESCRIPTION'])
						)
						{
							$p = Array("VALUE"=>CFile::MakeFileArray($arProp['VALUE']));
							$p["DESCRIPTION"] = $new_value["DESCRIPTION"];
							$p["MODULE_ID"] = "iblock";
							$arFieldProps[$pr_id][$pr_val_id] = $p;
						}
						elseif($arProp['VALUE'] > 0)
						{
							$arFieldProps[$pr_id][$pr_val_id] = array("VALUE"=>$arProp['VALUE'],"DESCRIPTION"=>$arProp["DESCRIPTION"]);
						}
					}
				}
				else
				{
					$arFieldProps[$pr_id][$pr_val_id] = array("VALUE"=>$arProp['VALUE'],"DESCRIPTION"=>$arProp["DESCRIPTION"]);
				}

				continue;
			}

			if (
				$pr_val_id == ''
				|| array_key_exists($arProp["ID"], $bFieldProps)
				|| (
					$arProp["CODE"] <> ''
					&& array_key_exists($arProp["CODE"], $bFieldProps)
				)
			)
				continue;

			$arFieldProps[$arProp["ID"]][$pr_val_id] = array("VALUE"=>$arProp['VALUE'],"DESCRIPTION"=>$arProp["DESCRIPTION"]);
		}

		if($ar_wf_element["IN_SECTIONS"] == "Y")
		{
			$ar_wf_element["IBLOCK_SECTION"] = array();
			$rsSections = CIBlockElement::GetElementGroups($ar_element["ID"], true, array('ID', 'IBLOCK_ELEMENT_ID'));
			while($arSection = $rsSections->Fetch())
				$ar_wf_element["IBLOCK_SECTION"][] = $arSection["ID"];
		}

		unset($ar_wf_element["DATE_ACTIVE_FROM"],
			$ar_wf_element["DATE_ACTIVE_TO"],
			$ar_wf_element["EXTERNAL_ID"],
			$ar_wf_element["TIMESTAMP_X"],
			$ar_wf_element["IBLOCK_SECTION_ID"],
			$ar_wf_element["ID"]
		);

		$arFields = $arFields + $ar_wf_element;
	}

	$arFields["WF"] = ($bWorkFlow?"Y":"N");

	$bBizProc = is_array($arIBlock) && ($arIBlock["BIZPROC"] == "Y") && $this->bizprocInstalled;
	if(array_key_exists("BP_PUBLISHED", $arFields))
	{
		if($bBizProc)
		{
			if($arFields["BP_PUBLISHED"] == "Y")
			{
				$arFields["WF_STATUS_ID"] = 1;
				$arFields["WF_NEW"] = false;
			}
			else
			{
				$arFields["WF_STATUS_ID"] = 2;
				$arFields["WF_NEW"] = "Y";
				$arFields["BP_PUBLISHED"] = "N";
			}
		}
		else
		{
			$arFields["WF_NEW"] = false;
			unset($arFields["BP_PUBLISHED"]);
		}
	}
	else
	{
		$arFields["WF_NEW"] = false;
	}

	if (array_key_exists('NAME', $arFields) && $arFields['NAME'] === null)
	{
		unset($arFields['NAME']);
	}

	if (isset($arFields["ACTIVE"]) && $arFields["ACTIVE"] != "Y")
	{
		$arFields["ACTIVE"] = "N";
	}

	if (isset($arFields["PREVIEW_TEXT_TYPE"]) && $arFields["PREVIEW_TEXT_TYPE"] != "html")
	{
		$arFields["PREVIEW_TEXT_TYPE"] = "text";
	}

	if (isset($arFields["DETAIL_TEXT_TYPE"]) && $arFields["DETAIL_TEXT_TYPE"] != "html")
	{
		$arFields["DETAIL_TEXT_TYPE"] = "text";
	}

	$strWarning = "";
	if($bResizePictures)
	{
		$arDef = $arIBlock["FIELDS"]["PREVIEW_PICTURE"]["DEFAULT_VALUE"];

		if(
			$arDef["DELETE_WITH_DETAIL"] === "Y"
			&& isset($arFields["DETAIL_PICTURE"])
			&& is_array($arFields["DETAIL_PICTURE"])
			&& $arFields["DETAIL_PICTURE"]["del"] === "Y"
		)
		{
			$arFields["PREVIEW_PICTURE"]["del"] = "Y";
		}

		if(
			$arDef["FROM_DETAIL"] === "Y"
			&& (
				!isset($arFields["PREVIEW_PICTURE"])
				|| (is_array($arFields["PREVIEW_PICTURE"]) && $arFields["PREVIEW_PICTURE"]["size"] <= 0)
				|| $arDef["UPDATE_WITH_DETAIL"] === "Y"
			)
			&& isset($arFields["DETAIL_PICTURE"])
			&& is_array($arFields["DETAIL_PICTURE"])
			&& $arFields["DETAIL_PICTURE"]["size"] > 0
		)
		{
			if(
				$arFields["PREVIEW_PICTURE"]["del"] !== "Y"
				&& $arDef["UPDATE_WITH_DETAIL"] !== "Y"
			)
			{
				$rsElement = CIBlockElement::GetList(Array("ID" => "DESC"), Array("ID" => $ar_wf_element["ID"], "IBLOCK_ID" => $ar_wf_element["IBLOCK_ID"], "SHOW_HISTORY"=>"Y"), false, false, Array("ID", "PREVIEW_PICTURE"));
				$arOldElement = $rsElement->Fetch();
			}
			else
			{
				$arOldElement = false;
			}

			if(!$arOldElement || !$arOldElement["PREVIEW_PICTURE"])
			{
				$arNewPreview = $arFields["DETAIL_PICTURE"];
				$arNewPreview["COPY_FILE"] = "Y";
				if (
					isset($arFields["PREVIEW_PICTURE"])
					&& is_array($arFields["PREVIEW_PICTURE"])
					&& isset($arFields["PREVIEW_PICTURE"]["description"])
				)
				{
					$arNewPreview["description"] = $arFields["PREVIEW_PICTURE"]["description"];
				}

				$arFields["PREVIEW_PICTURE"] = $arNewPreview;
			}
		}

		if(
			isset($arFields["PREVIEW_PICTURE"])
			&& is_array($arFields["PREVIEW_PICTURE"])
			&& $arFields["PREVIEW_PICTURE"]["size"] > 0
			&& $arDef["SCALE"] === "Y"
		)
		{
			$arNewPicture = CIBlock::ResizePicture($arFields["PREVIEW_PICTURE"], $arDef);
			if(is_array($arNewPicture))
			{
				$arNewPicture["description"] = $arFields["PREVIEW_PICTURE"]["description"];
				$arFields["PREVIEW_PICTURE"] = $arNewPicture;
			}
			elseif($arDef["IGNORE_ERRORS"] !== "Y")
			{
				unset($arFields["PREVIEW_PICTURE"]);
				$strWarning .= GetMessage("IBLOCK_FIELD_PREVIEW_PICTURE").": ".$arNewPicture."
"; } } if( isset($arFields["PREVIEW_PICTURE"]) && is_array($arFields["PREVIEW_PICTURE"]) && $arDef["USE_WATERMARK_FILE"] === "Y" ) { $arFields["PREVIEW_PICTURE"]["copy"] ??= null; if( $arFields["PREVIEW_PICTURE"]["tmp_name"] <> '' && ( $arFields["PREVIEW_PICTURE"]["tmp_name"] === $arFields["DETAIL_PICTURE"]["tmp_name"] || ($arFields["PREVIEW_PICTURE"]["COPY_FILE"] == "Y" && !$arFields["PREVIEW_PICTURE"]["copy"]) ) ) { $tmp_name = CTempFile::GetFileName(basename($arFields["PREVIEW_PICTURE"]["tmp_name"])); CheckDirPath($tmp_name); copy($arFields["PREVIEW_PICTURE"]["tmp_name"], $tmp_name); $arFields["PREVIEW_PICTURE"]["copy"] = true; $arFields["PREVIEW_PICTURE"]["tmp_name"] = $tmp_name; } CIBlock::FilterPicture($arFields["PREVIEW_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( isset($arFields["PREVIEW_PICTURE"]) && is_array($arFields["PREVIEW_PICTURE"]) && $arDef["USE_WATERMARK_TEXT"] === "Y" ) { $arFields["PREVIEW_PICTURE"]["copy"] ??= null; if( $arFields["PREVIEW_PICTURE"]["tmp_name"] <> '' && ( $arFields["PREVIEW_PICTURE"]["tmp_name"] === $arFields["DETAIL_PICTURE"]["tmp_name"] || ($arFields["PREVIEW_PICTURE"]["COPY_FILE"] == "Y" && !$arFields["PREVIEW_PICTURE"]["copy"]) ) ) { $tmp_name = CTempFile::GetFileName(basename($arFields["PREVIEW_PICTURE"]["tmp_name"])); CheckDirPath($tmp_name); copy($arFields["PREVIEW_PICTURE"]["tmp_name"], $tmp_name); $arFields["PREVIEW_PICTURE"]["copy"] = true; $arFields["PREVIEW_PICTURE"]["tmp_name"] = $tmp_name; } CIBlock::FilterPicture($arFields["PREVIEW_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"]["DETAIL_PICTURE"]["DEFAULT_VALUE"]; if( isset($arFields["DETAIL_PICTURE"]) && 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( isset($arFields["DETAIL_PICTURE"]) && is_array($arFields["DETAIL_PICTURE"]) && $arDef["USE_WATERMARK_FILE"] === "Y" ) { $arFields["DETAIL_PICTURE"]["copy"] ??= null; if( $arFields["DETAIL_PICTURE"]["tmp_name"] <> '' && ( $arFields["DETAIL_PICTURE"]["tmp_name"] === $arFields["PREVIEW_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"]), )); } if( isset($arFields["DETAIL_PICTURE"]) && is_array($arFields["DETAIL_PICTURE"]) && $arDef["USE_WATERMARK_TEXT"] === "Y" ) { $arFields["DETAIL_PICTURE"]["copy"] ??= null; if( $arFields["DETAIL_PICTURE"]["tmp_name"] <> '' && ( $arFields["DETAIL_PICTURE"]["tmp_name"] === $arFields["PREVIEW_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 BitrixIblockInheritedPropertyElementTemplates($ar_element["IBLOCK_ID"], $ar_element["ID"]); if (isset($arFields["PREVIEW_PICTURE"]) && is_array($arFields["PREVIEW_PICTURE"])) { if( ($arFields["PREVIEW_PICTURE"]["name"] ?? '') === '' && ($arFields["PREVIEW_PICTURE"]["del"] ?? '') === '' && !is_set($arFields["PREVIEW_PICTURE"], "description") ) { unset($arFields["PREVIEW_PICTURE"]); } else { $arFields["PREVIEW_PICTURE"]["MODULE_ID"] = "iblock"; $arFields["PREVIEW_PICTURE"]["old_file"] = $ar_wf_element["PREVIEW_PICTURE"]; $arFields["PREVIEW_PICTURE"]["name"] = BitrixIblockTemplateHelper::makeFileName( $ipropTemplates ,"ELEMENT_PREVIEW_PICTURE_FILE_NAME" ,array_merge($ar_element, $arFields) ,$arFields["PREVIEW_PICTURE"] ); } } if(isset($arFields["DETAIL_PICTURE"]) && is_array($arFields["DETAIL_PICTURE"])) { if( ($arFields["DETAIL_PICTURE"]["name"] ?? '') === '' && ($arFields["DETAIL_PICTURE"]["del"] ?? '') === '' && !is_set($arFields["DETAIL_PICTURE"], "description") ) { unset($arFields["DETAIL_PICTURE"]); } else { $arFields["DETAIL_PICTURE"]["MODULE_ID"] = "iblock"; $arFields["DETAIL_PICTURE"]["old_file"] = $ar_wf_element["DETAIL_PICTURE"]; $arFields["DETAIL_PICTURE"]["name"] = BitrixIblockTemplateHelper::makeFileName( $ipropTemplates ,"ELEMENT_DETAIL_PICTURE_FILE_NAME" ,array_merge($ar_element, $arFields) ,$arFields["DETAIL_PICTURE"] ); } } if(is_set($arFields, "DATE_ACTIVE_FROM")) $arFields["ACTIVE_FROM"] = $arFields["DATE_ACTIVE_FROM"]; if(is_set($arFields, "DATE_ACTIVE_TO")) $arFields["ACTIVE_TO"] = $arFields["DATE_ACTIVE_TO"]; if(is_set($arFields, "EXTERNAL_ID")) $arFields["XML_ID"] = $arFields["EXTERNAL_ID"]; if (isset($arFields['NAME']) && is_array($arFields['NAME'])) { unset($arFields['NAME']); } $existFields = array( 'NAME' => isset($arFields['NAME']), 'PREVIEW_TEXT' => array_key_exists('PREVIEW_TEXT', $arFields), 'DETAIL_TEXT' => array_key_exists('DETAIL_TEXT', $arFields) ); $searchableFields = [ 'NAME' => $existFields['NAME'] ? $arFields["NAME"] : $ar_wf_element["NAME"], 'PREVIEW_TEXT' => $existFields['PREVIEW_TEXT'] ? $arFields["PREVIEW_TEXT"]: $ar_wf_element["PREVIEW_TEXT"], 'PREVIEW_TEXT_TYPE' => $arFields["PREVIEW_TEXT_TYPE"] ?? $ar_wf_element["PREVIEW_TEXT_TYPE"], 'DETAIL_TEXT' => $existFields['DETAIL_TEXT'] ? $arFields["DETAIL_TEXT"]: $ar_wf_element["DETAIL_TEXT"], 'DETAIL_TEXT_TYPE' => $arFields["DETAIL_TEXT_TYPE"] ?? $ar_wf_element["DETAIL_TEXT_TYPE"], ]; if ($this->searchIncluded) { $arFields["SEARCHABLE_CONTENT"] = ToUpper( $searchableFields['NAME']."rn". ($searchableFields['PREVIEW_TEXT_TYPE'] == "html" ? HTMLToTxt($searchableFields['PREVIEW_TEXT']) : $searchableFields['PREVIEW_TEXT'])."rn". ($searchableFields['DETAIL_TEXT_TYPE'] == "html" ? HTMLToTxt($searchableFields['DETAIL_TEXT']) : $searchableFields['DETAIL_TEXT']) ); } if(array_key_exists("IBLOCK_SECTION_ID", $arFields)) { if (!array_key_exists("IBLOCK_SECTION", $arFields)) { $arFields["IBLOCK_SECTION"] = array($arFields["IBLOCK_SECTION_ID"]); } elseif (is_array($arFields["IBLOCK_SECTION"]) && !in_array($arFields["IBLOCK_SECTION_ID"], $arFields["IBLOCK_SECTION"])) { unset($arFields["IBLOCK_SECTION_ID"]); } } $arFields["IBLOCK_ID"] = $ar_element["IBLOCK_ID"]; if(!$this->CheckFields($arFields, $ID, $bCheckDiskQuota) || $strWarning != '') { $this->LAST_ERROR .= $strWarning; $Result = false; $arFields["RESULT_MESSAGE"] = &$this->LAST_ERROR; } else { unset($arFields["ID"]); if(array_key_exists("PREVIEW_PICTURE", $arFields)) { $SAVED_PREVIEW_PICTURE = $arFields["PREVIEW_PICTURE"]; } else { $SAVED_PREVIEW_PICTURE = false; } if(array_key_exists("DETAIL_PICTURE", $arFields)) { $SAVED_DETAIL_PICTURE = $arFields["DETAIL_PICTURE"]; } else { $SAVED_DETAIL_PICTURE = false; } // edit was done in workflow mode if($bWorkFlow) { $arFields["WF_PARENT_ELEMENT_ID"] = $ID; if(array_key_exists("PREVIEW_PICTURE", $arFields)) { if(is_array($arFields["PREVIEW_PICTURE"])) { if( $arFields["PREVIEW_PICTURE"]["name"] == '' && $arFields["PREVIEW_PICTURE"]["del"] == '' ) { if(array_key_exists("description", $arFields["PREVIEW_PICTURE"])) { $arFile = CFile::GetFileArray($ar_wf_element["PREVIEW_PICTURE"]); if($arFields["PREVIEW_PICTURE"]["description"] != $arFile["DESCRIPTION"]) {//Description updated, so it's new file $arNewFile = CFile::MakeFileArray($ar_wf_element["PREVIEW_PICTURE"]); $arNewFile["description"] = $arFields["PREVIEW_PICTURE"]["description"]; $arNewFile["MODULE_ID"] = "iblock"; $arFields["PREVIEW_PICTURE"] = $arNewFile; } else { $arFields["PREVIEW_PICTURE"] = $ar_wf_element["PREVIEW_PICTURE"]; } } else { //File was not changed at all $arFields["PREVIEW_PICTURE"] = $ar_wf_element["PREVIEW_PICTURE"]; } } else { unset($arFields["PREVIEW_PICTURE"]["old_file"]); } } } else { $arFields["PREVIEW_PICTURE"] = $ar_wf_element["PREVIEW_PICTURE"]; } if(array_key_exists("DETAIL_PICTURE", $arFields)) { if(is_array($arFields["DETAIL_PICTURE"])) { if( $arFields["DETAIL_PICTURE"]["name"] == '' && $arFields["DETAIL_PICTURE"]["del"] == '' ) { if(array_key_exists("description", $arFields["DETAIL_PICTURE"])) { $arFile = CFile::GetFileArray($ar_wf_element["DETAIL_PICTURE"]); if($arFields["DETAIL_PICTURE"]["description"] != $arFile["DESCRIPTION"]) {//Description updated, so it's new file $arNewFile = CFile::MakeFileArray($ar_wf_element["DETAIL_PICTURE"]); $arNewFile["description"] = $arFields["DETAIL_PICTURE"]["description"]; $arNewFile["MODULE_ID"] = "iblock"; $arFields["DETAIL_PICTURE"] = $arNewFile; } else { $arFields["DETAIL_PICTURE"] = $ar_wf_element["DETAIL_PICTURE"]; } } else { //File was not changed at all $arFields["DETAIL_PICTURE"] = $ar_wf_element["DETAIL_PICTURE"]; } } else { unset($arFields["DETAIL_PICTURE"]["old_file"]); } } } else { $arFields["DETAIL_PICTURE"] = $ar_wf_element["DETAIL_PICTURE"]; } $NID = $this->Add($arFields); if($NID>0) { if($arFields["WF_STATUS_ID"]==1) { $DB->Query("UPDATE b_iblock_element SET TIMESTAMP_X=TIMESTAMP_X, WF_NEW=null WHERE ID=".$ID); $DB->Query("UPDATE b_iblock_element SET TIMESTAMP_X=TIMESTAMP_X, WF_NEW=null WHERE WF_PARENT_ELEMENT_ID=".$ID); $ar_wf_element["WF_NEW"] = false; } if($this->bWF_SetMove) CIBlockElement::WF_SetMove($NID, $LAST_ID); if($ar_element["WF_STATUS_ID"] != 1 && $ar_wf_element["WF_STATUS_ID"] != $arFields["WF_STATUS_ID"] && $arFields["WF_STATUS_ID"] != 1 ) { $DB->Query("UPDATE b_iblock_element SET TIMESTAMP_X=TIMESTAMP_X, WF_STATUS_ID=".(int)$arFields["WF_STATUS_ID"]." WHERE ID=".$ID); } } //element was not published, so keep original if( (is_set($arFields, "WF_STATUS_ID") && $arFields["WF_STATUS_ID"]!=1 && $ar_element["WF_STATUS_ID"]==1) || (!is_set($arFields, "WF_STATUS_ID") && $ar_wf_element["WF_STATUS_ID"]!=1) ) { CIBlockElement::WF_CleanUpHistoryCopies($ID); return true; } $arFields['WF_PARENT_ELEMENT_ID'] = false; $rs = $DB->Query("SELECT PREVIEW_PICTURE, DETAIL_PICTURE from b_iblock_element WHERE ID = ".(int)$NID); $ar_new_element = $rs->Fetch(); } else { $ar_new_element = false; } if($ar_new_element) { if(!intval($ar_new_element["PREVIEW_PICTURE"])) $arFields["PREVIEW_PICTURE"] = false; else $arFields["PREVIEW_PICTURE"] = $ar_new_element["PREVIEW_PICTURE"]; if(!intval($ar_new_element["DETAIL_PICTURE"])) $arFields["DETAIL_PICTURE"] = false; else $arFields["DETAIL_PICTURE"] = $ar_new_element["DETAIL_PICTURE"]; if(is_array($arFields["PROPERTY_VALUES"]) && !empty($arFields["PROPERTY_VALUES"])) { $i = 0; $db_prop = CIBlockProperty::GetList(array(), array( "IBLOCK_ID" => $arFields["IBLOCK_ID"], "CHECK_PERMISSIONS" => "N", "PROPERTY_TYPE" => "F", )); while($arProp = $db_prop->Fetch()) { $i++; unset($arFields["PROPERTY_VALUES"][$arProp["CODE"]]); unset($arFields["PROPERTY_VALUES"][$arProp["ID"]]); $arFields["PROPERTY_VALUES"][$arProp["ID"]] = array(); } if($i > 0) { //Delete previous files $props = CIBlockElement::GetProperty($arFields["IBLOCK_ID"], $ID, "sort", "asc", array("PROPERTY_TYPE" => "F", "EMPTY" => "N")); while($arProp = $props->Fetch()) { $arFields["PROPERTY_VALUES"][$arProp["ID"]][$arProp['PROPERTY_VALUE_ID']] = array( "VALUE" => array( "del" => "Y", ), "DESCRIPTION" => false, ); } //Add copy from history $arDup = array();//This is cure for files duplication bug (just save element one more time) $props = CIBlockElement::GetProperty($arFields["IBLOCK_ID"], $NID, "sort", "asc", array("PROPERTY_TYPE" => "F", "EMPTY" => "N")); while($arProp = $props->Fetch()) { if(!array_key_exists($arProp["VALUE"], $arDup))//This is cure for files duplication bug { $arFields["PROPERTY_VALUES"][$arProp["ID"]][$arProp['PROPERTY_VALUE_ID']] = array( "VALUE" => $arProp["VALUE"], "DESCRIPTION" => $arProp["DESCRIPTION"], ); $arDup[$arProp["VALUE"]] = true;//This is cure for files duplication bug } } } } } else { if(array_key_exists("PREVIEW_PICTURE", $arFields)) CFile::SaveForDB($arFields, "PREVIEW_PICTURE", "iblock"); if(array_key_exists("DETAIL_PICTURE", $arFields)) CFile::SaveForDB($arFields, "DETAIL_PICTURE", "iblock"); } $newFields = $arFields; $newFields["ID"] = $ID; $IBLOCK_SECTION_ID = $arFields["IBLOCK_SECTION_ID"] ?? null; unset($arFields["IBLOCK_ID"], $arFields["WF_NEW"], $arFields["IBLOCK_SECTION_ID"]); $bTimeStampNA = false; if(is_set($arFields, "TIMESTAMP_X") && ($arFields["TIMESTAMP_X"] === NULL || $arFields["TIMESTAMP_X"]===false)) { $bTimeStampNA = true; unset($arFields["TIMESTAMP_X"]); unset($newFields["TIMESTAMP_X"]); } foreach (GetModuleEvents("iblock", "OnIBlockElementUpdate", true) as $arEvent) ExecuteModuleEventEx($arEvent, array($newFields, $ar_wf_element)); unset($newFields); $strUpdate = $DB->PrepareUpdate("b_iblock_element", $arFields, "iblock"); if(!empty($strUpdate)) $strUpdate .= ", "; $strSql = "UPDATE b_iblock_element SET ".$strUpdate.($bTimeStampNA?"TIMESTAMP_X=TIMESTAMP_X":"TIMESTAMP_X=now()")." WHERE ID=".$ID; $DB->Query($strSql, false, "FILE: ".__FILE__."
LINE: ".__LINE__); $existFields['PROPERTY_VALUES'] = ( isset($arFields["PROPERTY_VALUES"]) && is_array($arFields["PROPERTY_VALUES"]) && !empty($arFields["PROPERTY_VALUES"]) ); if ($existFields['PROPERTY_VALUES']) { CIBlockElement::SetPropertyValues($ID, $ar_element["IBLOCK_ID"], $arFields["PROPERTY_VALUES"]); } if (!$this->searchIncluded) { if ( $existFields['NAME'] || $existFields['PREVIEW_TEXT'] || $existFields['DETAIL_TEXT'] || $existFields['PROPERTY_VALUES'] ) { $elementFields = $arFields; if (!$existFields['NAME']) { $elementFields['NAME'] = $searchableFields['NAME']; } if (!$existFields['PREVIEW_TEXT']) { $elementFields['PREVIEW_TEXT'] = $searchableFields['PREVIEW_TEXT']; if (!isset($elementFields['PREVIEW_TEXT_TYPE'])) { $elementFields['PREVIEW_TEXT_TYPE'] = $searchableFields['PREVIEW_TEXT_TYPE']; } } if (!$existFields['DETAIL_TEXT']) { $elementFields['DETAIL_TEXT'] = $searchableFields['DETAIL_TEXT']; if (!isset($elementFields['DETAIL_TEXT_TYPE'])) { $elementFields['DETAIL_TEXT_TYPE'] = $searchableFields['DETAIL_TEXT_TYPE']; } } $arFields['SEARCHABLE_CONTENT'] = $this->getSearchableContent($ID, $elementFields, $arIBlock); unset($elementFields); $updateFields = array( 'SEARCHABLE_CONTENT' => $arFields['SEARCHABLE_CONTENT'] ); $updateQuery = $DB->PrepareUpdate("b_iblock_element", $updateFields, "iblock"); if ($updateQuery != "") { $updateQuery .= ', TIMESTAMP_X = TIMESTAMP_X'; $DB->Query("UPDATE b_iblock_element SET ".$updateQuery." WHERE ID = ".$ID); } unset($updateFields); } } if(is_set($arFields, "IBLOCK_SECTION")) CIBlockElement::SetElementSection($ID, $arFields["IBLOCK_SECTION"], false, $arIBlock["RIGHTS_MODE"] === "E"? $arIBlock["ID"]: 0, $IBLOCK_SECTION_ID); if ($arIBlock["RIGHTS_MODE"] === IblockIblockTable::RIGHTS_EXTENDED) { $obElementRights = new CIBlockElementRights($arIBlock["ID"], $ID); if(array_key_exists("RIGHTS", $arFields) && is_array($arFields["RIGHTS"])) $obElementRights->SetRights($arFields["RIGHTS"]); } if (array_key_exists("IPROPERTY_TEMPLATES", $arFields)) { $ipropTemplates = new BitrixIblockInheritedPropertyElementTemplates($arIBlock["ID"], $ID); $ipropTemplates->set($arFields["IPROPERTY_TEMPLATES"]); } if ($bUpdateSearch) { if ($this->searchIncluded) { CIBlockElement::UpdateSearch($ID, true); } } BitrixIblockPropertyIndexManager::updateElementIndex($arIBlock["ID"], $ID); if($bWorkFlow) { CIBlockElement::WF_CleanUpHistoryCopies($ID); } //Restore saved values if($SAVED_PREVIEW_PICTURE !== false) { $arFields["PREVIEW_PICTURE_ID"] = ($arFields["PREVIEW_PICTURE"] ?? null); $arFields["PREVIEW_PICTURE"] = $SAVED_PREVIEW_PICTURE; } else { unset($arFields["PREVIEW_PICTURE"]); } if($SAVED_DETAIL_PICTURE !== false) { $arFields["DETAIL_PICTURE_ID"] = ($arFields["DETAIL_PICTURE"] ?? null); $arFields["DETAIL_PICTURE"] = $SAVED_DETAIL_PICTURE; } else { unset($arFields["DETAIL_PICTURE"]); } if($arIBlock["FIELDS"]["LOG_ELEMENT_EDIT"]["IS_REQUIRED"] == "Y") { $arEvents = GetModuleEvents("main", "OnBeforeEventLog", true); if(empty($arEvents) || ExecuteModuleEventEx($arEvents[0], array($this->userId))===false) { $rsElement = CIBlockElement::GetList( array(), array("=ID" => $ID, "CHECK_PERMISSIONS" => "N", "SHOW_NEW" => "Y"), false, false, array("ID", "NAME", "LIST_PAGE_URL", "CODE") ); $arElement = $rsElement->GetNext(); $res = array( "ID" => $ID, "CODE" => $arElement["CODE"], "NAME" => $arElement["NAME"], "ELEMENT_NAME" => $arIBlock["ELEMENT_NAME"], "USER_ID" => $this->userId, "IBLOCK_PAGE_URL" => $arElement["LIST_PAGE_URL"], ); CEventLog::Log( "IBLOCK", "IBLOCK_ELEMENT_EDIT", "iblock", $arIBlock["ID"], serialize($res) ); } } IblockElementTable::cleanCache(); $Result = true; /************* QUOTA *************/ CDiskQuota::recalculateDb(); /************* QUOTA *************/ } $arFields["ID"] = $ID; $arFields["IBLOCK_ID"] = $ar_element["IBLOCK_ID"]; $arFields["RESULT"] = &$Result; if( isset($arFields["PREVIEW_PICTURE"]) && is_array($arFields["PREVIEW_PICTURE"]) && ($arFields["PREVIEW_PICTURE"]["COPY_FILE"] ?? '') === "Y" && ($arFields["PREVIEW_PICTURE"]["copy"] ?? null) ) { @unlink($arFields["PREVIEW_PICTURE"]["tmp_name"]); @rmdir(dirname($arFields["PREVIEW_PICTURE"]["tmp_name"])); } if( isset($arFields["DETAIL_PICTURE"]) && is_array($arFields["DETAIL_PICTURE"]) && ($arFields["DETAIL_PICTURE"]["COPY_FILE"] ?? '') === "Y" && ($arFields["DETAIL_PICTURE"]["copy"] ?? null) ) { @unlink($arFields["DETAIL_PICTURE"]["tmp_name"]); @rmdir(dirname($arFields["DETAIL_PICTURE"]["tmp_name"])); } foreach (GetModuleEvents("iblock", "OnAfterIBlockElementUpdate", true) as $arEvent) ExecuteModuleEventEx($arEvent, array(&$arFields)); CIBlock::clearIblockTagCache($arIBlock['ID']); return $Result; }