You are here

webform_campaignmonitor.module in Webform Campaign Monitor 7.3

Same filename and directory in other branches
  1. 6 webform_campaignmonitor.module
  2. 7.2 webform_campaignmonitor.module

Code for the Webform Campaign Monitor module.

File

webform_campaignmonitor.module
View source
<?php

/**
 * @file
 * Code for the Webform Campaign Monitor module.
 */

/**
 * Implements hook_webform_component_info().
 */
function webform_campaignmonitor_webform_component_info() {
  $components = array();
  $components['campaignmonitor'] = array(
    'label' => t('Campaign Monitor'),
    'description' => t('Allows users subscribe to enewsletters.'),
    'features' => array(
      'title_display' => FALSE,
    ),
    'file' => 'components/campaignmonitor.inc',
  );
  return $components;
}

/**
 * Implements hook_webform_submission_insert().
 */
function webform_campaignmonitor_webform_submission_insert($node, $submission) {
  $results = array();

  // Loop through Campaign Monitor components.
  $components = _webform_campaignmonitor_list_components_in_form($node->webform['components'], 'campaignmonitor');
  foreach ($components as $component) {
    $subscribe = reset($submission->data[$component['cid']]);
    if (!$subscribe) {
      continue;
    }

    // Get Campaign Monitor lists that we need to subscribe the user to.
    $lists = array_filter(array_values($component['extra']['lists']));
    foreach ($lists as $list) {
      $fields_mappings = $component['extra']['fields_mappings'][$list];

      // Values passed through to Campaign Monitor.
      $name = _webform_campaignmonitor_subscription_name_field($submission, $fields_mappings);
      $email = _webform_campaignmonitor_subscription_email_field($submission, $fields_mappings);
      $custom_fields = _webform_campaignmonitor_subscription_custom_fields($submission, $fields_mappings);

      // Attempt to subscribe the user.
      $results = $results + _webform_campaignmonitor_subscribe(array(
        $list,
      ), $email, $name, $custom_fields);
    }
  }

  // Give the user some feedback.
  foreach ($results as $result) {
    drupal_set_message($result['message'], $result['succeed'] ? 'status' : 'error');
  }
}

/**
 * Implements hook_form_alter().
 *
 * @see _webform_campaignmonitor_after_build()
 */
function webform_campaignmonitor_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'webform_component_edit_form' && $form['type']['#value'] == 'campaignmonitor') {
    $form['#after_build'][] = '_webform_campaignmonitor_after_build';
  }
}

/**
 * Webforms after build handler.
 *
 * @param array $form
 *   The actual form.
 * @param array $form_state
 *   The form state array.
 *
 * @return array
 *   An array containing the Forms API structure of the given form.
 */
function _webform_campaignmonitor_after_build($form, $form_state) {

  // Remove field mappings of lists that haven't been selected.
  $lists = $form['extra']['lists']['#options'];
  foreach ($lists as $key => $value) {
    if (!isset($form_state['values']['extra']['lists'][$key]) || !$form_state['values']['extra']['lists'][$key]) {
      unset($form['extra']['fields_mappings'][$key]);
    }
  }
  return $form;
}

/**
 * Finds and returns the value of the "Name" field on a given submission.
 *
 * @param object $submission
 *   The Webform submission object.
 * @param array $fields_mappings
 *   The field mappings of a campaign monitor component.
 *
 * @return string
 *   The value of the "Name" field.
 */
function _webform_campaignmonitor_subscription_name_field($submission, $fields_mappings) {
  return isset($submission->data[$fields_mappings['Name']]) ? reset($submission->data[$fields_mappings['Name']]) : '';
}

/**
 * Finds and returns the value of the "Email" field on a given submission.
 *
 * @param object $submission
 *   The Webform submission object.
 * @param array $fields_mappings
 *   The field mappings of a campaign monitor component.
 *
 * @return string
 *   The value of the "Email" field.
 */
function _webform_campaignmonitor_subscription_email_field($submission, $fields_mappings) {
  return isset($submission->data[$fields_mappings['Email']]) ? reset($submission->data[$fields_mappings['Email']]) : '';
}

/**
 * Finds and returns the values of "Custom" fields on a given submission.
 *
 * @param object $submission
 *   The Webform submission object.
 * @param array $fields_mappings
 *   The field mappings of a campaign monitor component.
 *
 * @return array
 *   The value of the "Custom" fields.
 */
