You are here

campaignmonitor.module in Campaign Monitor 5

File

campaignmonitor.module
View source
<?php

/******************************
 DRUPAL HOOKS
******************************/

/**
 * Implementation of hook_help()
 */
function campaignmonitor_help($section) {
  switch ($section) {
    case 'admin/settings/campaignmonitor':
      return '<p>' . t('Use your API key and other keys to have users register for a mailing list setup through Campaign Monitor.') . '</p>';
  }
}

/**
 * Implementation of hook_perm()
 */
function campaignmonitor_perm() {
  return array(
    'administer campaignmonitor',
    'access archive',
    'join newsletter',
  );
}

/**
 * Implementation of hook_menu()
 */
function campaignmonitor_menu($may_cache) {
  global $user;
  $items = array();
  if ($may_cache) {
    $items[] = array(
      'path' => 'admin/settings/campaignmonitor',
      'title' => t('Campaign Monitor'),
      'description' => t('Setup Campaign Monitor values.'),
      'callback' => 'drupal_get_form',
      'callback arguments' => 'campaignmonitor_admin',
      'access' => user_access('administer campaignmonitor'),
      'type' => MENU_NORMAL_ITEM,
    );
    $items[] = array(
      'path' => 'newsletter_archive',
      'title' => t('Newsletter Archive'),
      'callback' => 'campaignmonitor_newsletter_archive',
      'access' => user_access('access archive'),
      'type' => MENU_SUGGESTED_ITEM,
    );
  }
  else {
    if (arg(0) == 'user' && is_numeric(arg(1))) {
      $account = user_load(array(
        'uid' => arg(1),
      ));
      if ($user->uid == $account->uid || user_access('administer users')) {
        $items[] = array(
          'path' => 'user/' . arg(1) . '/newsletters',
          'title' => t('My Newsletters'),
          'callback' => 'campaignmonitor_user_page',
          'type' => MENU_LOCAL_TASK,
          'access' => user_access('join newsletter'),
          'weight' => 5,
        );
      }
    }
  }
  return $items;
}

/**
 * Implementation of hook_form_alter()
 */
function campaignmonitor_form_alter($form_id, &$form) {
  $display_on = variable_get('campaignmonitor_display_on', array());
  if (('contact_mail_page' == $form_id && $display_on['contact'] || 'user_register' == $form_id && $display_on['registration']) && user_access('join newsletter')) {
    $form['subscribe_newsletter'] = array(
      '#type' => 'checkbox',
      '#title' => t(variable_get('campaignmonitor_checkboxdisplaytext', 'Join our Newsletter?')),
      '#weight' => 99,
      '#default_value' => 1,
    );
    $form['submit']['#weight'] = 100;
    $form['#submit'] = array(
      'campaignmonitor_form_submit' => array(),
    ) + (array) $form['#submit'];
  }
}

/**
 * Implementation of hook_block()
 */
function campaignmonitor_block($op = 'list', $delta = 0, $edit = array()) {
  if ($op == 'list') {
    $blocks[0] = array(
      'info' => t('Newsletter block to allow signup to newsletter for all.'),
      'weight' => 0,
      'enabled' => 0,
      'region' => 'left',
    );
    return $blocks;
  }
  else {
    if ($op == 'configure' && $delta == 0) {

      /* $form['items'] = array(
           '#type' => 'select',
           '#title' => t('Number of items'),
           '#default_value' => variable_get('XXX_block_items', 0),
           '#options' => array('1', '2', '3'),
         );
         return $form;*/
    }
    else {
      if ($op == 'save' && $delta == 0) {

        /* variable_set('XXX_block_items', $edit['items']);*/
      }
      else {
        if ($op == 'view') {
          switch ($delta) {
            case 0:
              $block = array(
                'subject' => t('Join Newsletter'),
                'content' => campaignmonitor_signup_block(),
              );
              break;
          }
          return $block;
        }
      }
    }
  }
}

