CBPVirtualDocument::updateDocument

  1. Bitrix24 API (v. 23.675.0)
  2. bizproc
  3. CBPVirtualDocument
  4. updateDocument
  • Модуль: bizproc
  • Путь к файлу: ~/bitrix/modules/bizproc/classes/general/virtualdocument.php
  • Класс: CBPVirtualDocument
  • Вызов: CBPVirtualDocument::updateDocument
static function updateDocument($documentId, $arFields)
{
	$documentId = intval($documentId);
	if ($documentId <= 0)
		throw new CBPArgumentNullException("documentId");

	CIBlockElement::WF_CleanUpHistoryCopies($documentId, 0);

	$arFieldsPropertyValues = array();

	$dbResult = CIBlockElement::GetList(array(), array("ID" => $documentId, "SHOW_NEW" => "Y"), false, false, array("ID", "IBLOCK_ID"));
	$arResult = $dbResult->Fetch();
	if (!$arResult)
		throw new Exception("Element is not found");

	$arDocumentFields = self::GetDocumentFields("type_".$arResult["IBLOCK_ID"]);

	$arKeys = array_keys($arFields);
	foreach ($arKeys as $key)
	{
		if (!array_key_exists($key, $arDocumentFields))
			continue;

		if ($arDocumentFields[$key]["Multiple"] && is_string($arFields[$key]))
		{
			$arFieldsTmp = explode(",", $arFields[$key]);
			$arFields[$key] = array();
			foreach ($arFieldsTmp as $value)
				$arFields[$key][] = trim($value);
		}

		$arFields[$key] = (is_array($arFields[$key]) && !CBPHelper::IsAssociativeArray($arFields[$key])) ? $arFields[$key] : array($arFields[$key]);

		if ($arDocumentFields[$key]["Type"] == "S:UserID")
		{
			$ar = array();
			foreach ($arFields[$key] as $v1)
			{
				if (mb_substr($v1, 0, mb_strlen("user_")) == "user_")
				{
					$ar[] = mb_substr($v1, mb_strlen("user_"));
				}
				else
				{
					$a1 = self::GetUsersFromUserGroup($v1, $documentId);
					foreach ($a1 as $a11)
						$ar[] = $a11;
				}
			}

			$arFields[$key] = $ar;
		}
		elseif ($arDocumentFields[$key]['Type'] == 'S:employee')
		{
			$arFields[$key] = CBPHelper::StripUserPrefix($arFields[$key]);
		}
		elseif ($arDocumentFields[$key]["Type"] == "L")
		{
			$realKey = ((mb_substr($key, 0, mb_strlen("PROPERTY_")) == "PROPERTY_")? mb_substr($key, mb_strlen("PROPERTY_")) : $key);

			$arV = array();
			$db = CIBlockProperty::GetPropertyEnum($realKey, false, array("IBLOCK_ID" => $arResult["IBLOCK_ID"]));
			while ($ar = $db->GetNext())
				$arV[$ar["XML_ID"]] = $ar["ID"];

			foreach ($arFields[$key] as &$value)
			{
				if (array_key_exists($value, $arV))
					$value = $arV[$value];
			}
		}
		elseif ($arDocumentFields[$key]["Type"] == "F")
		{
			foreach ($arFields[$key] as &$value)
				$value = CFile::MakeFileArray($value);
		}
		elseif ($arDocumentFields[$key]["Type"] == "S:HTML")
		{
			foreach ($arFields[$key] as &$value)
				$value = array("VALUE" => $value);
		}

		if (!$arDocumentFields[$key]["Multiple"] && is_array($arFields[$key]))
		{
			if (count($arFields[$key]) > 0)
			{
				$a = array_values($arFields[$key]);
				$arFields[$key] = $a[0];
			}
			else
			{
				$arFields[$key] = null;
			}
		}

		if (mb_substr($key, 0, mb_strlen("PROPERTY_")) == "PROPERTY_")
		{
			$realKey = mb_substr($key, mb_strlen("PROPERTY_"));
			$arFieldsPropertyValues[$realKey] = (is_array($arFields[$key]) && !CBPHelper::IsAssociativeArray($arFields[$key])) ? $arFields[$key] : array($arFields[$key]);
			unset($arFields[$key]);
		}
	}

	$iblockElement = new CIBlockElement();

	if (count($arFieldsPropertyValues) > 0)
		$iblockElement->SetPropertyValuesEx($documentId, $arResult["IBLOCK_ID"], $arFieldsPropertyValues);

	if (count($arFields) > 0)
	{
		$res = $iblockElement->Update($documentId, $arFields, false, true, true);
		if (!$res)
			throw new Exception($iblockElement->LAST_ERROR);
	}
}

Добавить комментарий