- Модуль: iblock
- Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblockdocument.php
- Класс: CIBlockDocument
- Вызов: CIBlockDocument::UpdateDocument
static function UpdateDocument($documentId, $arFields)
{
$documentId = intval($documentId);
if ($documentId <= 0)
throw new CBPArgumentNullException("documentId");
CIBlockElement::WF_CleanUpHistoryCopies($documentId, 0);
$arFieldsPropertyValues = array();
$complexDocumentId = ['iblock', get_called_class(), $documentId];
$dbResult = CIBlockElement::GetList(
array(),
array("ID" => $documentId, "SHOW_NEW" => "Y", "SHOW_HISTORY" => "Y"),
false, false,
array("ID", "IBLOCK_ID")
);
$arResult = $dbResult->Fetch();
if (!$arResult)
throw new Exception("Element is not found");
$arDocumentFields = self::GetDocumentFields("iblock_".$arResult["IBLOCK_ID"]);
$arKeys = array_keys($arFields);
foreach ($arKeys as $key)
{
if (!array_key_exists($key, $arDocumentFields))
continue;
$arFields[$key] = (is_array($arFields[$key]) && !CBPHelper::IsAssociativeArray($arFields[$key])) ?
$arFields[$key] : array($arFields[$key]);
$realKey = ((mb_substr($key, 0, mb_strlen("PROPERTY_")) == "PROPERTY_")?
mb_substr($key, mb_strlen("PROPERTY_")) : $key);
if ($arDocumentFields[$key]["Type"] == "user")
{
$arFields[$key] = CBPHelper::extractUsers($arFields[$key], $complexDocumentId);
}
elseif ($arDocumentFields[$key]["Type"] == "select")
{
$arV = array();
$db = CIBlockProperty::GetPropertyEnum(
$realKey,
false,
array("IBLOCK_ID" => $arResult["IBLOCK_ID"])
);
while ($ar = $db->GetNext())
$arV[$ar["XML_ID"]] = $ar["ID"];
$listValue = array();
foreach ($arFields[$key] as &$value)
{
if(is_array($value) && CBPHelper::isAssociativeArray($value))
{
$listXmlId = array_keys($value);
foreach($listXmlId as $xmlId)
{
$listValue[] = $arV[$xmlId];
}
}
else
{
if (array_key_exists($value, $arV))
$value = $arV[$value];
}
}
if(!empty($listValue))
{
$arFields[$key] = $listValue;
}
}
elseif ($arDocumentFields[$key]["Type"] == "file")
{
$files = array();
foreach ($arFields[$key] as $value)
{
if (is_array($value))
{
foreach($value as $file)
{
$makeFileArray = CFile::MakeFileArray($file);
if($makeFileArray)
$files[] = $makeFileArray;
}
}
else
{
$makeFileArray = CFile::MakeFileArray($value);
if($makeFileArray)
$files[] = $makeFileArray;
}
}
if($files)
$arFields[$key] = $files;
else
$arFields[$key] = array(array('del' => 'Y'));
}
elseif($arDocumentFields[$key]["Type"] == "S:DiskFile")
{
foreach ($arFields[$key] as &$value)
{
if(!empty($value))
{
$value = "n".$value;
}
}
$arFields[$key] = array("VALUE" => $arFields[$key], "DESCRIPTION" => "workflow");
}
elseif ($arDocumentFields[$key]["Type"] == "S:HTML")
{
foreach ($arFields[$key] as &$value)
$value = array("VALUE" => $value);
}
unset($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]);
if(empty($arFieldsPropertyValues[$realKey]))
$arFieldsPropertyValues[$realKey] = array(null);
unset($arFields[$key]);
}
}
$iblockElement = new CIBlockElement();
if (!empty($arFieldsPropertyValues))
{
$iblockElement->SetPropertyValuesEx($documentId, $arResult["IBLOCK_ID"], $arFieldsPropertyValues);
}
$res = $iblockElement->Update($documentId, $arFields, false, true, true);
if (!$res)
throw new Exception($iblockElement->LAST_ERROR);
}