You are here

webform_mailchimp.module in Webform Mailchimp 7.4

Webform Mailchimp integrates mailchimp into the webforms module.

File

webform_mailchimp.module
View source
<?php

/**
 * @file
 * Webform Mailchimp integrates mailchimp into the webforms module.
 */

/**
 * Implements hook_webform_component_info().
 */
function webform_mailchimp_webform_component_info() {
  $components = array();
  $components['mailchimp'] = array(
    'label' => t('Mailchimp'),
    'description' => t('Sign up to a newsletter.'),
    'features' => array(
      'csv' => TRUE,
      'email' => TRUE,
      'email_address' => FALSE,
      'email_name' => FALSE,
      'required' => TRUE,
      'conditional' => FALSE,
      'group' => FALSE,
      'attachment' => FALSE,
    ),
    'file' => 'webform_mailchimp.inc',
  );
  return $components;
}

/**
 * Implements hook_webform_submission_insert().
 */
function webform_mailchimp_webform_submission_insert($node, $submission) {
  global $user;
  $mailchimp_lists = array();
  $email_address = '';
  $double_opt_in = FALSE;
  if (!empty($node->webform['components'])) {
    foreach ($node->webform['components'] as $key => $field) {
      if ($field['type'] == 'mailchimp') {
        $mailchimp_lists[] = $field['extra']['mailchimp_list'];
        $double_opt_in = !empty($field['extra']['doublein']);

        // Need to know if we should look for our own email field or another.
        if ($field['extra']['use_existing_email_field'] != 'mailchimp_field') {
          if (!empty($submission->data[$key][0])) {

            // Loop through components again to find our email field.
            foreach ($node->webform['components'] as $key2 => $field2) {
              if ($field2['form_key'] == $field['extra']['use_existing_email_field']) {
                $email_address = $submission->data[$key2][0];
              }
            }
          }
          else {
            $email_address = '';
          }
        }
        else {
          $email_address = $submission->data[$key][0];
        }

        // Retrieve mergefields and create a merge array with key webform key
        // and value Mailchimp merge tag.
        if (!empty($field['extra']['mergefields'])) {
          $mergefields_key_array = array();
          $keyvaluepairs = explode("\n", $field['extra']['mergefields']);
          foreach ($keyvaluepairs as $keyvalue) {
            $keyvalue = trim($keyvalue);
            $keyvalue = explode('|', $keyvalue);
            if (is_array($keyvalue) && !empty($keyvalue[0]) && !empty($keyvalue[1])) {
              $mergefields_key_array[$keyvalue[1]] = $keyvalue[0];
            }
          }
        }

        // Retrieve interestfields and create a merge array with key webform key
        // and value Mailchimp group name.
        if (!empty($field['extra']['interestfields'])) {
          $groupfields_key_array = array();
          $keyvaluepairs = explode("\n", $field['extra']['interestfields']);
          foreach ($keyvaluepairs as $keyvalue) {
            $keyvalue = trim($keyvalue);
            $keyvalue = explode('|', $keyvalue);
            if (is_array($keyvalue) && !empty($keyvalue[0]) && !empty($keyvalue[1])) {
              $groupfields_key_array[$keyvalue[1]] = $keyvalue[0];
            }
          }
        }
      }
    }
    $mergefields_replacements = array();

    // Create the mergefield array.
    if (!empty($mergefields_key_array) && is_array($mergefields_key_array)) {
      foreach ($node->webform['components'] as $key => $field) {
        if (!empty($mergefields_key_array[$field['form_key']])) {

          // This is probably a bit to easy... The delta value is not taken
          // into account.
          $value = 0;
          if (isset($submission->data[$key][0])) {
            $value = $submission->data[$key][0];
          }
          $mergefields_replacements[$mergefields_key_array[$field['form_key']]] = $value;
        }
      }
    }
    $groupfields_replacements = array();

    // Create the mergefield array.
    if (!empty($groupfields_key_array) && is_array($groupfields_key_array)) {
      foreach ($node->webform['components'] as $key => $field) {
        if (!empty($groupfields_key_array[$field['form_key']])) {

          // We are dealing with checkboxes, dropdowns and have received the id
          // instead of the raw value. So we need to extract the value and send
          // that instead.
          $choices = explode("\n", $field['extra']['items']);
          $sorted_choices = array();
          foreach ($choices as $choice_key => $choice_val) {
            $id_name = explode('|', trim($choice_val));
            $sorted_choices[$id_name[0]] = $id_name[1];
          }
          foreach ($submission->data[$key] as $filled_out_value) {
            $groupfields_replacements[$groupfields_key_array[$field['form_key']]][] = str_replace(",", "\\,", $sorted_choices[$filled_out_value]);
          }
        }
      }
      foreach ($groupfields_replacements as $groupname => $values_array) {
        $mergefields_replacements['GROUPINGS'][] = array(
          'name' => $groupname,
          'groups' => implode(',', $values_array),
        );
      }
    }

    // If we have an email address and a list is set, try to subscribe the user.
    if ($email_address != '' && !empty($mailchimp_lists)) {
      $q = mailchimp_get_api_object();
      if (!$q) {
        watchdog('webform_mailchimp', 'Could not get the Mailchimp API object.', array(), WATCHDOG_ERROR);
        return;
      }
      foreach ($mailchimp_lists as $mailchimp_list) {
        $use_v2_api = method_exists($q, 'listSubscribe');
        if ($use_v2_api) {
          $success = $q
            ->listSubscribe($mailchimp_list, $email_address, $mergefields_replacements, 'html', $double_opt_in, TRUE);
          if ($success) {
            webform_mailchimp_log_subscription($email_address, $success);
          }
          else {
            webform_mailchimp_log_subscription($email_address, $success, $success->errorCode, $success->errorMessage);
          }
        }
        else {
          mailchimp_subscribe($mailchimp_list, $email_address, $mergefields_replacements, $groupfields_replacements, $double_opt_in);
          webform_mailchimp_log_subscription($email_address, TRUE);
        }
      }
    }
  }
}

/**
 * Log a subscription status to the watchdog table.
 *
 * @param string $email_address
 *   The email address.
 * @param bool $status
 *   If the subscription was successful.
 * @param string $error_code
 *   The error code if there was an error.
 * @param string $error_message
 *   The error message.
 */
function webform_mailchimp_log_subscription($email_address, $status, $error_code = '', $error_message = '') {
  if ($status) {
    watchdog('webform_mailchimp', 'E-mail subscribed: %email', array(
      '%email' => $email_address,
    ), WATCHDOG_INFO);
  }
  else {
    watchdog('webform_mailchimp', 'E-mail not subscribed: %email Error: %error_code <br> %error_message', array(
      '%email' => $email_address,
      '%error_message' => $error_message,
      '%error_code' => $error_code,
    ), WATCHDOG_ERROR);
  }
}