- Модуль: iblock
- Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblockdocument.php
- Класс: CIBlockDocument
- Вызов: CIBlockDocument::CreateDocument
static function CreateDocument($parentDocumentId, $arFields)
{
if (!array_key_exists("IBLOCK_ID", $arFields) || intval($arFields["IBLOCK_ID"]) <= 0)
throw new Exception("IBlock ID is not found");
$arFieldsPropertyValues = array();
$complexDocumentId = ['iblock', get_called_class(), $parentDocumentId];
$arDocumentFields = static::GetDocumentFields("iblock_".$arFields["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" => $arFields["IBLOCK_ID"]));
while ($ar = $db->GetNext())
$arV[$ar["XML_ID"]] = $ar["ID"];
$listValue = array();
foreach ($arFields[$key] as &$value)
{
if(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)
{
$files[] = CFile::MakeFileArray($file);
}
}
else
$files[] = CFile::MakeFileArray($value);
}
$arFields[$key] = $files;
}
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"] == "N:Sequence")
{
$queryObject = CIBlockProperty::getByID($realKey, $arFields["IBLOCK_ID"]);
if ($property = $queryObject->fetch())
{
$propertyId = $property["ID"];
$sequence = new CIBlockSequence($arFields["IBLOCK_ID"], $propertyId);
foreach ($arFields[$key] as &$value)
{
$value = ["VALUE" => $value];
}
$value = ["VALUE" => $sequence->getNext()];
}
}
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]);
unset($arFields[$key]);
}
}
if (count($arFieldsPropertyValues) > 0)
$arFields["PROPERTY_VALUES"] = $arFieldsPropertyValues;
if (isset($arFields['SORT']))
{
$arFields['SORT'] = (int) $arFields['SORT'];
}
$iblockElement = new CIBlockElement();
$id = $iblockElement->Add($arFields, false, true, true);
if (!$id || $id <= 0)
throw new Exception($iblockElement->LAST_ERROR);
return $id;
}