You are here

function _profile2_usermerge_merge_accounts_by_bundle in User Merge 7.2

Merge accounts by profile2 bundle name.

Parameters

string $bundle: Profile2 bundle name.

object $user_to_delete: User entity to delete.

object $user_to_keep: User entity to keep.

Return value

array The form array to render.

1 call to _profile2_usermerge_merge_accounts_by_bundle()
profile2_usermerge_merge_accounts in includes/profile2.usermerge.inc
Implements hook_usermerge_merge_accounts().

File

includes/profile2.usermerge.inc, line 216
Adds support for Profile 2. Supplemental include loaded via usermerge_load_includes().

Code

function _profile2_usermerge_merge_accounts_by_bundle($bundle, $user_to_delete, $user_to_keep, $review) {

  // Load the profile for the user to delete and keep.
  $profile_delete = profile2_load_by_user($user_to_delete, $bundle);
  $profile_keep = profile2_load_by_user($user_to_keep, $bundle);

  // Do nothing if both of the profiles do not exist; otherwise create any missing profiles.
  if (empty($profile_delete) && empty($profile_keep)) {
    return;
  }
  if (empty($profile_delete)) {
    $profile_delete = profile_create(array(
      'type' => $bundle,
      'uid' => $user_to_delete->uid,
    ));
  }
  if (empty($profile_keep)) {
    $profile_keep = profile_create(array(
      'type' => $bundle,
      'uid' => $user_to_keep->uid,
    ));
  }

  // ===============
  // Merge fields based on review.
  // ===============
  foreach ($review as $name => $options) {
    $option = $options['options'];

    // Switch on the name.
    switch ($option) {

      // Get value from merge (nust be an array).
      case 'merge':
        $value = array();
        $field_delete = isset($profile_delete->{$name}) ? $profile_delete->{$name} : array();
        $field_keep = isset($profile_keep->{$name}) ? $profile_keep->{$name} : array();

        // Retrieve the languages.
        $languages = array_unique(array_merge(array_keys($field_delete), array_keys($field_keep)));

        // Set language keys.
        foreach ($languages as $lang) {

          // Init to array.
          $value[$lang] = array();

          // Add user to keep items first.
          if (!empty($field_keep[$lang])) {
            $value[$lang] = $field_keep[$lang];
          }

          // Add user to delete items, remove duplicates.
          if (!empty($field_delete[$lang])) {
            $value[$lang] = array_merge($value[$lang], $field_delete[$lang]);

            // Remove duplicates.
            $serialized = array_map('serialize', $value[$lang]);
            $serialized = array_values(array_unique($serialized));
            $value[$lang] = array_map('unserialize', $serialized);
          }

          // Enforce maximum number of values.
          if ($options['cardinality'] > 1) {
            $value[$lang] = array_slice($value[$lang], 0, $options['cardinality']);
          }
        }
        break;

      // Get value from delete.
      case 'user_to_delete':
        $value = isset($profile_delete->{$name}) ? $profile_delete->{$name} : NULL;
        break;

      // User to keep is the default case.
      case 'user_to_keep':
      default:
        $value = isset($profile_keep->{$name}) ? $profile_keep->{$name} : NULL;
        break;
    }

    // Set the value.
    $profile_keep->{$name} = $value;
  }

  // Save the updated profile.
  profile2_save($profile_keep);

  // Delete the profile for the deleted user.
  profile2_delete($profile_delete);
}