• Модуль: 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;
}