function crm_core_contact_merge_contacts_action in CRM Core 7
Merge contacts.
File
- modules/
crm_core_contact/ crm_core_contact.module, line 1182 - Provides default CRM Core Contact entities and the ability to create more.
Code
function crm_core_contact_merge_contacts_action($selected_contacts, $context) {
$data = $context['data'];
$primary_contact = $selected_contacts[$data['contact_id']];
$pcid = $primary_contact->contact_id;
$pcw = entity_metadata_wrapper('crm_core_contact', $primary_contact);
unset($selected_contacts[$data['contact_id']]);
unset($data['contact_id']);
$wrappers = array();
foreach ($selected_contacts as $cid => $contact) {
$wrappers[$cid] = entity_metadata_wrapper('crm_core_contact', $contact);
}
// Updating primary contact fields from other selected contacts.
foreach ($data as $field_name => $contact_id) {
if ($pcid != $contact_id) {
$pcw->{$field_name}
->set($wrappers[$contact_id]->{$field_name}
->value());
}
}
$pcw
->save();
foreach (array_keys($selected_contacts) as $contact_id) {
// Creating path aliases for contacts that will be deleted.
$path = array(
'alias' => 'crm-core/contact/' . $contact_id,
'source' => 'crm-core/contact/' . $pcid,
);
path_save($path);
if (module_exists('crm_core_activity')) {
// Replacing participant in existing activities.
$query = new EntityFieldQuery();
$activities = $query
->entityCondition('entity_type', 'crm_core_activity')
->fieldCondition('field_activity_participants', 'target_id', $contact_id)
->execute();
if (is_array($activities) && isset($activities['crm_core_activity'])) {
foreach (array_keys($activities['crm_core_activity']) as $activity_id) {
$aw = entity_metadata_wrapper('crm_core_activity', $activity_id);
foreach ($aw->field_activity_participants
->getIterator() as $delta => $cw) {
if ($cw
->getIdentifier() == $contact_id) {
$aw->field_activity_participants[$delta]
->set($pcid);
}
}
$aw
->save();
}
}
}
if (module_exists('relation')) {
// Replacing existing relations for contacts been deleted with new ones.
$entity_type = 'crm_core_contact';
$relations = relation_query($entity_type, $contact_id)
->execute();
foreach ($relations as $relation_info) {
$rid = $relation_info->rid;
$relation_wrapper = entity_metadata_wrapper('relation', $rid);
$bundle = $relation_wrapper
->getBundle();
$column = 'endpoints_entity_id';
$field_info = field_info_field('endpoints');
$tables = array();
$tables[] = _field_sql_storage_tablename($field_info);
$tables[] = _field_sql_storage_revision_tablename($field_info);
foreach ($tables as $table) {
// Replacing contact ID with primary contact ID in endpoints field
// tables. Doing this with direct query because different relation
// types can have slightly different endpoints settings which is
// near to impossible to recreate.
db_update($table)
->fields(array(
$column => $pcid,
))
->condition('bundle', $bundle)
->condition('entity_id', $rid)
->condition('endpoints_entity_type', $entity_type)
->condition($column, $contact_id)
->execute();
}
cache_clear_all('field:relation:' . $rid, 'cache_field');
}
}
}
module_invoke_all('crm_core_contact_merge_contacts', $primary_contact, $selected_contacts);
crm_core_contact_delete_multiple(array_keys($selected_contacts));
$count = count($selected_contacts);
$singular = '%contacts contact merged to %dest.';
$plural = '%contacts contacts merged to %dest.';
$contacts_label = array();
foreach ($selected_contacts as $contact) {
$contacts_label[] = $contact
->label();
}
$message = format_plural($count, $singular, $plural, array(
'%contacts' => implode(', ', $contacts_label),
'%dest' => $primary_contact
->label(),
));
drupal_set_message($message);
}