• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblockdocument.php
  • Класс: CIBlockDocument
  • Вызов: CIBlockDocument::RecoverDocumentFromHistory
static function RecoverDocumentFromHistory($documentId, $arDocument)
{
	$documentId = intval($documentId);
	if ($documentId <= 0)
		throw new CBPArgumentNullException("documentId");

	$arFields = $arDocument["FIELDS"];
	if ($arFields["PREVIEW_PICTURE"] <> '')
		$arFields["PREVIEW_PICTURE"] = CFile::MakeFileArray($arFields["PREVIEW_PICTURE"]);
	if ($arFields["DETAIL_PICTURE"] <> '')
		$arFields["DETAIL_PICTURE"] = CFile::MakeFileArray($arFields["DETAIL_PICTURE"]);

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

	$dbProperties = CIBlockProperty::GetList(
		array("sort" => "asc", "name" => "asc"),
		array("IBLOCK_ID" => $arFields["IBLOCK_ID"])
	);
	while ($arProperty = $dbProperties->Fetch())
	{
		if (trim($arProperty["CODE"]) <> '')
			$key = $arProperty["CODE"];
		else
			$key = $arProperty["ID"];

		if (!array_key_exists($key, $arDocument["PROPERTIES"]))
			continue;

		$documentValue = $arDocument["PROPERTIES"][$key]["VALUE"];

		if($arProperty["USER_TYPE"] == '' && $arProperty["PROPERTY_TYPE"] == "F")
		{
			$arFields["PROPERTY_VALUES"][$key] = array();
			//Mark files to be deleted
			$rsFiles = CIBlockElement::GetProperty($arFields["IBLOCK_ID"], $documentId, array("ID"=>$arProperty["ID"], "EMPTY"=>"N"));
			while($arFile = $rsFiles->Fetch())
			{
				if($arFile["PROPERTY_VALUE_ID"] > 0)
					$arFields["PROPERTY_VALUES"][$key][$arFile["PROPERTY_VALUE_ID"]] = array(
						"VALUE" => array("del"=>"Y"),
						"DESCRIPTION" => "",
					);
			}
			//Restore from history
			$io = CBXVirtualIo::GetInstance();
			if(is_array($documentValue))
			{
				$n = 0;
				foreach ($documentValue as $i => $v)
					if($v <> '')
					{
						$arFields["PROPERTY_VALUES"][$key]["n".($n++)] = array(
							"VALUE" => CFile::MakeFileArray($io->GetPhysicalName($v)),
							"DESCRIPTION" => $arDocument["PROPERTIES"][$key]["DESCRIPTION"][$i]
						);
					}
			}
			else
			{
				if($documentValue <> '')
				{
					$arFields["PROPERTY_VALUES"][$key]["n0"] = array(
						"VALUE" => CFile::MakeFileArray($io->GetPhysicalName($documentValue)),
						"DESCRIPTION" => $arDocument["PROPERTIES"][$key]["DESCRIPTION"]
					);
				}
			}
		}
		else
		{
			if(is_array($documentValue))
			{
				$n = 0;
				foreach ($documentValue as $i => $v)
					if($v <> '')
						$arFields["PROPERTY_VALUES"][$key]["n".($n++)] = array(
							"VALUE" => $v,
							"DESCRIPTION" => $arDocument["PROPERTIES"][$key]["DESCRIPTION"][$i]
						);
			}
			else
			{
				if($documentValue <> '')
					$arFields["PROPERTY_VALUES"][$key]["n0"] = array(
						"VALUE" => $documentValue,
						"DESCRIPTION" => $arDocument["PROPERTIES"][$key]["DESCRIPTION"]
					);
			}
		}
	}

	$iblockElement = new CIBlockElement();
	$res = $iblockElement->Update($documentId, $arFields);
	if (intval($arFields["WF_STATUS_ID"]) > 1 && intval($arFields["WF_PARENT_ELEMENT_ID"]) <= 0)
		self::UnpublishDocument($documentId);
	if (!$res)
		throw new Exception($iblockElement->LAST_ERROR);

	return true;
}