function _webform_campaignmonitor_subscription_custom_fields($submission, $fields_mappings) {
  $custom_fields = array();

  // We don't want the "Name" and "Email" mixed with the custom fields.
  unset($fields_mappings['Name']);
  unset($fields_mappings['Email']);
  foreach ($fields_mappings as $cm_key => $webform_cid) {
    $value = isset($submission->data[$webform_cid]) ? $submission->data[$webform_cid] : '';
    if (is_array($value)) {
      foreach ($value as $value_item) {
        $custom_fields[] = array(
          'Key' => $cm_key,
          'Value' => $value_item,
        );
      }
    }
    else {
      $custom_fields[] = array(
        'Key' => $cm_key,
        'Value' => $value,
      );
    }
  }
  return $custom_fields;
}

/**
 * Subscribes an email address to one or more mailing lists.
 *
 * @param array $lists
 *   The array of mailing lists.
 * @param string $email
 *   The user's email address.
 * @param string $name
 *   The user's name (optional).
 * @param array $custom_fields
 *   The user's custom fields (optional).
 *
 * @return array
 *   An array of messages containing the results.
 */
function _webform_campaignmonitor_subscribe($lists, $email, $name = '', $custom_fields = array()) {
  $results = array();

  // Connect to the Campaign Monitor API and pull lists info.
  $cm = CampaignMonitor::getConnector();
  $lists_info = $cm
    ->getLists();
  foreach ($lists as $list_id) {
    if (campaignmonitor_is_list_enabled($list_id)) {
      if ($cm
        ->subscribe($list_id, $email, $name, $custom_fields)) {
        $results[$list_id]['message'] = t('You are now subscribed to the "@list" list.', array(
          '@list' => $lists_info[$list_id]['name'],
        ));
        $results[$list_id]['succeed'] = TRUE;
      }
      else {
        $results[$list_id]['message'] = t('You were not subscribed to the "@list" list, please try again.', array(
          '@list' => $lists_info[$list_id]['name'],
        ));
        $results[$list_id]['succeed'] = FALSE;
      }
    }
  }
  return $results;
}

/**
 * Lists all components of a given type that belong to a given node nid.
 *
 * @param int $nid
 *   The node id.
 * @param string $type
 *   The component type you would like to list (optional).
 *
 * @return array
 *   Array of components.
 */
function _webform_campaignmonitor_list_components($nid, $type = '') {
  $query = db_select('webform_component', 'w')
    ->fields('w', array(
    'cid',
    'pid',
    'name',
  ))
    ->condition('nid', $nid);
  if ($type != '') {
    $query
      ->condition('type', $type);
  }
  else {
    $query
      ->condition('type', 'campaignmonitor', '<>');
  }
  $query
    ->orderBy('weight', 'ASC');
  $result = $query
    ->execute();
  return $result
    ->fetchAll();
}

/**
 * Lists all components that belong to a given node nid (Forms API format).
 *
 * @param int $nid
 *   The node id.
 * @param string $type
 *   The component type you would like to list (optional).
 *
 * @return array
 *   An array of components where the keys are cids and values are names.
 */
function _webform_campaignmonitor_list_components_options($nid, $type = '') {
  $list =& drupal_static(__FUNCTION__);
  if (!isset($list[$nid])) {
    $list[$nid] = array(
      '' => '- None -',
    );
    $components = _webform_campaignmonitor_list_components($nid, $type);
    foreach ($components as $component) {
      $list[$nid][$component->cid] = $component->name;
    }
  }
  return $list[$nid];
}

/**
 * Lists all components of a given type.
 *
 * @param array $elements
 *   The form elements.
 * @param string $type
 *   The component type you would like to list.
 *
 * @return array
 *   Array of components.
 */
function _webform_campaignmonitor_list_components_in_form($elements, $type) {
  $components = array();
  foreach ($elements as $element) {
    if ($element['type'] == $type) {
      $components[$element['cid']] = $element;
    }
    if (isset($element['children'])) {
      $children_components = _webform_campaignmonitor_list_components_in_form($element['children'], $type);
      if ($children_components) {
        $components = $components + $children_components;
      }
    }
  }
  return $components;
}

/**
 * List fields of a given Campaign Monitor list.
 *
 * @param string $key
 *   The Campaign Monitor list key.
 *
 * @return array
 *   An array of Campaign Monitor fields.
 */