/*** END DRUPAL HOOKS ***/

/******************************
 MODULE FUNCTIONS
******************************/
function campaignmonitor_admin() {
  $form['campaignmonitor_api_key'] = array(
    '#type' => 'textfield',
    '#title' => t('API Key'),
    '#default_value' => variable_get('campaignmonitor_api_key', ''),
    '#required' => TRUE,
    '#size' => 50,
    '#maxlength' => 50,
    '#description' => t("Your Campaign Monitor API Key."),
  );
  $form['campaignmonitor_client_id'] = array(
    '#type' => 'textfield',
    '#title' => t('Client ID'),
    '#default_value' => variable_get('campaignmonitor_client_id', ''),
    '#required' => TRUE,
    '#size' => 10,
    '#maxlength' => 10,
    '#description' => t("Your Campaign Monitor Client ID."),
  );
  $form['campaignmonitor_list_id'] = array(
    '#type' => 'textfield',
    '#title' => t('List ID'),
    '#default_value' => variable_get('campaignmonitor_list_id', ''),
    '#required' => TRUE,
    '#size' => 10,
    '#maxlength' => 10,
    '#description' => t("Your Campaign Monitor List ID."),
  );
  $form['campaignmonitor_display_on'] = array(
    '#type' => 'checkboxes',
    '#title' => t('Display on Options'),
    '#default_value' => variable_get('campaignmonitor_display_on', array()),
    '#options' => array(
      'contact' => t('Contact Page'),
      'registration' => t('Registration Page'),
    ),
    '#description' => t('Choose which forms you want to display the Join Newsletter checkbox.'),
  );
  $form['campaignmonitor_checkboxisplaytext'] = array(
    '#type' => 'textfield',
    '#title' => t('Display Text for Checkbox'),
    '#default_value' => variable_get('campaignmonitor_checkboxdisplaytext', 'Join our Newsletter?'),
    '#size' => 50,
    '#maxlength' => 50,
    '#description' => t("This text will display next to the checkbox on the selected forms."),
  );
  $form['campaignmonitor_userpagedisplaytext'] = array(
    '#type' => 'textfield',
    '#title' => t('Display Text for User Page'),
    '#default_value' => variable_get('campaignmonitor_userpagedisplaytext', 'Newsletter'),
    '#size' => 50,
    '#maxlength' => 50,
    '#description' => t("This text will display next to the checkbox on the user profile page."),
  );
  $form['campaignmonitor_pastcampaignurl'] = array(
    '#type' => 'textfield',
    '#title' => t('Past Campaign URL'),
    '#default_value' => variable_get('campaignmonitor_pastcampaignurl', ''),
    '#size' => 100,
    '#maxlength' => 100,
    '#description' => t("This is required if you want to use the page that displays past campaigns. You can find this value if you go to Manage Clients, click on the client, go to the link that tells you how to display past campaigns, then copy the URL ONLY from the html given. The URL is in between the src=\"\" value."),
  );
  $form['campaignmonitor_connection_timeout'] = array(
    '#type' => 'textfield',
    '#title' => t('Connection timeout'),
    '#default_value' => variable_get('campaignmonitor_connection_timeout', 15),
    '#size' => 10,
    '#maxlength' => 10,
    '#description' => t("If your server can't get through to the API, or the API server is down, this is the amount of time until the connection times out in seconds. Default is 15 seconds."),
  );
  return system_settings_form($form);
}
function campaignmonitor_signup_block() {
  global $user;
  $content = '';
  $content .= drupal_get_form('campaignmonitor_general_form');
  if (user_access('access archive')) {
    $content .= l('Newsletter Archive', 'newsletter_archive');
  }
  return $content;
}
function campaignmonitor_user_page() {
  return drupal_get_form('campaignmonitor_user_form');
}
function campaignmonitor_user_form() {
  global $user;

  // Replace api_key and list_id with your own details
  $api_key = variable_get('campaignmonitor_api_key', '');
  $list_id = variable_get('campaignmonitor_list_id', 0);
  $email = $user->mail;
  if (_campaignmonitor_is_subscribed($api_key, $list_id, $email, true)) {
    $default = true;
  }
  else {
    $default = false;
  }
  $form['subscribe_newsletter'] = array(
    '#type' => 'checkbox',
    '#title' => variable_get('campaignmonitor_user_pagedisplaytext', 'Newsletter'),
    '#default_value' => $default,
  );
  $form['is_subscribed'] = array(
    '#type' => 'hidden',
    '#default_value' => $default,
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save'),
  );
  return $form;
}
function campaignmonitor_newsletter_archive() {
  $url = variable_get('campaignmonitor_pastcampaignurl', '');
  if ($url == '') {
    $content = '<p>The past campaign URL has not been set. Please set this in the administration pages.</p>';
  }
  else {
    $content = '<script type="text/javascript" src="' . variable_get('campaignmonitor_pastcampaignurl', '') . '"></script>';
  }
  return $content;
}
function campaignmonitor_user_form_submit($form_id, $form_values) {
  global $user;

  // Check if the profile module is installed. If it is, use the name element of the profile
  if (module_exists("profile")) {
    profile_load_profile($user->uid);
    $profile_name = $user->profile_name;
  }

  // Replace api_key and list_id with your own details
  $api_key = variable_get('campaignmonitor_api_key', '');
  $list_id = variable_get('campaignmonitor_list_id', 0);
  $name = $profile_name;
  $email = $user->mail;

  // any cases other then these are when things are unchanged
  if ($form_values['subscribe_newsletter'] && !$form_values['is_subscribed']) {

    // this is the case where they now want to be subscribed, and weren't before
    _campaignmonitor_add_subscriber($api_key, $list_id, $name, $email);
  }
  else {
    if (!$form_values['subscribe_newsletter'] && $form_values['is_subscribed']) {

      // this is the case where they don't want to be subscribed, and were before
      _campaignmonitor_remove_subscriber($api_key, $list_id, $email);
    }
  }
}
function campaignmonitor_general_form() {
  global $user;
  $name = '';
  $email = '';
  $default = false;

  // Check if the profile module is installed. If it is, use the name element of the profile
  if (module_exists("profile")) {
    profile_load_profile($user->uid);
    $name = $user->profile_name;
  }
  if ($user->uid != 0) {
    $email = $user->mail;
    if (_campaignmonitor_is_subscribed(variable_get('campaignmonitor_api_key', ''), variable_get('campaignmonitor_list_id', 0), $email)) {
      $default = true;

      // Also if subscribed get name
      $subscriber = _campaignmonitor_get_subscriber(variable_get('campaignmonitor_api_key', ''), variable_get('campaignmonitor_list_id', 0), $email);
      $name = $subscriber['name'];
    }
    else {
      $default = false;
    }
  }
  $form['name'] = array(
    '#type' => 'textfield',
    '#title' => t('Name'),
    '#size' => 20,
    '#maxlength' => 50,
    '#required' => TRUE,
    '#default_value' => $name,
  );
  $form['email'] = array(
    '#type' => 'textfield',
    '#title' => t('Email'),
    '#size' => 20,
    '#maxlength' => 100,
    '#required' => TRUE,
    '#default_value' => $email,
  );
  $form['unsubscribe_newsletter'] = array(
    '#type' => 'checkbox',
    '#title' => t('Unsubscribe'),
    '#default_value' => $default,
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Submit'),
  );
  return $form;
}
function campaignmonitor_general_form_submit($form_id, $form_values) {

  // Replace api_key and list_id with your own details
  $api_key = variable_get('campaignmonitor_api_key', '');
  $list_id = variable_get('campaignmonitor_list_id', 0);
  $name = $form_values['name'];
  $email = $form_values['email'];

  // any cases other then these are when things are unchanged
  if (!$form_values['unsubscribe_newsletter']) {

    // this is the case where they now want to be subscribed, and weren't before
    _campaignmonitor_add_subscriber($api_key, $list_id, $name, $email);
  }
  else {
    if ($form_values['unsubscribe_newsletter']) {

      // this is the case where they don't want to be subscribed, and were before
      _campaignmonitor_remove_subscriber($api_key, $list_id, $email);
    }
  }
}
function campaignmonitor_form_submit($form_id, $form_values) {
  if ($form_values['subscribe_newsletter']) {
    if ('contact_mail_page' == $form_id) {
      $form_values['message'] .= "\n\n" . t('Subscribed to newsletter.');
    }

    // Replace api_key and list_id with your own details
    $api_key = variable_get('campaignmonitor_api_key', '');
    $list_id = variable_get('campaignmonitor_list_id', 0);
    $email = $form_values['mail'];
    $name = $form_values['name'];
    _campaignmonitor_add_subscriber($api_key, $list_id, $name, $email);
  }
}

