- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/lib/merger/entitymerger.php
- Класс: Bitrix\Crm\Merger\EntityMerger
- Вызов: EntityMerger::innerPrepareEntityFieldMergeData
protected function innerPrepareEntityFieldMergeData($fieldID, array $fieldParams, array $seeds, array $targ, array $options = null)
{
$type = isset($fieldParams['TYPE']) ? $fieldParams['TYPE'] : 'string';
$isMultiple = isset($fieldParams['IS_MULTIPLE']) && $fieldParams['IS_MULTIPLE'];
$result = array('FIELD_ID' => $fieldID, 'TYPE' => $type, 'IS_MERGED' => true, 'IS_MULTIPLE' => $isMultiple);
$fieldInfo = isset($fieldParams['FIELD_INFO']) && is_array($fieldParams['FIELD_INFO'])
? $fieldParams['FIELD_INFO'] : array();
if($options === null)
{
$options = array();
}
if(!$isMultiple)
{
$value = null;
$sourceEntityID = 0;
if(isset($targ[$fieldID]))
{
$value = $targ[$fieldID];
$sourceEntityID = (int)$targ['ID'];
}
foreach($seeds as $seed)
{
if(!(isset($seed[$fieldID]) && !$this->checkIfEmptyValue($type, $seed[$fieldID])))
{
continue;
}
if($result['IS_MERGED'])
{
if($this->checkIfEmptyValue($type, $value))
{
$value = $seed[$fieldID];
$sourceEntityID = (int)$seed['ID'];
}
elseif($value != $seed[$fieldID])
{
$result['IS_MERGED'] = false;
}
}
}
if($type === 'user_field')
{
if(!$this->checkIfEmptyValue($type, $value))
{
$result['VALUE'] = [
'VALUE' => $value,
'SIGNATURE' => Crm\UserField\UserFieldManager::prepareUserFieldSignature($fieldInfo, $value),
'IS_EMPTY' => false
];
}
else
{
$result['VALUE'] = [
'SIGNATURE' => Crm\UserField\UserFieldManager::prepareUserFieldSignature(
isset($fieldParams['FIELD_INFO']) && is_array($fieldParams['FIELD_INFO'])
? $fieldParams['FIELD_INFO'] : array()
),
'IS_EMPTY' => true
];
}
}
else
{
$result['VALUE'] = $value;
}
if($sourceEntityID > 0)
{
$result['SOURCE_ENTITY_IDS'] = array($sourceEntityID);
}
}
else
{
$enabledIdsMap = null;
if(isset($options['enabledIds']) && is_array($options['enabledIds']))
{
$enabledIdsMap = array_fill_keys($options['enabledIds'], true);
}
if($type === 'crm_multifield')
{
$sourceEntityIDs = array();
$multiFieldMap = array();
if((is_null($enabledIdsMap) || isset($enabledIdsMap[$targ['ID']])))
{
$targMultiFieldValues = isset($targ['FM']) && isset($targ['FM'][$fieldID]) ? $targ['FM'][$fieldID] : array();
$multiFieldMap = self::prepareMultiFieldMap($fieldID, $targMultiFieldValues);
if(!empty($multiFieldMap))
{
$sourceEntityIDs[] = (int)$targ['ID'];
}
}
foreach($seeds as $seed)
{
if(!(is_null($enabledIdsMap) || isset($enabledIdsMap[$seed['ID']])))
{
continue;
}
$seedMultiFieldValues = isset($seed['FM']) && isset($seed['FM'][$fieldID]) ? $seed['FM'][$fieldID] : array();
$seedMultiFieldMap = self::prepareMultiFieldMap($fieldID, $seedMultiFieldValues);
foreach($seedMultiFieldMap as $multiFieldKey => $multiFieldValue)
{
if(!isset($multiFieldMap[$multiFieldKey]))
{
$multiFieldMap[$multiFieldKey] = $multiFieldValue;
$sourceEntityIDs[] = (int)$seed['ID'];
}
}
}
$result['VALUE'] = array_values($multiFieldMap);
$result['SOURCE_ENTITY_IDS'] = array_values(array_unique($sourceEntityIDs, SORT_NUMERIC));
}
else
{
$ownershipMap = array();
if(isset($targ[$fieldID]) && is_array($targ[$fieldID]) && (is_null($enabledIdsMap) || isset($enabledIdsMap[$targ['ID']])))
{
foreach($targ[$fieldID] as $targValue)
{
$ownershipMap[$targValue] = (int)$targ['ID'];
}
}
foreach($seeds as $seed)
{
if(isset($seed[$fieldID]) && is_array($seed[$fieldID]) && (is_null($enabledIdsMap) || isset($enabledIdsMap[$seed['ID']])))
{
foreach($seed[$fieldID] as $seedValue)
{
$ownershipMap[$seedValue] = (int)$seed['ID'];
}
}
}
if(!empty($ownershipMap))
{
$sourceEntityIDs = array_values(array_unique(array_values($ownershipMap), SORT_NUMERIC));
$values = array_keys($ownershipMap);
sort($values);
if($type === 'user_field')
{
$result['VALUE'] = [
'VALUE' => $values,
'SIGNATURE' => Crm\UserField\UserFieldManager::prepareUserFieldSignature($fieldInfo, $values),
'IS_EMPTY' => false
];
}
else
{
$result['VALUE'] = $values;
}
$result['SOURCE_ENTITY_IDS'] = $sourceEntityIDs;
}
else if($type === 'user_field')
{
$result['VALUE'] = [
'SIGNATURE' => Crm\UserField\UserFieldManager::prepareUserFieldSignature(
isset($fieldParams['FIELD_INFO']) && is_array($fieldParams['FIELD_INFO'])
? $fieldParams['FIELD_INFO'] : array()
),
'IS_EMPTY' => true
];
}
}
}
return $result;
}