AnonSec Shell
Server IP : 85.193.89.191  /  Your IP : 3.144.122.33
Web Server : Apache
System : Linux 956367-cx40159.tmweb.ru 3.10.0-1160.105.1.el7.x86_64 #1 SMP Thu Dec 7 15:39:45 UTC 2023 x86_64
User : bitrix ( 600)
PHP Version : 8.1.27
Disable Function : NONE
MySQL : OFF  |  cURL : OFF  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /home/bitrix/www/bitrix/components/bitrix/lists.element.edit/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME ]     

Current File : /home/bitrix/www/bitrix/components/bitrix/lists.element.edit//component.php
<?php

if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true)
{
	die();
}

/** @global CMain $APPLICATION */
/** @global CUser $USER */
/** @global CDatabase $DB */
/** @var CBitrixComponent $this */
/** @var array $arParams */
/** @var array $arResult */
/** @var string $componentName */
/** @var string $componentPath */
/** @var string $componentTemplate */
/** @var string $parentComponentName */
/** @var string $parentComponentPath */
/** @var string $parentComponentTemplate */
$this->setFrameMode(false);

if(!\Bitrix\Main\Loader::includeModule('lists'))
{
	ShowError(\Bitrix\Main\Localization\Loc::getMessage('CC_BLEE_MODULE_NOT_INSTALLED'));

	return;
}

$arResult = [];

require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/iblock/admin_tools.php');
\Bitrix\Main\Page\Asset::getInstance()->addJs('/bitrix/js/iblock/iblock_edit.js');

$IBLOCK_ID = is_array($arParams['~IBLOCK_ID'])? 0: (int)$arParams['~IBLOCK_ID'];
$ELEMENT_ID = is_array($arParams['~ELEMENT_ID'])? 0: (int)$arParams['~ELEMENT_ID'];
$SECTION_ID = is_array($arParams['~SECTION_ID'])? 0: (int)$arParams['~SECTION_ID'];

$accessService =
	(new \Bitrix\Lists\Api\Service\AccessService(
		(int)$USER->GetID(),
		new \Bitrix\Lists\Service\Param([
			'IBLOCK_TYPE_ID' => (string)$arParams['~IBLOCK_TYPE_ID'],
			'IBLOCK_ID' => $IBLOCK_ID,
			'SOCNET_GROUP_ID' => (int)($arParams['~SOCNET_GROUP_ID'] ?? 0),
		])
	))
;
$checkPermissionResult = $accessService->checkElementPermission($ELEMENT_ID, $SECTION_ID);
if (!$checkPermissionResult->isSuccess())
{
	ShowError($checkPermissionResult->getErrorMessages()[0]);

	return;
}

$rightParam = $checkPermissionResult->getRightParam();
$elementRight = $checkPermissionResult->getElementRight();

$arResult['IS_SOCNET_GROUP_CLOSED'] = $rightParam->getClosedStatusSocnetGroup();

if (
	($ELEMENT_ID !== 0 && !$elementRight->canRead())
	|| ($ELEMENT_ID === 0 && !$elementRight->canAdd())
)
{
	ShowError(\Bitrix\Main\Localization\Loc::getMessage('CC_BLEE_ACCESS_DENIED'));

	return;
}

$copy_id = (int)($_REQUEST['copy_id'] ?? 0);
if (
	($copy_id > 0)
	&& !$accessService
		->checkElementPermission($copy_id, $SECTION_ID, \Bitrix\Lists\Security\ElementRight::READ)
		->isSuccess()
)
{
	ShowError(\Bitrix\Main\Localization\Loc::getMessage('CC_BLEE_ACCESS_DENIED'));

	return;
}

$arParams['CAN_EDIT'] = $elementRight->canEdit();
$arResult['CAN_EDIT_RIGHTS'] = $elementRight->canEditRights();
$arResult['CAN_ADD_ELEMENT'] = $elementRight->canAdd();
$arResult['CAN_DELETE_ELEMENT'] = $elementRight->canDelete();
$arResult['CAN_FULL_EDIT'] = $ELEMENT_ID > 0 && $elementRight->canFullEdit();

$lists_perm = $checkPermissionResult->getPermission();

$arResult["IBLOCK_PERM"] = $lists_perm;
$arResult["USER_GROUPS"] = $USER->GetUserGroupArray();
$arIBlock = CIBlock::GetArrayByID(intval($arParams["~IBLOCK_ID"]));
$arResult["~IBLOCK"] = $arIBlock;
$arResult["IBLOCK"] = htmlspecialcharsex($arIBlock);
$arResult["IBLOCK_ID"] = $arIBlock["ID"];

if(isset($arParams["SOCNET_GROUP_ID"]) && $arParams["SOCNET_GROUP_ID"] > 0)
	$arParams["SOCNET_GROUP_ID"] = intval($arParams["SOCNET_GROUP_ID"]);
else
	$arParams["SOCNET_GROUP_ID"] = "";

$arResult["GRID_ID"] = "lists_list_elements_".$arResult["IBLOCK_ID"];
if ($ELEMENT_ID)
	$arResult["FORM_ID"] = "lists_element_edit_".$arResult["IBLOCK_ID"];
else
	$arResult["FORM_ID"] = "lists_element_add_".$arResult["IBLOCK_ID"];

$bBizproc = (
	\Bitrix\Main\Loader::includeModule('bizproc')
	&& CLists::isBpFeatureEnabled($arParams["IBLOCK_TYPE_ID"])
	&& ($arIBlock["BIZPROC"] != "N")
);

$arResult["~LISTS_URL"] = str_replace(
	array("#group_id#"),
	array($arParams["SOCNET_GROUP_ID"]),
	$arParams["~LISTS_URL"]
);
$arResult["LISTS_URL"] = htmlspecialcharsbx($arResult["~LISTS_URL"]);

