webform_campaignmonitor.module in Webform Campaign Monitor 7.3
Same filename and directory in other branches
Code for the Webform Campaign Monitor module.
File
webform_campaignmonitor.moduleView 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
Name![]() |
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. |