View source
<?php
function _eloqua_cron_get_curl_handle() {
$ch = curl_init();
if (empty($ch)) {
$message = t('Unable to open curl. Skipping message.');
$params = array();
watchdog('eloqua', $message, $params, WATCHDOG_ERROR);
$ch = NULL;
}
return $ch;
}
function _eloqua_cron() {
if (!function_exists('curl_init')) {
$message = t('Curl does not appear to be installed.');
$params = array();
watchdog('eloqua', $message, $params, WATCHDOG_ALERT);
return;
}
$posts = eloqua_post_get_batch();
if (empty($posts) || !is_array($posts)) {
return;
}
foreach ($posts as $post) {
if (!is_array($post->data)) {
$post->data = array();
}
$original_headers = $post->data['user_headers'];
$headers = array(
'Accept-Language' => array_key_exists('accept-language', $original_headers) ? $original_headers['accept-language'] : 'en',
);
$post_fields = _eloqua_cron_get_post_fields($post);
$options = array();
$options['post_fields'] = $post_fields;
$options['user_agent'] = array_key_exists('user-agent', $original_headers) ? $original_headers['user-agent'] : 'User Relay';
$options['http_headers'] = $headers;
$ch = _eloqua_cron_get_curl_resource($options);
if (is_null($ch)) {
$message = t('Something went wrong with curl, unable to obtain handle. Aborting status updates.');
$params = array();
watchdog('eloqua', $message, $params, WATCHDOG_ERROR);
break;
}
try {
$data = curl_exec($ch);
$curl_status = curl_getinfo($ch);
$status_class = (int) floor($curl_status['http_code'] / 100);
$success = $data && ($status_class == 2 || $status_class == 3);
} catch (Exception $e) {
$message = t('Something went wrong with curl. Uncaught exception: !message');
$params = array(
'!message' => $e
->getMessage(),
);
watchdog('eloqua', $message, $params, WATCHDOG_ERROR);
break;
}
curl_close($ch);
$post->data['server_post'][] = array(
'timestamp' => time(),
'response' => $data,
'http_status' => $curl_status['http_code'],
);
if ($success) {
$post->{ELOQUA_POST_FIELD_STATUS} = ELOQUA_STATUS_UPLOADED;
}
else {
$post->{ELOQUA_POST_FIELD_STATUS} = ELOQUA_STATUS_FAILED;
}
eloqua_post_update($post);
}
}
function _eloqua_cron_get_curl_resource($options = array()) {
$ch = _eloqua_cron_get_curl_handle();
if ($ch == NULL) {
return NULL;
}
$curl_opts = array(
CURLOPT_HEADER => 1,
CURLOPT_POST => 1,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_TIMEOUT => 5,
CURLOPT_URL => 'http://now.eloqua.com/e/f2.aspx',
);
$option_map = array(
'post_fields' => CURLOPT_POSTFIELDS,
'user_agent' => CURLOPT_USERAGENT,
'http_headers' => CURLOPT_HTTPHEADER,
);
foreach ($option_map as $key => $curl_key) {
if (array_key_exists($key, $options)) {
$curl_opts[$curl_key] = $options[$key];
}
}
$status = _eloqua_set_curl_opts($ch, $curl_opts);
$error_msg = _eloqua_set_curl_get_error($status);
if (!empty($error_msg)) {
$message = t('Unable to set curl options. Skipping message. !options.');
$params = array(
'!options' => '<pre>' . $error_msg . '</pre>',
);
watchdog('eloqua', $message, $params, WATCHDOG_ERROR);
curl_close($ch);
$ch = NULL;
}
return $ch;
}
function _eloqua_get_submission_data($tree, $posted_values, &$result) {
foreach ($tree as $name => $value) {
if (is_array($value) && !in_array($value, $posted_values)) {
_eloqua_get_submission_data($value, $posted_values, $result);
}
else {
if (is_array($value)) {
$result[$name] = implode(',', $value);
}
else {
$result[$name] = $value;
}
}
}
}
function _eloqua_cron_remap_post_fields($post_fields, $post) {
$result = array();
$nid = $post->data['form_post']['details']['nid'];
if (empty($nid) || !is_numeric($nid)) {
return $post_fields;
}
$node = new stdClass();
$node->nid = $nid;
$webform_additions = webform_node_load($node);
$components = $webform_additions['webform']['components'];
$map = array();
if (is_array($components)) {
foreach ($components as $component) {
if (!empty($component['extra']['eloqua']['key']) && $component['extra']['eloqua']['key'] !== $component['form_key']) {
$map[$component['form_key']] = $component['extra']['eloqua']['key'];
}
}
}
foreach ($post_fields as $key => $value) {
if (isset($map[$key])) {
$result[$map[$key]] = $value;
}
else {
$result[$key] = $value;
}
}
return $result;
}
function _eloqua_set_curl_get_error($status) {
if (!is_array($status)) {
return FALSE;
}
$messages = array();
$message = '';
foreach ($status as $key => $data) {
if ($data['status']) {
continue;
}
$value = var_export($data['value'], TRUE);
$messages[] = "<li>{$key} - Error: {$data['message']}<br /> Value: {$value}</li>";
}
if (!empty($messages)) {
$message = '<ul>' . implode("\n", $messages) . '</ul>';
}
return $message;
}
function _eloqua_set_curl_opts(&$ch, $options = array()) {
if (!is_array($options)) {
return FALSE;
}
$result = array();
foreach ($options as $key => $value) {
$status = curl_setopt($ch, $key, $value);
$status_msg = '';
if (!$status) {
$status_msg = curl_error($ch);
}
$result[$key] = array(
'status' => $status,
'value' => $value,
'message' => $status_msg,
);
}
return $result;
}
function _eloqua_cron_get_post_fields($post) {
$form_data = !empty($post->data['form_post']['submitted_tree']) ? $post->data['form_post']['submitted_tree'] : $post->data['form_post']['submitted'];
$post_fields = array();
foreach ($post->data['form_post'] as $name => $value) {
if (substr($name, 0, 3) === 'elq') {
$post_fields[$name] = $value;
}
}
_eloqua_get_submission_data($form_data, $post->data['form_post']['submitted'], $post_fields);
$post_fields = _eloqua_cron_remap_post_fields($post_fields, $post);
return $post_fields;
}