$arResult["~LIST_URL"] = CHTTP::urlAddParams(str_replace(
	array("#list_id#", "#section_id#", "#group_id#"),
	array($arResult["IBLOCK_ID"], 0, $arParams["SOCNET_GROUP_ID"]),
	$arParams["~LIST_URL"]
), array("list_section_id" => ""));
$arResult["LIST_URL"] = htmlspecialcharsbx($arResult["~LIST_URL"]);

$arResult["~LIST_SECTION_URL"] = str_replace(
	array("#list_id#", "#section_id#", "#group_id#"),
	array($arResult["IBLOCK_ID"], intval($arParams["~SECTION_ID"]), $arParams["SOCNET_GROUP_ID"]),
	$arParams["~LIST_URL"]
);
if ($SECTION_ID)
{
	$arResult["~LIST_SECTION_URL"] = CHTTP::urlAddParams(
		$arResult["~LIST_SECTION_URL"], ["list_section_id" => $SECTION_ID]);
}
$arResult["LIST_SECTION_URL"] = htmlspecialcharsbx($arResult["~LIST_SECTION_URL"]);

if ($ELEMENT_ID > 0)
{
	$copy_id = 0;
	$arResult["LIST_COPY_ELEMENT_URL"] = CHTTP::urlAddParams(str_replace(
			array("#list_id#", "#section_id#", "#element_id#", "#group_id#"),
			array($arResult["IBLOCK_ID"], intval($arResult["SECTION_ID"] ?? 0), 0, $arParams["SOCNET_GROUP_ID"]),
			$arParams["~LIST_ELEMENT_URL"]
		),
		array("copy_id" => $ELEMENT_ID),
		array("skip_empty" => true, "encode" => true)
	);
	if(isset($_GET["list_section_id"]) && $_GET["list_section_id"] == '')
		$arResult["LIST_COPY_ELEMENT_URL"] = CHTTP::urlAddParams($arResult["LIST_COPY_ELEMENT_URL"], array("list_section_id" => ""));
}
else
{
	if (isset($_REQUEST["copy_id"]) && $_REQUEST["copy_id"] > 0)
		$copy_id = intval($_REQUEST["copy_id"]);
}

$arResult["COPY_ID"] = $copy_id;

$obList = new CList($arIBlock["ID"]);

$arResult["FIELDS"] = $obList->GetFields();
if($bBizproc)
	$arSelect = array("ID", "IBLOCK_ID", "NAME", "IBLOCK_SECTION_ID", "CREATED_BY", "BP_PUBLISHED");
else
	$arSelect = array("ID", "IBLOCK_ID", "NAME", "IBLOCK_SECTION_ID");

$arProps = array();
foreach($arResult["FIELDS"] as $FIELD_ID => $arField)
{
	if($obList->is_field($FIELD_ID))
		$arSelect[] = $FIELD_ID;
	else
		$arProps[] = $FIELD_ID;

	if($FIELD_ID == "CREATED_BY")
		$arSelect[] = "CREATED_USER_NAME";

	if($FIELD_ID == "MODIFIED_BY")
		$arSelect[] = "USER_NAME";
}

$rsElement = CIBlockElement::GetList(
	array(),
	array(
		"IBLOCK_ID" => $arResult["IBLOCK_ID"],
		"=ID" => ($copy_id? $copy_id: $arParams["ELEMENT_ID"]),
		"SHOW_NEW" => ($arResult["CAN_FULL_EDIT"] ? "Y" : "N")
	),
	false,
	false,
	$arSelect
);
$arResult["ELEMENT"] = $rsElement->GetNextElement();

if(is_object($arResult["ELEMENT"]))
	$arResult["ELEMENT_FIELDS"] = $arResult["ELEMENT"]->GetFields();
else
	$arResult["ELEMENT_FIELDS"] = array();

if(is_object($arResult["ELEMENT"]) && !$copy_id)
	$arResult["ELEMENT_ID"] = intval($arResult["ELEMENT_FIELDS"]["ID"]);
else
	$arResult["ELEMENT_ID"] = 0;

$arResult["ELEMENT_PROPS"] = array();
if(is_object($arResult["ELEMENT"]) && count($arProps))
{
	$rsProperties = CIBlockElement::GetProperty(
		$arResult["IBLOCK_ID"],
		$copy_id? $copy_id: $arParams["ELEMENT_ID"],
		array(
			"sort"=>"asc",
			"id"=>"asc",
			"enum_sort"=>"asc",
			"value_id"=>"asc",
		),
		array(
			"ACTIVE"=>"Y",
			"EMPTY"=>"N",
		)
	);
	while($arProperty = $rsProperties->Fetch())
	{
		$prop_id = $arProperty["ID"];
		if(!array_key_exists($prop_id, $arResult["ELEMENT_PROPS"]))
		{
			$arResult["ELEMENT_PROPS"][$prop_id] = $arProperty;
			unset($arResult["ELEMENT_PROPS"][$prop_id]["DESCRIPTION"]);
			unset($arResult["ELEMENT_PROPS"][$prop_id]["VALUE_ENUM_ID"]);
			unset($arResult["ELEMENT_PROPS"][$prop_id]["VALUE_ENUM"]);
			unset($arResult["ELEMENT_PROPS"][$prop_id]["VALUE_XML_ID"]);
			$arResult["ELEMENT_PROPS"][$prop_id]["FULL_VALUES"] = array();
			$arResult["ELEMENT_PROPS"][$prop_id]["VALUES_LIST"] = array();
		}

		$arResult["ELEMENT_PROPS"][$prop_id]["FULL_VALUES"][$arProperty["PROPERTY_VALUE_ID"]] = array(
			"VALUE" => $arProperty["VALUE"],
			"DESCRIPTION" => $arProperty["DESCRIPTION"],
		);
		$arResult["ELEMENT_PROPS"][$prop_id]["VALUES_LIST"][$arProperty["PROPERTY_VALUE_ID"]] = $arProperty["VALUE"];
	}
}

