You are here

function mailchimp_lists_add_to_segment_action in Mailchimp 7.4

Same name and namespace in other branches
  1. 7.5 modules/mailchimp_lists/mailchimp_lists.module \mailchimp_lists_add_to_segment_action()
  2. 7.3 modules/mailchimp_lists/mailchimp_lists.module \mailchimp_lists_add_to_segment_action()

Action function for the Add To Segment action.

Does the actual subscription work. Builds a queue of segment adds and then intermittently builds a batched API action from the queue and sends to Mailchimp.

File

modules/mailchimp_lists/mailchimp_lists.module, line 718

Code

function mailchimp_lists_add_to_segment_action($entity, $context = array()) {
  list($id, $vid, $bundle) = entity_extract_ids($context['entity_type'], $entity);
  $list_id = $context['mc_list_id'];
  $field_instance = field_info_instance($context['entity_type'], $context['mailchimp_field'], $bundle);
  $email = mailchimp_lists_load_email($field_instance, $entity);
  $queue_id = 'mailchimp_lists_action_' . $list_id . '_' . $context['segment_id'];
  if ($email) {
    mailchimp_segment_add_subscriber($list_id, $context['segment_id'], $email, TRUE, $queue_id);
  }

  // Send to Mailchimp in a batch when we are done, or when we reach 10000, as
  // 10000 records is the maximum batch size Mailchimp recommends.
  if ($context['progress']['current'] == $context['progress']['total'] || !($context['progress']['current'] % 10000)) {
    $batch_queue = DrupalQueue::get($queue_id);
    $batch_queue
      ->createQueue();
    $queue_count = $batch_queue
      ->numberOfItems();
    if ($queue_count > 0) {
      $count = 0;
      $batch = array();
      while ($count < $queue_count) {
        if ($item = $batch_queue
          ->claimItem()) {
          $batch[] = $item->data['item'];
          $batch_queue
            ->deleteItem($item);
        }
        $count++;
      }
      mailchimp_segment_batch_add_subscribers($list_id, $context['segment_id'], $batch);
    }
  }
}