protected static function InternalizeEnumerationField($entityTypeID, array &$fields, $name) { if (!isset($fields[$name])) { return; } $entityResult = CUserTypeEntity::GetList(array(), array("ENTITY_ID" => $entityTypeID, "FIELD_NAME" => $name)); $entity = $entityResult->Fetch(); if (!is_array($entity)) { return; } $isMultiple = isset($entity['MULTIPLE']) && $entity['MULTIPLE'] === 'Y'; $enumXMap = array(); $enumVMap = array(); $enumResult = CUserTypeEnum::GetList($entity); while ($enum = $enumResult->GetNext()) { $enumXMap[$enum["XML_ID"]] = $enum["ID"]; $enumVMap[$enum["VALUE"]] = $enum["ID"]; } $results = array(); if (is_array($fields[$name])) { foreach ($fields[$name] as $value) { if (CBPHelper::IsAssociativeArray($value)) { //HACK: For IBlockDocument $value = array_keys($value); if (!$isMultiple) { $value = array_shift($value); } } if (is_array($value)) { foreach ($value as $v) { if (isset($enumXMap[$v])) { $results[] = $enumXMap[$v]; } elseif (isset($enumVMap[$v])) { $results[] = $enumVMap[$v]; } } } elseif (isset($enumXMap[$value])) { $results[] = $enumXMap[$value]; } elseif (isset($enumVMap[$value])) { $results[] = $enumVMap[$value]; } } } elseif (isset($enumXMap[$fields[$name]])) { $results[] = $enumXMap[$fields[$name]]; } elseif (isset($enumVMap[$fields[$name]])) { $results[] = $enumVMap[$fields[$name]]; } if (!empty($results)) { $fields[$name] = $isMultiple ? $results : $results[0]; } else { unset($fields[$name]); } }
public static function UpdateDocument($documentId, $arFields) { global $DB; $arDocumentID = self::GetDocumentInfo($documentId); if (empty($arDocumentID)) { throw new CBPArgumentNullException('documentId'); } $dbDocumentList = CCrmLead::GetList(array(), array('ID' => $arDocumentID['ID'], "CHECK_PERMISSIONS" => "N"), array('ID')); $arResult = $dbDocumentList->Fetch(); if (!$arResult) { 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, strtoupper($fieldType)); continue; } $arFields[$key] = is_array($arFields[$key]) && !CBPHelper::IsAssociativeArray($arFields[$key]) ? $arFields[$key] : array($arFields[$key]); if ($fieldType == "user") { $ar = array(); foreach ($arFields[$key] as $v1) { if (substr($v1, 0, strlen("user_")) == "user_") { $ar[] = substr($v1, strlen("user_")); } else { $a1 = self::GetUsersFromUserGroup($v1, $documentId); foreach ($a1 as $a11) { $ar[] = $a11; } } } $arFields[$key] = $ar; } elseif ($fieldType == "select" && substr($key, 0, 3) == "UF_") { $db = CUserTypeEntity::GetList(array(), array("ENTITY_ID" => "CRM_LEAD", "FIELD_NAME" => $key)); if ($ar = $db->Fetch()) { $arV = array(); $db = CUserTypeEnum::GetList($ar); while ($ar = $db->GetNext()) { $arV[$ar["XML_ID"]] = $ar["ID"]; } foreach ($arFields[$key] as &$value) { if (array_key_exists($value, $arV)) { $value = $arV[$value]; } } unset($value); } } elseif ($fieldType == "file") { $arFileOptions = array('ENABLE_ID' => true); foreach ($arFields[$key] as &$value) { //Issue #40380. Secure URLs and file IDs are allowed. $file = false; CCrmFileProxy::TryResolveFile($value, $file, $arFileOptions); $value = $file; } unset($value); } 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'] = preg_replace("/[\r\n]+/" . BX_UTF_PCRE_MODIFIER, "<br/>", $arFields['COMMENTS']); } $DB->StartTransaction(); $CCrmEntity = new CCrmLead(false); $res = $CCrmEntity->Update($arDocumentID['ID'], $arFields); if (!$res) { $DB->Rollback(); throw new Exception($CCrmEntity->LAST_ERROR); } if (COption::GetOptionString("crm", "start_bp_within_bp", "N") == "Y") { $CCrmBizProc = new CCrmBizProc('LEAD'); if (false === $CCrmBizProc->CheckFields($arDocumentID['ID'], true)) { throw new Exception($CCrmBizProc->LAST_ERROR); } if ($res && !$CCrmBizProc->StartWorkflow($arDocumentID['ID'])) { $DB->Rollback(); throw new Exception($CCrmBizProc->LAST_ERROR); } } if ($res) { $DB->Commit(); } }