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;
}