$section_id = intval($arParams["~SECTION_ID"]);
$arSection = false;
if($section_id)
{
	$rsSection = CIBlockSection::GetList(array(), array(
		"IBLOCK_ID" => $arIBlock["ID"],
		"ID" => $section_id,
		"GLOBAL_ACTIVE" => "Y",
		"CHECK_PERMISSIONS" => "N",
	));
	$arSection = $rsSection->GetNext();
}
$arResult["SECTION"] = $arSection;
if($arResult["SECTION"])
{
	$arResult["SECTION_ID"] = $arResult["SECTION"]["ID"];
	$arResult["SECTION_PATH"] = array();
	$rsPath = CIBlockSection::GetNavChain($arResult["IBLOCK_ID"], $arResult["SECTION_ID"]);
	while($arPath = $rsPath->Fetch())
	{
		$arResult["SECTION_PATH"][] = array(
			"NAME" => htmlspecialcharsex($arPath["NAME"]),
			"URL" => str_replace(
					array("#list_id#", "#section_id#", "#group_id#"),
					array($arIBlock["ID"], intval($arPath["ID"]), $arParams["SOCNET_GROUP_ID"]),
					$arParams["LIST_URL"]
			),
		);
	}
}
else
{
	$arResult["SECTION_ID"] = false;
}


$tab_name = $arResult["FORM_ID"]."_active_tab";

//Assume there was no error
$bVarsFromForm = false;
$arResult["BACK_URL"] = $arResult["~LIST_SECTION_URL"];

//todo after crm realized
if (!function_exists("isUsePrefix"))
{
	function isUsePrefix(array $property)
	{
		if (is_array($property['USER_TYPE_SETTINGS']))
		{
			if (array_key_exists('VISIBLE', $property['USER_TYPE_SETTINGS']))
				unset($property['USER_TYPE_SETTINGS']['VISIBLE']);
			$tmpArray = array_filter($property['USER_TYPE_SETTINGS'], function($mark)
			{
				return $mark == "Y";
			});
			if (count($tmpArray) == 1)
			{
				return false;
			}
		}

		return true;
	}
}

$arResult["EXTERNAL_CONTEXT"] = isset($_REQUEST["external_context"]) ? $_REQUEST["external_context"] : "";
if(!empty($arResult["EXTERNAL_CONTEXT"]))
{
	$arResult["BACK_URL"] = CHTTP::urlAddParams($APPLICATION->getCurPageParam(),
		array("external_context_canceled" => "y"));
	if(!empty($_REQUEST['external_context_canceled']))
	{
		$arResult['EXTERNAL_EVENT'] = array(
			'NAME' => 'onElementCreate',
			'IS_CANCELED' => true,
			'PARAMS' => array(
				'isCanceled' => true,
				'context' => $arResult['EXTERNAL_CONTEXT']
			)
		);
		$this->includeComponentTemplate('event');
		return;
	}
	$externalFieldId = isset($_REQUEST["fieldId"]) ? $_REQUEST["fieldId"] : "";
	$externalDefaultValue = isset($_REQUEST["defaultValue"]) ? $_REQUEST["defaultValue"] : "";
	if($externalFieldId && $externalDefaultValue)
	{
		foreach($arResult["FIELDS"] as $fieldId => $field)
		{
			if ($fieldId == $externalFieldId)
			{
				//todo after crm realized
				//Bitrix\Crm\Integration\IBlockElementProperty::isUsePrefix($field);
				if (!isUsePrefix($field))
				{
					$explode = explode("_", $externalDefaultValue);
					$externalDefaultValue = intval($explode[1]);
				}
				$arResult["FIELDS"][$fieldId]['DEFAULT_VALUE'] = $externalDefaultValue;
			}
		}
	}
}

if (
	CLists::isEnabledLockFeature($arResult["IBLOCK_ID"])
	&& $arParams["CAN_EDIT"]
	&& $ELEMENT_ID > 0
)
{
	if (CIBlockElement::WF_IsLocked($ELEMENT_ID, $lockedBy, $dateLock))
	{
		$arParams["CAN_EDIT"] = false;
	}
	else
	{
		CIBlockElement::WF_Lock($ELEMENT_ID);
	}
}

