You are here

function _mailchimp_lists_subscription_has_changed in Mailchimp 8

Same name and namespace in other branches
  1. 7.5 modules/mailchimp_lists/mailchimp_lists.module \_mailchimp_lists_subscription_has_changed()
  2. 7.3 modules/mailchimp_lists/mailchimp_lists.module \_mailchimp_lists_subscription_has_changed()
  3. 7.4 modules/mailchimp_lists/mailchimp_lists.module \_mailchimp_lists_subscription_has_changed()
  4. 2.x modules/mailchimp_lists/mailchimp_lists.module \_mailchimp_lists_subscription_has_changed()

Helper function to avoid sending superfluous updates to Mailchimp.

This is necessary due to the nature of the field implementation of subscriptions. If we don't do this, we send an update to mailchimp every time an entity is updated.

returns bool

1 call to _mailchimp_lists_subscription_has_changed()
mailchimp_lists_process_subscribe_form_choices in modules/mailchimp_lists/mailchimp_lists.module
Processor for various list form submissions.

File

modules/mailchimp_lists/mailchimp_lists.module, line 210
Mailchimp lists/audiences module.

Code

function _mailchimp_lists_subscription_has_changed(MailchimpListsSubscription $instance, EntityInterface $entity, $email, $choices) {
  $settings = $instance
    ->getFieldDefinition()
    ->getSettings();
  if (isset($entity->original)) {

    /* @var $original \Drupal\Core\Entity\EntityInterface */
    $original = $entity->original;

    // First compare Interest Group settings.
    if ($settings['show_interest_groups']) {
      $field_name = $instance
        ->getFieldDefinition()
        ->getName();

      /* @var $old_field_settings \Drupal\mailchimp_lists\Plugin\Field\FieldType\MailchimpListsSubscription */
      $old_field_settings = $original->{$field_name}
        ->get(0);

      /* @var $new_field_settings \Drupal\mailchimp_lists\Plugin\Field\FieldType\MailchimpListsSubscription */
      $new_field_settings = $entity->{$field_name}
        ->get(0);
      $old_interest_groups = is_null($old_field_settings) ? [] : $old_field_settings
        ->getInterestGroups();
      $new_interest_groups = $new_field_settings
        ->getInterestGroups();
      foreach ($new_interest_groups as $id => $new_interests) {

        // Check for change in entire interest group.
        if (!isset($old_interest_groups[$id])) {
          return TRUE;
        }
        $old_interests = $old_interest_groups[$id];

        // Check for changes in individual interests.
        foreach ($new_interests as $interest_id => $interest_status) {
          if (!isset($old_interests[$interest_id]) || $old_interests[$interest_id] !== $interest_status) {
            return TRUE;
          }
        }
      }
    }

    // Compare merge field settings.
    $mergevars = _mailchimp_lists_mergevars_populate($settings['merge_fields'], $entity);
    $original_mergevars = _mailchimp_lists_mergevars_populate($settings['merge_fields'], $original);
    return $mergevars != $original_mergevars;
  }
  else {
    $member_info = mailchimp_get_memberinfo($settings['mc_list_id'], $email);
    if (isset($member_info->merge_fields->GROUPINGS)) {
      foreach ($member_info->merge_fields->GROUPINGS as $grouping) {
        if (!isset($choices['interest_groups'][$grouping['id']])) {
          return TRUE;
        }
        else {
          if (!is_array($choices['interest_groups'][$grouping['id']])) {

            // Standardize formatting of choices:
            $choices['interest_groups'][$grouping['id']] = [
              $choices['interest_groups'][$grouping['id']] => $choices['interest_groups'][$grouping['id']],
            ];
          }
          foreach ($grouping['groups'] as $group) {
            $selected = isset($choices['interest_groups'][$grouping['id']][$group['name']]) && $choices['interest_groups'][$grouping['id']][$group['name']];
            if ($group['interested'] && !$selected || !$group['interested'] && $selected) {
              return TRUE;
            }
          }
        }
      }
    }
  }

  // No changes detected.
  return FALSE;
}