function _webform_campaignmonitor_list_fields($key) {
  $basic_fields = array(
    '[Name]' => array(
      'Key' => '[Name]',
      'FieldName' => t('Name'),
    ),
    '[Email]' => array(
      'Key' => '[Email]',
      'FieldName' => t('Email address'),
    ),
  );
  $custom_fields = CampaignMonitor::getConnector()
    ->getCustomFields($key);

  // Merge all the fields and clean them up.
  $fields = $basic_fields + $custom_fields;
  foreach ($fields as &$field) {
    $field['Key'] = preg_replace('/\\[|\\]/', '', $field['Key']);
  }
  return $fields;
}

/**
 * Returns a Forms API structure for the Campaign Monitor lists field.
 */
function _webform_campaignmonitor_component_list_form($component, $lists_info) {
  $form['list'] = array(
    '#type' => 'checkboxes',
    '#title' => t('Lists'),
    '#description' => t('Select the lists the user will be subscribed to.'),
    '#options' => array(),
    '#required' => TRUE,
    '#ajax' => array(
      'callback' => '_webform_campaignmonitor_component_fields_mappings_ajax',
      'wrapper' => 'fields-mappings-div',
      'effect' => 'fade',
      'progress' => array(
        'type' => 'none',
      ),
    ),
  );
  if (isset($component['extra']['lists'])) {
    $form['list']['#default_value'] = $component['extra']['lists'];
  }
  foreach ($lists_info as $key => $value) {
    if (campaignmonitor_is_list_enabled($key)) {
      $form['list']['#options'][$key] = $value['name'];
    }
  }
  return $form['list'];
}

/**
 * Returns a Forms API structure for the Campaign Monitor field mappings field.
 */
function _webform_campaignmonitor_component_fields_mappings_form($component, $lists_info) {
  $form['fields_mappings'] = array(
    '#type' => 'fieldset',
    '#title' => t('Lists settings'),
    '#collapsible' => TRUE,
    '#collapsed' => FALSE,
    '#prefix' => '<div id="fields-mappings-div">',
    '#suffix' => '</div>',
  );
  foreach ($lists_info as $key => $value) {
    if (campaignmonitor_is_list_enabled($key)) {
      $form['fields_mappings'][$key] = array(
        '#type' => 'fieldset',
        '#title' => check_plain($value['name']),
        '#description' => t('Select a Webform component for each one of the Campaign Monitor fields.'),
        '#collapsible' => TRUE,
        '#collapsed' => TRUE,
      );
      $fields = _webform_campaignmonitor_list_fields($key);
      $options = _webform_campaignmonitor_list_components_options($component['nid']);
      foreach ($fields as $field) {
        $form['fields_mappings'][$key][$field['Key']] = array(
          '#type' => 'select',
          '#title' => check_plain($field['FieldName']),
          '#options' => $options,
          '#required' => $field['Key'] == 'Email',
        );
        if (isset($component['extra']['fields_mappings'][$key][$field['Key']])) {
          $form['fields_mappings'][$key][$field['Key']]['#default_value'] = $component['extra']['fields_mappings'][$key][$field['Key']];
        }
      }
    }
  }
  return $form['fields_mappings'];
}

/**
 * AJAX callback: Updates fields mappings.
 */
function _webform_campaignmonitor_component_fields_mappings_ajax($form, &$form_state) {
  return $form['extra']['fields_mappings'];
}

Functions

Namesort descending Description
webform_campaignmonitor_form_alter Implements hook_form_alter().
webform_campaignmonitor_webform_component_info Implements hook_webform_component_info().
webform_campaignmonitor_webform_submission_insert Implements hook_webform_submission_insert().
_webform_campaignmonitor_after_build Webforms after build handler.
_webform_campaignmonitor_component_fields_mappings_ajax AJAX callback: Updates fields mappings.
_webform_campaignmonitor_component_fields_mappings_form Returns a Forms API structure for the Campaign Monitor field mappings field.
_webform_campaignmonitor_component_list_form Returns a Forms API structure for the Campaign Monitor lists field.
_webform_campaignmonitor_list_components Lists all components of a given type that belong to a given node nid.
_webform_campaignmonitor_list_components_in_form Lists all components of a given type.
_webform_campaignmonitor_list_components_options Lists all components that belong to a given node nid (Forms API format).
_webform_campaignmonitor_list_fields List fields of a given Campaign Monitor list.
_webform_campaignmonitor_subscribe Subscribes an email address to one or more mailing lists.
_webform_campaignmonitor_subscription_custom_fields Finds and returns the values of "Custom" fields on a given submission.
_webform_campaignmonitor_subscription_email_field Finds and returns the value of the "Email" field on a given submission.
_webform_campaignmonitor_subscription_name_field Finds and returns the value of the "Name" field on a given submission.