//Form submitted
if(
	$_SERVER["REQUEST_METHOD"] == "POST"
	&& check_bitrix_sessid()
	&& !$arResult["IS_SOCNET_GROUP_CLOSED"]
	&& (
		$arParams["CAN_EDIT"]
		|| (
			$ELEMENT_ID > 0
			&& CIBlockElementRights::UserHasRightTo($IBLOCK_ID, $ELEMENT_ID, "element_delete")
		) /*|| (
			CIBlockElementRights::UserHasRightTo($IBLOCK_ID, $ELEMENT_ID, "element_bizproc_start")
		)*/
	)
)
{

	$obList->ActualizeDocumentAdminPage(str_replace(
		array("#list_id#", "#group_id#"),
		array($arResult["IBLOCK_ID"], $arParams["SOCNET_GROUP_ID"]),
		$arParams["~LIST_ELEMENT_URL"]
	));

	if(
		$arResult["ELEMENT_ID"]
		&& isset($_POST["action"])
		&& $_POST["action"]==="delete"
	)
	{
		if(
			$lists_perm >= CListPermissions::CAN_WRITE
			|| CIBlockElementRights::UserHasRightTo($IBLOCK_ID, $ELEMENT_ID, "element_delete")
		)
		{
			$DB->StartTransaction();
			$APPLICATION->ResetException();
			$obElement = new CIBlockElement;
			if(!$obElement->Delete($arResult["ELEMENT_ID"]))
			{
				$DB->Rollback();
				if($ex = $APPLICATION->GetException())
					ShowError(GetMessage("CC_BLEE_DELETE_ERROR")." ".$ex->GetString());
				else
					ShowError(GetMessage("CC_BLEE_DELETE_ERROR")." ".GetMessage("CC_BLEE_UNKNOWN_ERROR"));
				$bVarsFromForm = true;
			}
			else
			{
				$DB->Commit();
				LocalRedirect($arResult["~LIST_SECTION_URL"]);
			}
		}
		else
		{
			ShowError(GetMessage("CC_BLEE_DELETE_ERROR")." ".GetMessage("CC_BLEE_UNKNOWN_ERROR"));
			$bVarsFromForm = true;
			LocalRedirect($arResult["~LIST_SECTION_URL"]);
		}
	}
	elseif(
		(isset($_POST["save"]) || isset($_POST["apply"]))
		&& $arParams["CAN_EDIT"]
	)
	{
		$strError = "";

		//Gather fields for update
		$arElement = array(
			"IBLOCK_ID" => $arResult["IBLOCK_ID"],
			"IBLOCK_SECTION_ID" => $_POST["IBLOCK_SECTION_ID"],
			"NAME" => $_POST["NAME"],
		);
		$arProps = array();
		$additionalActions = array();
		foreach($arResult["FIELDS"] as $FIELD_ID => $arField)
		{
			if (
				$arResult['ELEMENT_ID'] > 0
				&& isset($arField['SETTINGS']['EDIT_READ_ONLY_FIELD'])
				&& $arField['SETTINGS']['EDIT_READ_ONLY_FIELD'] === 'Y'
				&& $arField['TYPE'] !== 'L'
			)
			{
				//readonly field, skip writing
				continue;
			}

			if($FIELD_ID == "PREVIEW_PICTURE" || $FIELD_ID == "DETAIL_PICTURE")
			{
				$arElement[$FIELD_ID] = $_FILES[$FIELD_ID];
				if(isset($_POST[$FIELD_ID."_del"]) && $_POST[$FIELD_ID."_del"]=="Y")
					$arElement[$FIELD_ID]["del"] = "Y";
			}
			elseif($FIELD_ID == "PREVIEW_TEXT" || $FIELD_ID == "DETAIL_TEXT")
			{
				if(
					isset($arField["SETTINGS"])
					&& is_array($arField["SETTINGS"])
					&& $arField["SETTINGS"]["USE_EDITOR"] == "Y"
				)
					$arElement[$FIELD_ID."_TYPE"] = "html";
				else
					$arElement[$FIELD_ID."_TYPE"] = "text";

				$arElement[$FIELD_ID] = $_POST[$FIELD_ID];
			}
			elseif($obList->is_field($FIELD_ID))
			{
				$arElement[$FIELD_ID] = $_POST[$FIELD_ID] ?? null;
			}
			elseif($arField["PROPERTY_TYPE"] == "F")
			{
				if(isset($_POST[$FIELD_ID."_del"]))
					$arDel = $_POST[$FIELD_ID."_del"];
				else
					$arDel = array();

				$arProps[$arField["ID"]] = array();
				if(!empty($_FILES[$FIELD_ID]))
					CFile::ConvertFilesToPost($_FILES[$FIELD_ID], $arProps[$arField["ID"]]);
				foreach($arProps[$arField["ID"]] as $file_id => $arFile)
				{
					if(
						isset($arDel[$file_id])
						&& (
							(!is_array($arDel[$file_id]) && $arDel[$file_id]=="Y")
							|| (is_array($arDel[$file_id]) && $arDel[$file_id]["VALUE"]=="Y")
						)
					)
					{
						if(!$arFile["VALUE"]["error"])
							continue;
						if(isset($arProps[$arField["ID"]][$file_id]["VALUE"]))
							$arProps[$arField["ID"]][$file_id]["VALUE"]["del"] = "Y";
						else
							$arProps[$arField["ID"]][$file_id]["del"] = "Y";
					}
				}
			}
			elseif($arField["PROPERTY_TYPE"] == "N")
			{
				if(is_array($_POST[$FIELD_ID]) && !array_key_exists("VALUE", $_POST[$FIELD_ID]))
				{
					$arProps[$arField["ID"]] = array();
					foreach($_POST[$FIELD_ID] as $key=>$value)
					{
						if(is_array($value))
						{
							if($value["VALUE"] <> '')
							{
								$value = str_replace(" ", "", str_replace(",", ".", $value["VALUE"]));
								if(!is_numeric($value))
								{
									$strError .= GetMessage('CC_BLEE_VALIDATE_FIELD_ERROR', array('#NAME#' => $arField['NAME']))."<br />";
								}
								$arProps[$arField["ID"]][$key] = doubleval($value);
							}

						}
						else
						{
							if($value <> '')
							{
								$value = str_replace(" ", "", str_replace(",", ".", $value));
								if(!is_numeric($value))
								{
									$strError .= GetMessage('CC_BLEE_VALIDATE_FIELD_ERROR', array('#NAME#' => $arField['NAME']))."<br />";
								}
								$arProps[$arField["ID"]][$key] = doubleval($value);
							}
						}
					}
				}
				else
				{
					if(is_array($_POST[$FIELD_ID]))
					{
						if($_POST[$FIELD_ID]["VALUE"] <> '')
						{
							$value = str_replace(" ", "", str_replace(",", ".", $_POST[$FIELD_ID]["VALUE"]));
							if(!is_numeric($value))
							{
								$strError .= GetMessage('CC_BLEE_VALIDATE_FIELD_ERROR', array('#NAME#' => $arField['NAME']))."<br />";
							}
							$arProps[$arField["ID"]] = doubleval($_POST[$FIELD_ID]["VALUE"]);
						}
					}
					else
					{
						if($_POST[$FIELD_ID] <> '')
						{
							$value = str_replace(" ", "", str_replace(",", ".", $_POST[$FIELD_ID]));
							if(!is_numeric($value))
							{
								$strError .= GetMessage('CC_BLEE_VALIDATE_FIELD_ERROR', array('#NAME#' => $arField['NAME']))."<br />";
							}
							$arProps[$arField["ID"]] = doubleval($_POST[$FIELD_ID]);
						}
					}
				}
			}
			elseif($arField["PROPERTY_TYPE"] == "E")
			{
				$arField["VALUE"] = $_POST[$FIELD_ID] ?? null;
				$additionalActions[$arField["ID"]] = $arField;
				$arProps[$arField["ID"]] = $_POST[$FIELD_ID] ?? null;
			}
			else
			{
				if (isset($arField["PROPERTY_USER_TYPE"]["USER_TYPE"]))
				{
					switch ($arField["PROPERTY_USER_TYPE"]["USER_TYPE"])
					{
						case "DiskFile":
							if (is_array($_POST[$FIELD_ID]) && !empty($_POST[$FIELD_ID]))
							{
								$arProps[$arField["ID"]] = $_POST[$FIELD_ID];
							}
							break;
						default:
							$arProps[$arField["ID"]] = $_POST[$FIELD_ID] ?? ['VALUE' => ''];
					}
				}
				else
				{
					$arProps[$arField["ID"]] = $_POST[$FIELD_ID];
				}
			}
		}

		$arElement["MODIFIED_BY"] = $USER->GetID();
		unset($arElement["TIMESTAMP_X"]);

		if(count($arProps))
		{
			$arElement["PROPERTY_VALUES"] = $arProps;
			if($arResult["ELEMENT_ID"] > 0)
			{
				//We have to read properties from database in order not to delete its values
				$dbPropV = CIBlockElement::GetProperty(
					$arResult["IBLOCK_ID"],
					$arResult["ELEMENT_ID"],
					"sort", "asc",
					array("ACTIVE"=>"Y")
				);
				while($arPropV = $dbPropV->Fetch())
				{
					if (!isset($arProps[$arPropV["ID"]]))
					{
						$arElement["PROPERTY_VALUES"][$arPropV["ID"]] = [
							$arPropV["PROPERTY_VALUE_ID"] => [
								"VALUE" => $arPropV["VALUE"],
								"DESCRIPTION" => $arPropV["DESCRIPTION"],
							],
						];
					}
				}
			}
		}

		if(
			$arResult["IBLOCK"]["RIGHTS_MODE"] === 'E'
			&& $arResult["CAN_EDIT_RIGHTS"]
		)
		{
			if(is_array($_POST["RIGHTS"] ?? null))
				$postRights = CIBlockRights::Post2Array($_POST["RIGHTS"]);
			else
				$postRights = array();

			if($ELEMENT_ID)
				$objectRights = new CIBlockElementRights($arResult["IBLOCK_ID"], $ELEMENT_ID);
			else
				$objectRights = new CIBlockSectionRights($arResult["IBLOCK_ID"], $SECTION_ID);
			$rights = $objectRights->GetRights();
			$arElement["RIGHTS"] = array();
			foreach($rights as $rightId => $right)
			{
				if(array_key_exists($rightId, $postRights))
					$arElement["RIGHTS"][$rightId] = $right;
			}
			foreach($postRights as $rightId => $right)
				$arElement["RIGHTS"][$rightId] = $right;

		}

		//---BP---
		$arResult["isConstantsTuned"] = false;
		if($bBizproc)
		{
			$documentType = BizProcDocument::generateDocumentComplexType($arParams["IBLOCK_TYPE_ID"], $arResult["IBLOCK_ID"]);
			$arDocumentStates = CBPDocument::GetDocumentStates(
				$documentType,
				($arResult["ELEMENT_ID"] > 0) ? BizProcDocument::getDocumentComplexId(
					$arParams["IBLOCK_TYPE_ID"], $arResult["ELEMENT_ID"]) : null,
				"Y"
			);

			$templatesOnStartup = false;
			$arCurrentUserGroups = $USER->GetUserGroupArray();
			if(!$arResult["ELEMENT_FIELDS"] || $arResult["ELEMENT_FIELDS"]["CREATED_BY"] == $USER->GetID())
			{
				$arCurrentUserGroups[] = "author";
			}

			if($arResult["ELEMENT_ID"])
			{
				$canWrite = CBPDocument::CanUserOperateDocument(
					CBPCanUserOperateOperation::WriteDocument,
					$USER->GetID(),
					BizProcDocument::getDocumentComplexId($arParams["IBLOCK_TYPE_ID"], $arResult["ELEMENT_ID"]),
					array("AllUserGroups" => $arCurrentUserGroups, "DocumentStates" => $arDocumentStates)
				);
			}
			else
			{
				$canWrite = CBPDocument::CanUserOperateDocumentType(
					CBPCanUserOperateOperation::WriteDocument,
					$USER->GetID(),
					$documentType,
					array("AllUserGroups" => $arCurrentUserGroups, "DocumentStates" => $arDocumentStates)
				);
			}

			if(!$canWrite)
				$strError = GetMessage("CC_BLEE_ACCESS_DENIED_STATUS");

			if(!$strError)
			{
				$arBizProcParametersValues = array();
				foreach ($arDocumentStates as $arDocumentState)
				{
					if($arDocumentState["ID"] == '')
					{
						$templatesOnStartup = true;
						$arErrorsTmp = array();

						$arBizProcParametersValues[$arDocumentState["TEMPLATE_ID"]] = CBPDocument::StartWorkflowParametersValidate(
							$arDocumentState["TEMPLATE_ID"],
							$arDocumentState["TEMPLATE_PARAMETERS"],
							$documentType,
							$arErrorsTmp
						);

						foreach($arErrorsTmp as $e)
							$strError .= $e["message"]."<br />";
					}
				}
				$templates = array_merge(
					\CBPWorkflowTemplateLoader::SearchTemplatesByDocumentType($documentType, CBPDocumentEventType::Create),
					\CBPWorkflowTemplateLoader::SearchTemplatesByDocumentType($documentType, CBPDocumentEventType::Edit)
				);
				foreach($templates as $template)
				{
					if(!CBPWorkflowTemplateLoader::isConstantsTuned($template["ID"]))
					{
						$strError .= GetMessage('CC_BLEE_IS_CONSTANTS_TUNED')."<br />";
						$arResult["isConstantsTuned"] = true;
						break;
					}
				}
			}
		}

		if(!$strError)
		{
			$obElement = new CIBlockElement;

			if($arResult["ELEMENT_ID"])
			{
				if (CLists::isEnabledLockFeature($arResult["IBLOCK_ID"]) &&
					CIBlockElement::WF_IsLocked($ELEMENT_ID, $lockedBy, $dateLock))
				{
					$strError = GetMessage("CC_BLEE_ELEMENT_LOCKED");
				}
				else
				{
					$res = $obElement->Update($arResult["ELEMENT_ID"], $arElement, false, true, true);
					if(!$res)
						$strError = $obElement->LAST_ERROR;
				}
			}
			else
			{
				$res = $obElement->Add($arElement, false, true, true);
				if($res)
					$arResult["ELEMENT_ID"] = $res;
				else
					$strError = $obElement->LAST_ERROR;
			}
		}

		if(!$strError && $bBizproc)
		{
			/* Find the new or modified field. */
			$changedFields = array();
			if($ELEMENT_ID && $templatesOnStartup)
			{
				$changedFields = CLists::checkChangedFields(
					$arResult["IBLOCK_ID"],
					$arResult["ELEMENT_ID"],
					$arSelect,
					$arResult["ELEMENT_FIELDS"],
					$arResult["ELEMENT_PROPS"]
				);
			}

			$arBizProcWorkflowId = array();
			foreach($arDocumentStates as $arDocumentState)
			{
				if($arDocumentState["ID"] == '')
				{
					$currentUserId = \Bitrix\Main\Engine\CurrentUser::get()->getId();
					$workflowParameters =
						isset($arBizProcParametersValues) && is_array($arBizProcParametersValues)
							? ($arBizProcParametersValues[$arDocumentState['TEMPLATE_ID']] ?? [])
							: []
					;

					$timeToStart = null;
					if (isset($_POST['timeToStart']) && is_numeric($_POST['timeToStart']))
					{
						$timeToStart = (int)$_POST['timeToStart'];
					}
					$startWorkflowRequest = new \Bitrix\Bizproc\Api\Request\WorkflowService\StartWorkflowRequest(
						userId: $currentUserId,
						targetUserId: $currentUserId,
						templateId: $arDocumentState["TEMPLATE_ID"],
						complexDocumentId: BizProcDocument::getDocumentComplexId(
							$arParams["IBLOCK_TYPE_ID"],
							$arResult["ELEMENT_ID"],
						),
						parameters: array_merge(
							$workflowParameters,
							[
								CBPDocument::PARAM_TAGRET_USER => 'user_' . $currentUserId,
								CBPDocument::PARAM_MODIFIED_DOCUMENT_FIELDS => $changedFields,
							]
						),
						startDuration: $timeToStart >= 0 ? $timeToStart : null,
					);
					$workflowService = new \Bitrix\Bizproc\Api\Service\WorkflowService(
						accessService: new \Bitrix\Lists\Api\Service\WorkflowAccessService(),
					);
					$startWorkflowResponse = $workflowService->startWorkflow($startWorkflowRequest);

					if (!$startWorkflowResponse->isSuccess())
					{
						foreach ($startWorkflowResponse->getErrors() as $error)
						{
							$strError .= $error->getMessage() . '<br/>';
						}
					}
				}
			}

			$bizprocIndex = intval($_REQUEST["bizproc_index"] ?? 0);
			if($bizprocIndex > 0)
			{
				for($i = 1; $i <= $bizprocIndex; $i++)
				{
					$bpId = trim($_REQUEST["bizproc_id_".$i]);
					$bpTemplateId = intval($_REQUEST["bizproc_template_id_".$i]);
					$bpEvent = trim($_REQUEST["bizproc_event_".$i]);

					if($bpEvent <> '')
					{
						if($bpId <> '')
						{
							if(!array_key_exists($bpId, $arDocumentStates))
								continue;
						}
						else
						{
							if(!array_key_exists($bpTemplateId, $arDocumentStates))
								continue;
							$bpId = $arBizProcWorkflowId[$bpTemplateId];
						}

						$arErrorTmp = array();
						CBPDocument::SendExternalEvent(
							$bpId,
							$bpEvent,
							array("Groups" => $arCurrentUserGroups, "User" => $GLOBALS["USER"]->GetID()),
							$arErrorTmp
						);

						foreach ($arErrorTmp as $e)
						{
							$strError .= $e["message"]."<br />";
						}
					}
				}
			}

			$arDocumentStates = null;
			/*if($arElement["NAME"])
			{
				CBPDocument::AddDocumentToHistory(
					BizProcDocument::getDocumentComplexId($arParams["IBLOCK_TYPE_ID"], $arResult["ELEMENT_ID"]),
					$arElement["NAME"],
					$GLOBALS["USER"]->GetID()
				);
			}*/
		}

		if(!$strError)
		{
			//Successfull update

			$url = CHTTP::urlAddParams(str_replace(
				array("#list_id#", "#section_id#", "#element_id#", "#group_id#"),
				array($arResult["IBLOCK_ID"], intval($_POST["IBLOCK_SECTION_ID"]), $arResult["ELEMENT_ID"], $arParams["SOCNET_GROUP_ID"]),
				$arParams["~LIST_ELEMENT_URL"]
			),
				array($tab_name => $_POST[$tab_name]),
				array("skip_empty" => true, "encode" => true)
			);
			if(isset($_GET["list_section_id"]) && $_GET["list_section_id"] == '')
				$url = CHTTP::urlAddParams($url, array("list_section_id" => ""));

			if(isset($arResult['EXTERNAL_CONTEXT']) && $arResult['EXTERNAL_CONTEXT'] !== '')
			{
				$arResult['EXTERNAL_EVENT'] = array(
					'NAME' => 'onElementCreate',
					'IS_CANCELED' => false,
					'PARAMS' => array(
						'isCanceled' => false,
						'context' => $arResult['EXTERNAL_CONTEXT'],
						'elementInfo' => array(
							'iblockTypeId' => $arParams['IBLOCK_TYPE_ID'],
							'iblockId' => $arResult['IBLOCK_ID'],
							'socnetGroupId' => $arParams['SOCNET_GROUP_ID'],
							'elementId' => $arResult["ELEMENT_ID"],
							'elementUrl' => $url,
							'elementName' => $arElement['NAME']
						),
					)
				);
				$this->includeComponentTemplate('event');
				return;
			}

			CIBlockElement::WF_UnLock($arResult["ELEMENT_ID"]);

			//And go to proper page
			if(isset($_POST["save"]))
			{
				LocalRedirect($arResult["~LIST_SECTION_URL"]);
			}
			elseif(
				$lists_perm < CListPermissions::CAN_READ
				&& !CIBlockElementRights::UserHasRightTo($arResult["IBLOCK_ID"], $arResult["ELEMENT_ID"], "element_read")
			)
			{
				LocalRedirect($arResult["~LIST_SECTION_URL"]);
			}
			else
			{
				LocalRedirect($url);
			}
		}
		else
		{
			ShowError($strError);
			$bVarsFromForm = true;
		}
	}
	else
	{
		//Go to list section page
		LocalRedirect($arResult["~LIST_SECTION_URL"]);
	}
}

