$title = $userRecordUrl = '';
$config = CRM_Core_Config::singleton();
+ // @todo - this user url stuff is only needed for the form layer - move to CRM_Contact_Form_Merge
if ($config->userSystem->is_drupal) {
$userRecordUrl = CRM_Utils_System::url('user/%ufid');
$title = ts('%1 User: %2; user id: %3', [
*/
public static function skipMerge($mainId, $otherId, &$migrationInfo, $mode = 'safe', &$conflicts = []) {
- $conflicts = self::getConflicts($migrationInfo, $mainId, $otherId, $mode);
+ $conflicts = self::getConflicts($migrationInfo, $mainId, $otherId, $mode)['conflicts'];
// A hook could have set skip_merge in order to alter merge behaviour.
// This is a something we might ideally deprecate since they really 'should'
// mess with the conflicts array instead.
} // End loop through each location block entity
// add the related tables and unset the ones that don't sport any of the duplicate contact's info
- $config = CRM_Core_Config::singleton();
- $mainUfId = CRM_Core_BAO_UFMatch::getUFId($mainId);
- $mainUser = NULL;
- if ($mainUfId) {
- // d6 compatible
- if ($config->userSystem->is_drupal == '1' && function_exists($mainUser)) {
- $mainUser = user_load($mainUfId);
- }
- elseif ($config->userFramework == 'Joomla') {
- $mainUser = JFactory::getUser($mainUfId);
- }
- }
- $otherUfId = CRM_Core_BAO_UFMatch::getUFId($otherId);
- $otherUser = NULL;
- if ($otherUfId) {
- // d6 compatible
- if ($config->userSystem->is_drupal == '1' && function_exists($mainUser)) {
- $otherUser = user_load($otherUfId);
- }
- elseif ($config->userFramework == 'Joomla') {
- $otherUser = JFactory::getUser($otherUfId);
- }
- }
-
$mergeHandler = new CRM_Dedupe_MergeHandler((int) $mainId, (int) $otherId);
$relTables = $mergeHandler->getTablesRelatedToTheMergePair();
foreach ($relTables as $name => $null) {
$relTables[$name]['main_url'] = str_replace('$cid', $mainId, $relTables[$name]['url']);
$relTables[$name]['other_url'] = str_replace('$cid', $otherId, $relTables[$name]['url']);
- if ($name == 'rel_table_users') {
- $relTables[$name]['main_url'] = str_replace('%ufid', $mainUfId, $relTables[$name]['url']);
- $relTables[$name]['other_url'] = str_replace('%ufid', $otherUfId, $relTables[$name]['url']);
- $find = ['$ufid', '$ufname'];
- if ($mainUser) {
- $replace = [$mainUfId, $mainUser->name];
- $relTables[$name]['main_title'] = str_replace($find, $replace, $relTables[$name]['title']);
- }
- if ($otherUser) {
- $replace = [$otherUfId, $otherUser->name];
- $relTables[$name]['other_title'] = str_replace($find, $replace, $relTables[$name]['title']);
- }
+ if ($name === 'rel_table_users') {
+ // @todo - this user url stuff is only needed for the form layer - move to CRM_Contact_Form_Merge
+ $relTables[$name]['main_url'] = str_replace('%ufid', CRM_Core_BAO_UFMatch::getUFId($otherId), $relTables[$name]['url']);
+ $relTables[$name]['other_url'] = str_replace('%ufid', CRM_Core_BAO_UFMatch::getUFId($otherId), $relTables[$name]['url']);
}
if ($name == 'rel_table_memberships') {
//Enable 'add new' checkbox if main contact does not contain any membership similar to duplicate contact.
$rows["move_custom_$fid"]['title'] = $field['label'];
$elements[] = [
- 'advcheckbox',
- "move_custom_$fid",
- NULL,
- NULL,
- NULL,
- $value,
+ 0 => 'advcheckbox',
+ 1 => "move_custom_$fid",
+ 2 => NULL,
+ 3 => NULL,
+ 4 => NULL,
+ 5 => $value,
+ 'is_checked' => (!isset($rows["move_custom_$fid"]['main']) || $rows["move_custom_$fid"]['main'] === ''),
];
$migrationInfo["move_custom_$fid"] = $value;
}
// allow hook to override / manipulate migrationInfo as well
$migrationInfo = $migrationData['migration_info'];
foreach ($conflicts as $key => $val) {
- if ($val !== NULL || $mode !== 'safe') {
- // copy over the resolved values
- $migrationInfo[$key] = $val;
- unset($conflicts[$key]);
- }
+ // Copy over the resolved values. If we are in aggressive mode we update to null
+ // so as not to copy over. Why it's different to safe mode is a bit murky.
+ // Working theory is it doesn't matter what we do in safe mode here if $val is NULL.
+ // as the merge is not gonna happen if $val == NULL
+ $migrationInfo[$key] = $val ?? ($mode === 'safe' ? $migrationInfo[$key] : NULL);
}
- return self::formatConflictArray($conflicts, $migrationInfo['rows'], $migrationInfo['main_details']['location_blocks'], $migrationInfo['other_details']['location_blocks'], $mainId, $otherId);
+ return self::formatConflictArray($conflicts, $migrationInfo['rows'], $migrationInfo['main_details']['location_blocks'], $migrationInfo['other_details']['location_blocks'], $mainId, $otherId, $mode);
}
/**
* @param $toRemoveContactLocationBlocks
* @param $toKeepID
* @param $toRemoveID
+ * @param string $mode
*
* @return mixed
* @throws \CRM_Core_Exception
*/
- protected static function formatConflictArray($conflicts, $migrationInfo, $toKeepContactLocationBlocks, $toRemoveContactLocationBlocks, $toKeepID, $toRemoveID) {
+ protected static function formatConflictArray($conflicts, $migrationInfo, $toKeepContactLocationBlocks, $toRemoveContactLocationBlocks, $toKeepID, $toRemoveID, $mode) {
$return = [];
+ $resolved = [];
+ foreach ($conflicts as $key => $val) {
+ if ($val !== NULL) {
+ // copy over the resolved values
+ $resolved[$key] = $val;
+ unset($conflicts[$key]);
+ }
+ elseif ($mode === 'aggressive') {
+ unset($conflicts[$key]);
+ if (strpos($key, 'move_location_') !== 0) {
+ // @todo - just handling plain contact fields for now because I think I need a bigger refactor
+ // of the below to handle locations & will do as a follow up.
+ $resolved['contact'][substr($key, 5)] = $migrationInfo[$key]['main'];
+ }
+ }
+ }
foreach (array_keys($conflicts) as $index) {
if (substr($index, 0, 14) === 'move_location_') {
$parts = explode('_', $index);
throw new CRM_Core_Exception(ts('Unknown parameter') . $index);
}
}
- return $return;
+ return ['conflicts' => $return, 'resolved' => $resolved];
}
/**