/*** END MODULE FUNCTIONS ***/

/******************************
 SOAP CALLS AND HELPERS
******************************/
function _campaignmonitor_create_client() {
  $client = new SoapClient(null, array(
    "location" => "http://app.campaignmonitor.com/api/api.asmx",
    "uri" => "http://app.campaignmonitor.com/api/",
    "style" => SOAP_RPC,
    "use" => SOAP_LITERAL,
    "trace" => true,
    "connection_timeout" => (int) variable_get('campaignmonitor_connection_timeout', '15'),
  ));
  return $client;
}
function _campaignmonitor_is_subscribed($api_key, $list_id, $email, $show_errors = false) {
  $retval = false;
  $client = _campaignmonitor_create_client();
  try {

    //make soap call
    $result = $client
      ->__soapCall("Subscribers.GetIsSubscribed", array(
      new SoapVar($api_key, XSD_STRING, null, null, "ApiKey", "http://app.campaignmonitor.com/api/"),
      new SoapVar($list_id, XSD_INT, null, null, "ListID", "http://app.campaignmonitor.com/api/"),
      new SoapVar($email, XSD_STRING, null, null, "Email", "http://app.campaignmonitor.com/api/"),
      new SoapVar($name, XSD_STRING, null, null, "Name", "http://app.campaignmonitor.com/api/"),
    ), array(
      "soapaction" => "http://app.campaignmonitor.com/api/Subscribers.GetIsSubscribed",
    ));
    if ($result->Code != 0) {
      watchdog('CAMPAIGNMONITOR RESULT: ', 'Code - ' . $result->Code . ', Message - ' . $result->Message);
    }
    else {
      if ($result == 'False') {
        $retval = false;
      }
      else {
        if ($result == 'True') {
          $retval = true;
        }
      }
    }
  } catch (SoapFault $e) {
    if ($show_errors) {
      watchdog('ERROR IN CAMPAIGNMONITOR', 'There was an error checking if joined to newsletter: ' . $e->faultstring, WATCHDOG_ERROR);
      drupal_set_message("There is an error with the newsletter server. Please try again later.", 'error');
    }
    $retval = false;
  }
  return $retval;
}
function _campaignmonitor_add_subscriber($api_key, $list_id, $name, $email, $show_errors = false) {
  $client = $client = _campaignmonitor_create_client();
  try {

    //make soap call
    $result = $client
      ->__soapCall("Subscriber.AddAndResubscribe", array(
      new SoapVar($api_key, XSD_STRING, null, null, "ApiKey", "http://app.campaignmonitor.com/api/"),
      new SoapVar($list_id, XSD_INT, null, null, "ListID", "http://app.campaignmonitor.com/api/"),
      new SoapVar($email, XSD_STRING, null, null, "Email", "http://app.campaignmonitor.com/api/"),
      new SoapVar($name, XSD_STRING, null, null, "Name", "http://app.campaignmonitor.com/api/"),
    ), array(
      "soapaction" => "http://app.campaignmonitor.com/api/Subscriber.AddAndResubscribe",
    ));
    if ($result->Code != 0) {
      watchdog('CAMPAIGNMONITOR RESULT: ', 'Code - ' . $result->Code . ', Message - ' . $result->Message);
      drupal_set_message("There was an error joining to newsletter.", 'error');
    }
    else {
      drupal_set_message("You have successfully been added.", 'status');
    }
  } catch (SoapFault $e) {
    if ($show_errors) {
      watchdog('ERROR IN CAMPAIGNMONITOR', 'There was an error joining to newsletter: ' . $e->faultstring, WATCHDOG_ERROR);
      drupal_set_message("There is an error with the newsletter server. Please try again later.", 'error');
    }
  }
}
function _campaignmonitor_remove_subscriber($api_key, $list_id, $email, $show_errors = false) {
  $client = $client = _campaignmonitor_create_client();
  try {

    //make soap call
    $result = $client
      ->__soapCall("Subscriber.Unsubscribe", array(
      new SoapVar($api_key, XSD_STRING, null, null, "ApiKey", "http://app.campaignmonitor.com/api/"),
      new SoapVar($list_id, XSD_INT, null, null, "ListID", "http://app.campaignmonitor.com/api/"),
      new SoapVar($email, XSD_STRING, null, null, "Email", "http://app.campaignmonitor.com/api/"),
      new SoapVar($name, XSD_STRING, null, null, "Name", "http://app.campaignmonitor.com/api/"),
    ), array(
      "soapaction" => "http://app.campaignmonitor.com/api/Subscriber.Unsubscribe",
    ));
    if ($result->Code != 0) {
      watchdog('CAMPAIGNMONITOR RESULT: ', 'Code - ' . $result->Code . ', Message - ' . $result->Message);
      drupal_set_message("There was an error unsubscribing from newsletter.", 'error');
    }
    else {
      drupal_set_message("You have successfully been unsubscribed.", 'status');
    }
  } catch (SoapFault $e) {
    if ($show_errors) {
      watchdog('ERROR IN CAMPAIGNMONITOR', 'There was an error unsubscribing from newsletter: ' . $e->faultstring, WATCHDOG_ERROR);
      drupal_set_message("There is an error with the newsletter server. Please try again later.", 'error');
    }
  }
}
function _campaignmonitor_get_subscriber($api_key, $list_id, $email, $show_errors = false) {
  $retval = array(
    "name" => '',
    "email" => $email,
  );
  $client = $client = _campaignmonitor_create_client();
  try {

    //make soap call
    $result = $client
      ->__soapCall("Subscribers.GetSingleSubscriber", array(
      new SoapVar($api_key, XSD_STRING, null, null, "ApiKey", "http://app.campaignmonitor.com/api/"),
      new SoapVar($list_id, XSD_INT, null, null, "ListID", "http://app.campaignmonitor.com/api/"),
      new SoapVar($email, XSD_STRING, null, null, "EmailAddress", "http://app.campaignmonitor.com/api/"),
    ), array(
      "soapaction" => "http://app.campaignmonitor.com/api/Subscribers.GetSingleSubscriber",
    ));
    if ($result->Code != 0) {
      watchdog('CAMPAIGNMONITOR RESULT: ', 'Code - ' . $result->Code . ', Message - ' . $result->Message, WATCHDOG_NOTICE);
    }
    else {
      $retval['name'] = $result->Name;
    }
  } catch (SoapFault $e) {
    if ($show_errors) {
      watchdog('ERROR IN CAMPAIGNMONITOR', 'There was an error checking if joined to newsletter: ' . $e->faultstring, WATCHDOG_ERROR);
      drupal_set_message("There is an error with the newsletter server. Please try again later.", 'error');
    }
  }
  return $retval;
}

/*** END SOAP CALLS AND HELPERS ***/