You are here

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);
}