$arResult["ELEMENT_URL"] = str_replace(
	array("#list_id#", "#section_id#", "#element_id#", "#group_id#"),
	array($arResult["IBLOCK_ID"], intval($arParams["~SECTION_ID"]), $arResult["ELEMENT_ID"], $arParams["SOCNET_GROUP_ID"]),
	$arParams["LIST_ELEMENT_URL"]
);

$data = array();
if($bVarsFromForm)
{//There was an error so display form values
	$data["NAME"] = $_POST["NAME"];
	$data["IBLOCK_SECTION_ID"] = $_POST["IBLOCK_SECTION_ID"];
}
elseif($arResult["ELEMENT_ID"] || $copy_id)
{//Edit existing field
	$data["NAME"] = $arResult["ELEMENT_FIELDS"]["NAME"];
	$data["IBLOCK_SECTION_ID"] = $arResult["ELEMENT_FIELDS"]["IBLOCK_SECTION_ID"];
}
else
{//New one
	$data["NAME"] = GetMessage("CC_BLEE_FIELD_NAME_DEFAULT");
	$data["IBLOCK_SECTION_ID"] = $arResult["SECTION_ID"]? $arResult["SECTION_ID"]: "";
}

foreach($arResult["FIELDS"] as $FIELD_ID => $arField)
{
	if($obList->is_field($FIELD_ID))
	{
		if($FIELD_ID == "ACTIVE_FROM")
		{
			if($bVarsFromForm)
				$data[$FIELD_ID] = $_POST[$FIELD_ID];
			elseif($arResult["ELEMENT_ID"] || $copy_id)
				$data[$FIELD_ID] = $arResult["ELEMENT_FIELDS"]["~".$FIELD_ID];
			elseif($arField["DEFAULT_VALUE"] === "=now")
				$data[$FIELD_ID] = ConvertTimeStamp(time()+CTimeZone::GetOffset(), "FULL");
			elseif($arField["DEFAULT_VALUE"] === "=today")
				$data[$FIELD_ID] = ConvertTimeStamp(time()+CTimeZone::GetOffset(), "SHORT");
			else
				$data[$FIELD_ID] = "";
		}
		elseif($FIELD_ID == "PREVIEW_PICTURE" || $FIELD_ID == "DETAIL_PICTURE")
		{
			if($arResult["ELEMENT_ID"])
				$data[$FIELD_ID] = $arResult["ELEMENT_FIELDS"]["~".$FIELD_ID];
			else
				$data[$FIELD_ID] = "";
		}
		else
		{
			if($bVarsFromForm)
			{
				$data[$FIELD_ID] = $_POST[$FIELD_ID] ?? null;
			}
			elseif($arResult["ELEMENT_ID"] || $copy_id)
				$data[$FIELD_ID] = $arResult["ELEMENT_FIELDS"]["~".$FIELD_ID];
			else
				$data[$FIELD_ID] = $arField["DEFAULT_VALUE"];
		}
	}
	elseif(is_array($arField["PROPERTY_USER_TYPE"]) && array_key_exists("GetPublicEditHTML", $arField["PROPERTY_USER_TYPE"]))
	{
		if($bVarsFromForm)
		{
			$data[$FIELD_ID] = $_POST[$FIELD_ID] ?? null;
		}
		elseif($arResult["ELEMENT_ID"] || $copy_id)
		{
			if(isset($arResult["ELEMENT_PROPS"][$arField["ID"]]))
			{
				$data[$FIELD_ID] = $arResult["ELEMENT_PROPS"][$arField["ID"]]["FULL_VALUES"];
				if($arField["MULTIPLE"] == "Y")
					$data[$FIELD_ID]["n0"] = array("VALUE" => "", "DESCRIPTION" => "");
			}
			else
			{
				$data[$FIELD_ID]["n0"] = array("VALUE" => "", "DESCRIPTION" => "");
			}
		}
		else
		{
			$data[$FIELD_ID] = array(
				"n0" => array(
					"VALUE" => $arField["DEFAULT_VALUE"] ? $arField["DEFAULT_VALUE"] : "",
					"DESCRIPTION" => "",
				)
			);
		}
	}
	elseif($arField["PROPERTY_TYPE"] == "L")
	{
		if($bVarsFromForm)
		{
			$data[$FIELD_ID] = $_POST[$FIELD_ID];
		}
		elseif($arResult["ELEMENT_ID"] || $copy_id)
		{
			if(isset($arResult["ELEMENT_PROPS"][$arField["ID"]]))
				$data[$FIELD_ID] = $arResult["ELEMENT_PROPS"][$arField["ID"]]["VALUES_LIST"];
			else
				$data[$FIELD_ID] = array();
		}
		else
		{
			$data[$FIELD_ID] = array();
			$prop_enums = CIBlockProperty::GetPropertyEnum($arField["ID"]);
			while($ar_enum = $prop_enums->Fetch())
				if($ar_enum["DEF"] == "Y")
					$data[$FIELD_ID][] =$ar_enum["ID"];
		}
	}
	elseif($arField["PROPERTY_TYPE"] == "F")
	{
		if($arResult["ELEMENT_ID"])
		{
			if(isset($arResult["ELEMENT_PROPS"][$arField["ID"]]))
			{
				$data[$FIELD_ID] = $arResult["ELEMENT_PROPS"][$arField["ID"]]["FULL_VALUES"];
				if($arField["MULTIPLE"] == "Y")
					$data[$FIELD_ID]["n0"] = array("VALUE" => "", "DESCRIPTION" => "");
			}
			else
			{
				$data[$FIELD_ID]["n0"] = array("VALUE" => "", "DESCRIPTION" => "");
			}
		}
		else
		{
			$data[$FIELD_ID] = array(
				"n0" => array("VALUE" => "", "DESCRIPTION" => ""),
			);
		}
	}
	elseif($arField["PROPERTY_TYPE"] == "G" || $arField["PROPERTY_TYPE"] == "E")
	{
		if($bVarsFromForm)
		{
			$data[$FIELD_ID] = $_POST[$FIELD_ID];
		}
		elseif($arResult["ELEMENT_ID"] || $copy_id)
		{
			if(isset($arResult["ELEMENT_PROPS"][$arField["ID"]]))
				$data[$FIELD_ID] = $arResult["ELEMENT_PROPS"][$arField["ID"]]["VALUES_LIST"];
			else
				$data[$FIELD_ID] = array();
		}
		else
		{
			$data[$FIELD_ID] = array($arField["DEFAULT_VALUE"]);
		}
	}
	else//if($arField["PROPERTY_TYPE"] == "S" || $arField["PROPERTY_TYPE"] == "N")
	{
		if($bVarsFromForm)
		{
			$data[$FIELD_ID] = $_POST[$FIELD_ID];
		}
		elseif($arResult["ELEMENT_ID"] || $copy_id)
		{
			if(isset($arResult["ELEMENT_PROPS"][$arField["ID"]]))
			{
				$data[$FIELD_ID] = $arResult["ELEMENT_PROPS"][$arField["ID"]]["FULL_VALUES"];
				if($arField["MULTIPLE"] == "Y")
					$data[$FIELD_ID]["n0"] = array("VALUE" => "", "DESCRIPTION" => "");
			}
			else
			{
				$data[$FIELD_ID]["n0"] = array("VALUE" => "", "DESCRIPTION" => "");
			}
		}
		else
		{
			$data[$FIELD_ID] = array(
				"n0" => array("VALUE" => $arField["DEFAULT_VALUE"], "DESCRIPTION" => ""),
			);
			if($arField["MULTIPLE"] == "Y")
			{
				if(is_array($arField["DEFAULT_VALUE"]) || mb_strlen($arField["DEFAULT_VALUE"]))
					$data[$FIELD_ID]["n1"] = array("VALUE" => "", "DESCRIPTION" => "");
			}
		}
	}
}

