• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblockdocument.php
  • Класс: CIBlockDocument
  • Вызов: CIBlockDocument::CloneElement
static function CloneElement($ID, $arFields = array())
{
	global $DB;
	$ID = intval($ID);

	$db_element = CIBlockElement::GetList(array(), array("ID"=>$ID, "SHOW_HISTORY"=>"Y"), false, false,
		array(
			"ID",
			"MODIFIED_BY",
			"DATE_CREATE",
			"CREATED_BY",
			"IBLOCK_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_COMMENTS",
			"IN_SECTIONS",
			"CODE",
			"TAGS",
			"XML_ID",
			"TMP_ID",
		)
	);
	if($ar_element = $db_element->Fetch())
	{
		$IBLOCK_ID = $ar_element["IBLOCK_ID"];
		if($ar_element["WF_PARENT_ELEMENT_ID"] > 0)
		{
			throw new Exception(GetMessage("IBD_ELEMENT_NOT_FOUND"));
		}
		else
		{
			if($ar_element["PREVIEW_PICTURE"])
				$ar_element["PREVIEW_PICTURE"] = CFile::MakeFileArray($ar_element["PREVIEW_PICTURE"]);

			if($ar_element["DETAIL_PICTURE"])
				$ar_element["DETAIL_PICTURE"] = CFile::MakeFileArray($ar_element["DETAIL_PICTURE"]);

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

			$ar_element["PROPERTY_VALUES"] = array();

			foreach($arFields as $field_id => $value)
				if(array_key_exists($field_id, $ar_element))
					$ar_element[$field_id] = $value;

			$ar_element["WF_PARENT_ELEMENT_ID"] = $ID;
			$ar_element["IBLOCK_ID"] = $IBLOCK_ID;

			$arProps = &$ar_element["PROPERTY_VALUES"];

			//Add new proiperty values
			$rsProps = CIBlockElement::GetProperty($ar_element["IBLOCK_ID"], $ar_element["ID"], array("value_id" => "asc"));
			$i = 0;
			while($arProp = $rsProps->Fetch())
			{
				if(array_key_exists($arProp["CODE"], $ar_element["PROPERTY_VALUES"]))
					continue;

				$i++;
				if(!array_key_exists($arProp["ID"], $arProps))
					$arProps[$arProp["ID"]] = array();

				if($arProp["PROPERTY_VALUE_ID"])
				{
					if($arProp["PROPERTY_TYPE"] == "F")
						$arProps[$arProp["ID"]]["n".$i] = array(
							"VALUE" => CFile::MakeFileArray($arProp["VALUE"]),
							"DESCRIPTION" => $arProp["DESCRIPTION"],
						);
					else
						$arProps[$arProp["ID"]]["n".$i] = array(
							"VALUE" => $arProp["VALUE"],
							"DESCRIPTION" => $arProp["DESCRIPTION"],
						);
				}
			}

			if (CIBlock::GetArrayByID($IBLOCK_ID, "RIGHTS_MODE") === "E")
			{
				$ibRights = new CIBlockElementRights(intval($IBLOCK_ID), $ID);
				$arRights = $ibRights->GetRights();
				$arNewRights = array();
				$rightIndex = 0;
				foreach($arRights as $rightID=>$right)
				{
					if ($right['IS_INHERITED'] !== 'Y')
						$arNewRights['n'.$rightIndex++] = $right;
				}
				$ar_element['RIGHTS'] = $arNewRights;
			}

			$obElement = new CIBlockElement;
			$NEW_ID = $obElement->Add($ar_element);
			if(!$NEW_ID)
				throw new Exception($obElement->LAST_ERROR);
			else
				return $NEW_ID;
		}
	}
	else
	{
		throw new Exception(GetMessage("IBD_ELEMENT_NOT_FOUND"));
	}
}