- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/classes/general/crm_document_contact.php
- Класс: \CCrmDocumentContact
- Вызов: CCrmDocumentContact::UpdateDocument
static function UpdateDocument($documentId, $arFields, $modifiedById = null)
{
global $DB;
if(empty($arFields))
{
return;
}
$arDocumentID = self::GetDocumentInfo($documentId);
if (empty($arDocumentID))
throw new CBPArgumentNullException('documentId');
$complexDocumentId = [$arDocumentID['DOCUMENT_TYPE'][0], $arDocumentID['DOCUMENT_TYPE'][1], $documentId];
if(!CCrmContact::Exists($arDocumentID['ID']))
{
throw new Exception(GetMessage('CRM_DOCUMENT_ELEMENT_IS_NOT_FOUND'));
}
$arDocumentFields = self::GetDocumentFields($arDocumentID['TYPE']);
$arKeys = array_keys($arFields);
foreach ($arKeys as $key)
{
if (!array_key_exists($key, $arDocumentFields))
{
//Fix for issue #40374
unset($arFields[$key]);
continue;
}
$fieldType = $arDocumentFields[$key]["Type"];
if (in_array($fieldType, array("phone", "email", "im", "web"), true))
{
CCrmDocument::PrepareEntityMultiFields($arFields, mb_strtoupper($fieldType));
continue;
}
$arFields[$key] = (is_array($arFields[$key]) && !CBPHelper::IsAssociativeArray($arFields[$key])) ? $arFields[$key] : array($arFields[$key]);
if ($fieldType == "user")
{
$arFields[$key] = \CBPHelper::extractUsers($arFields[$key], $complexDocumentId);
}
elseif ($fieldType == "select" && mb_substr($key, 0, 3) == "UF_")
{
self::InternalizeEnumerationField('CRM_CONTACT', $arFields, $key);
}
elseif ($fieldType == "file")
{
$arFileOptions = array('ENABLE_ID' => true);
foreach ($arFields[$key] as &$value)
{
//Issue #40380. Secure URLs and file IDs are allowed.
$file = false;
if (\CCrmFileProxy::TryResolveFile($value, $file, $arFileOptions))
{
global $USER_FIELD_MANAGER;
if ($USER_FIELD_MANAGER instanceof \CUserTypeManager)
{
$prevValue = $USER_FIELD_MANAGER->GetUserFieldValue(
\CCrmOwnerType::ResolveUserFieldEntityID(\CCrmOwnerType::Contact),
$key,
$arDocumentID['ID']
);
if ($prevValue)
{
$file['old_id'] = $prevValue;
}
}
}
$value = $file;
}
unset($value, $prevValue);
}
elseif ($fieldType == "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(isset($arFields['COMMENTS']) && $arFields['COMMENTS'] !== '')
{
$arFields['COMMENTS'] = static::sanitizeCommentsValue($arFields['COMMENTS']);
}
$useTransaction = static::shouldUseTransaction();
if ($useTransaction)
{
$DB->StartTransaction();
}
if ($modifiedById > 0)
{
$arFields['MODIFY_BY_ID'] = $modifiedById;
}
$CCrmEntity = new CCrmContact(false);
$res = $CCrmEntity->Update(
$arDocumentID['ID'],
$arFields,
true,
true,
[
'DISABLE_USER_FIELD_CHECK' => true,
'REGISTER_SONET_EVENT' => true,
'CURRENT_USER' => $modifiedById ?? static::getSystemUserId()
]
);
if (!$res)
{
if ($useTransaction)
{
$DB->Rollback();
}
throw new Exception($CCrmEntity->LAST_ERROR);
}
if (COption::GetOptionString("crm", "start_bp_within_bp", "N") == "Y")
{
$CCrmBizProc = new CCrmBizProc('CONTACT');
if (false === $CCrmBizProc->CheckFields($arDocumentID['ID'], true))
throw new Exception($CCrmBizProc->LAST_ERROR);
if ($res && !$CCrmBizProc->StartWorkflow($arDocumentID['ID']))
{
if ($useTransaction)
{
$DB->Rollback();
}
throw new Exception($CCrmBizProc->LAST_ERROR);
}
}
if (isset($arFields['TRACKING_SOURCE_ID']))
{
Crm\Tracking\UI\Details::saveEntityData(
\CCrmOwnerType::Contact,
$arDocumentID['ID'],
$arFields
);
}
if ($res && $useTransaction)
{
$DB->Commit();
}
}