$arResult["LIST_SECTIONS"] = array(
	"" => GetMessage("CC_BLEE_UPPER_LEVEL"),
);
$rsSections = CIBlockSection::GetTreeList(array("IBLOCK_ID"=>$arResult["IBLOCK_ID"], "CHECK_PERMISSIONS"=>"N"));
while($arSection = $rsSections->Fetch())
	$arResult["LIST_SECTIONS"][$arSection["ID"]] = str_repeat(" . ", $arSection["DEPTH_LEVEL"]).$arSection["NAME"];

if(
	$arResult["IBLOCK"]["RIGHTS_MODE"] == 'E'
	&& $arResult["CAN_EDIT_RIGHTS"]
)
{
	$arResult["RIGHTS"] = array();
	if($arResult["ELEMENT_ID"])
		$objectRights = new CIBlockElementRights($arResult["IBLOCK_ID"], $arResult["ELEMENT_ID"]);
	else
		$objectRights = new CIBlockSectionRights($arResult["IBLOCK_ID"], intval($data["IBLOCK_SECTION_ID"]));

	$arResult["RIGHTS"] = $objectRights->GetRights(array("parents" => array($data["IBLOCK_SECTION_ID"])));
	$arResult["TASKS"] = CIBlockRights::GetRightsList();
}

