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

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

	$existIblock = !empty($arIBlock) && is_array($arIBlock);
	$bWorkFlow = $bWorkFlow && $existIblock && ($arIBlock["WORKFLOW"] != "N") && $this->workflowIncluded;
	$bBizProc = $existIblock && ($arIBlock["BIZPROC"] == "Y") && $this->bizprocInstalled;

	if(isset($arFields["BP_PUBLISHED"]))
	{
		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
		{
			unset($arFields["BP_PUBLISHED"]);
		}
	}

	if(array_key_exists("IBLOCK_SECTION_ID", $arFields))
	{
		if (!isset($arFields["IBLOCK_SECTION"]))
		{
			$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"]);
		}
	}

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

		if(
			$arDef["FROM_DETAIL"] === "Y"
			&& isset($arFields["DETAIL_PICTURE"])
			&& is_array($arFields["DETAIL_PICTURE"])
			&& $arFields["DETAIL_PICTURE"]["size"] > 0
			&& (
				$arDef["UPDATE_WITH_DETAIL"] === "Y"
				|| $arFields["PREVIEW_PICTURE"]["size"] <= 0
			)
		)
		{
			$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"])
			&& $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($arFields["IBLOCK_ID"], 0); if(array_key_exists("PREVIEW_PICTURE", $arFields)) { if (is_array($arFields["PREVIEW_PICTURE"])) { if ( ($arFields["PREVIEW_PICTURE"]["name"] ?? '') === '' && ($arFields["PREVIEW_PICTURE"]["del"] ?? '') === '' ) { unset($arFields["PREVIEW_PICTURE"]); } else { $arFields["PREVIEW_PICTURE"]["MODULE_ID"] = "iblock"; $arFields["PREVIEW_PICTURE"]["name"] = BitrixIblockTemplateHelper::makeFileName( $ipropTemplates ,"ELEMENT_PREVIEW_PICTURE_FILE_NAME" ,$arFields ,$arFields["PREVIEW_PICTURE"] ); } } else { if((int)$arFields["PREVIEW_PICTURE"] <= 0) unset($arFields["PREVIEW_PICTURE"]); } } if(array_key_exists("DETAIL_PICTURE", $arFields)) { if (is_array($arFields["DETAIL_PICTURE"])) { if ( ($arFields["DETAIL_PICTURE"]["name"] ?? '') === '' && ($arFields["DETAIL_PICTURE"]["del"] ?? '') === '' ) { unset($arFields["DETAIL_PICTURE"]); } else { $arFields["DETAIL_PICTURE"]["MODULE_ID"] = "iblock"; $arFields["DETAIL_PICTURE"]["name"] = BitrixIblockTemplateHelper::makeFileName( $ipropTemplates ,"ELEMENT_DETAIL_PICTURE_FILE_NAME" ,$arFields ,$arFields["DETAIL_PICTURE"] ); } } else { if((int)$arFields["DETAIL_PICTURE"] <= 0) unset($arFields["DETAIL_PICTURE"]); } } 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"; 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($bWorkFlow) { $arFields["WF"] = "Y"; if($arFields["WF_STATUS_ID"] != 1) $arFields["WF_NEW"] = "Y"; else $arFields["WF_NEW"] = ""; } $arFields["NAME"] = (string)$arFields["NAME"]; $arFields["SEARCHABLE_CONTENT"] = false; if ($this->searchIncluded) { $arFields["SEARCHABLE_CONTENT"] = $arFields["NAME"]; if (isset($arFields["PREVIEW_TEXT"])) { if (isset($arFields["PREVIEW_TEXT_TYPE"]) && $arFields["PREVIEW_TEXT_TYPE"] == "html") $arFields["SEARCHABLE_CONTENT"] .= "rn".HTMLToTxt($arFields["PREVIEW_TEXT"]); else $arFields["SEARCHABLE_CONTENT"] .= "rn".$arFields["PREVIEW_TEXT"]; } if (isset($arFields["DETAIL_TEXT"])) { if (isset($arFields["DETAIL_TEXT_TYPE"]) && $arFields["DETAIL_TEXT_TYPE"] == "html") $arFields["SEARCHABLE_CONTENT"] .= "rn".HTMLToTxt($arFields["DETAIL_TEXT"]); else $arFields["SEARCHABLE_CONTENT"] .= "rn".$arFields["DETAIL_TEXT"]; } $arFields["SEARCHABLE_CONTENT"] = mb_strtoupper($arFields["SEARCHABLE_CONTENT"]); } if(!$this->CheckFields($arFields) || $strWarning != '') { $this->LAST_ERROR .= $strWarning; $Result = false; $arFields["RESULT_MESSAGE"] = &$this->LAST_ERROR; } else { if(array_key_exists("PREVIEW_PICTURE", $arFields)) { $SAVED_PREVIEW_PICTURE = $arFields["PREVIEW_PICTURE"]; if(is_array($arFields["PREVIEW_PICTURE"])) CFile::SaveForDB($arFields, "PREVIEW_PICTURE", "iblock"); if($bWorkFlow) $COPY_PREVIEW_PICTURE = $arFields["PREVIEW_PICTURE"]; } if(array_key_exists("DETAIL_PICTURE", $arFields)) { $SAVED_DETAIL_PICTURE = $arFields["DETAIL_PICTURE"]; if(is_array($arFields["DETAIL_PICTURE"])) CFile::SaveForDB($arFields, "DETAIL_PICTURE", "iblock"); if($bWorkFlow) $COPY_DETAIL_PICTURE = $arFields["DETAIL_PICTURE"]; } unset($arFields["ID"]); if ($this->userExists) { if(!isset($arFields["CREATED_BY"]) || (int)$arFields["CREATED_BY"] <= 0) $arFields["CREATED_BY"] = $this->userId; if(!isset($arFields["MODIFIED_BY"]) || (int)$arFields["MODIFIED_BY"] <= 0) $arFields["MODIFIED_BY"] = $this->userId; } $arFields["~TIMESTAMP_X"] = $arFields["~DATE_CREATE"] = $DB->CurrentTimeFunction(); foreach (GetModuleEvents("iblock", "OnIBlockElementAdd", true) as $arEvent) ExecuteModuleEventEx($arEvent, array($arFields)); $IBLOCK_SECTION_ID = $arFields["IBLOCK_SECTION_ID"] ?? null; unset($arFields["IBLOCK_SECTION_ID"]); $ID = $DB->Add("b_iblock_element", $arFields, array("DETAIL_TEXT", "SEARCHABLE_CONTENT"), "iblock"); if(array_key_exists("PREVIEW_PICTURE", $arFields)) { $arFields["PREVIEW_PICTURE_ID"] = $arFields["PREVIEW_PICTURE"]; $arFields["PREVIEW_PICTURE"] = $SAVED_PREVIEW_PICTURE; } if(array_key_exists("DETAIL_PICTURE", $arFields)) { $arFields["DETAIL_PICTURE_ID"] = $arFields["DETAIL_PICTURE"]; $arFields["DETAIL_PICTURE"] = $SAVED_DETAIL_PICTURE; } if ($arIBlock['VERSION'] == IblockIblockTable::PROPERTY_STORAGE_SEPARATE) { $DB->Query("INSERT INTO b_iblock_element_prop_s".$arFields["IBLOCK_ID"]."(IBLOCK_ELEMENT_ID)VALUES(".$ID.")"); } if (!empty($arFields["PROPERTY_VALUES"]) && is_array($arFields["PROPERTY_VALUES"])) { CIBlockElement::SetPropertyValues($ID, $arFields["IBLOCK_ID"], $arFields["PROPERTY_VALUES"]); } $updateFields = array(); if(!isset($arFields["XML_ID"]) || $arFields["XML_ID"] == '') { $arFields["XML_ID"] = $ID; $updateFields["XML_ID"] = $ID; } if (!$this->searchIncluded) { $arFields['SEARCHABLE_CONTENT'] = $this->getSearchableContent($ID, $arFields, $arIBlock); $updateFields['SEARCHABLE_CONTENT'] = $arFields['SEARCHABLE_CONTENT']; } if (!empty($updateFields)) { $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"], true, $arIBlock["RIGHTS_MODE"] === "E"? $arIBlock["ID"]: 0, $IBLOCK_SECTION_ID); if ($arIBlock["RIGHTS_MODE"] === IblockIblockTable::RIGHTS_EXTENDED) { $obElementRights = new CIBlockElementRights($arIBlock["ID"], $ID); if(!is_set($arFields, "IBLOCK_SECTION") || empty($arFields["IBLOCK_SECTION"])) $obElementRights->ChangeParents(array(), array(0)); 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 && $this->searchIncluded) { CIBlockElement::UpdateSearch($ID); } BitrixIblockPropertyIndexManager::updateElementIndex($arIBlock["ID"], $ID); if( !isset($arFields["WF_PARENT_ELEMENT_ID"]) && $arIBlock["FIELDS"]["LOG_ELEMENT_ADD"]["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), false, false, array("LIST_PAGE_URL", "NAME", "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_ADD", "iblock", $arIBlock["ID"], serialize($res) ); } } if($bWorkFlow && (int)$arFields["WF_PARENT_ELEMENT_ID"]<=0) { // It is completly new element - so make it copy unset($arFields["WF_NEW"]); $arFields["WF_PARENT_ELEMENT_ID"] = $ID; $arNewFields = $arFields; $arNewFields["PREVIEW_PICTURE"] = $COPY_PREVIEW_PICTURE; $arNewFields["DETAIL_PICTURE"] = $COPY_DETAIL_PICTURE; if(is_array($arNewFields["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($arNewFields["PROPERTY_VALUES"][$arProp["CODE"]]); unset($arNewFields["PROPERTY_VALUES"][$arProp["ID"]]); $arNewFields["PROPERTY_VALUES"][$arProp["ID"]] = array(); } if($i > 0) { $props = CIBlockElement::GetProperty($arFields["IBLOCK_ID"], $ID, "sort", "asc", array("PROPERTY_TYPE" => "F", "EMPTY" => "N")); while($arProp = $props->Fetch()) { $arNewFields["PROPERTY_VALUES"][$arProp["ID"]][$arProp['PROPERTY_VALUE_ID']] = array( "VALUE" => $arProp["VALUE"], "DESCRIPTION" => $arProp["DESCRIPTION"], ); } } } $WF_ID = $this->Add($arNewFields); if($this->bWF_SetMove) CIBlockElement::WF_SetMove($WF_ID); } $Result = $ID; $arFields["ID"] = &$ID; CDiskQuota::recalculateDb(); self::$elementIblock[$ID] = $arIBlock['ID']; } 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"])); } $arFields["RESULT"] = &$Result; foreach (GetModuleEvents("iblock", "OnAfterIBlockElementAdd", true) as $arEvent) ExecuteModuleEventEx($arEvent, array(&$arFields)); CIBlock::clearIblockTagCache($arIBlock['ID']); IblockElementTable::cleanCache(); return $Result; }