$arResult["VARS_FROM_FORM"] = $bVarsFromForm;
$arResult["FORM_DATA"] = array();
foreach($data as $key => $value)
{
	$arResult["FORM_DATA"]["~".$key] = $value;
	if(is_array($value))
	{
		foreach($value as $key1 => $value1)
		{
			if(is_array($value1))
			{
				foreach($value1 as $key2 => $value2)
					if(!is_array($value2))
						$value[$key1][$key2] = htmlspecialcharsbx($value2);
			}
			else
			{
				$value[$key1] = htmlspecialcharsbx($value1);
			}
		}
		$arResult["FORM_DATA"][$key] = $value;
	}
	else
	{
		$arResult["FORM_DATA"][$key] = htmlspecialcharsbx($value);
	}
}

$arResult['RAND_STRING'] = $this->randString();

$this->IncludeComponentTemplate();

if($arResult["ELEMENT_ID"] && !empty($arResult["ELEMENT_FIELDS"]["NAME"]))
{
	$APPLICATION->SetTitle($arResult["IBLOCK"]["ELEMENT_NAME"] . ": " . $arResult["ELEMENT_FIELDS"]["NAME"]);
}
else
	$APPLICATION->SetTitle($arResult["IBLOCK"]["ELEMENT_NAME"]);

$APPLICATION->AddChainItem($arResult["IBLOCK"]["NAME"], $arResult["~LIST_URL"]);
if($arResult["SECTION"])
{
	foreach($arResult["SECTION_PATH"] as $arPath)
	{
		$APPLICATION->AddChainItem($arPath["NAME"], $arPath["URL"]);
	}
}


?>

Anon7 - 2022
AnonSec Team