uc_webform_pane.module in Ubercart Webform Checkout Pane 6
Same filename and directory in other branches
Ubercart Webform Checkout Panes.
@note Ubercart webform data is stored in database during checkout, even when order is not complete
File
uc_webform_pane.moduleView source
<?php
/**
* @file uc_webform_pane.module
*
* Ubercart Webform Checkout Panes.
*
* @note Ubercart webform data is stored in database during checkout, even when order is not complete
*/
/**
* Implementation of hook_menu().
*/
function uc_webform_pane_menu() {
$items['admin/store/webform_panes'] = array(
'title' => 'Webform Checkout Panes',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'uc_webfom_pane_admin',
),
// NOTE: as of Drupal 6.2, all menu items are *required* to have
// access control.
'access arguments' => array(
'administer site configuration',
),
'type' => MENU_NORMAL_ITEM,
);
return $items;
}
/**
* Admin form to assign webform nodes to Ubercart panes.
*/
function uc_webfom_pane_admin() {
$nodes = _uc_webfom_pane_get_nodes('LEFT');
foreach ($nodes as $n) {
$nid = $n->nid;
$form["nid{$nid}"] = array(
'#type' => 'checkbox',
'#title' => $n->title,
'#default_value' => $n->uc_nid,
);
if ($n->uc_nid) {
if (empty($_POST) && !$n->form_key_order_id) {
drupal_set_message(t('Setup is not complete! Please add and associate a hidden webform field to store the Order ID for webform: %name', array(
'%name' => $n->title,
)), 'error');
}
$node = node_load($n->uc_nid);
$fields = array(
'' => '--' . t('select') . '--',
);
if ($node->webform['components']) {
foreach ($node->webform['components'] as $field) {
if ($field['type'] == 'hidden') {
$fields[$field['cid']] = $field['name'];
}
}
}
if (count($fields) == 1) {
$fields = array(
'' => '--' . t('no hidden fields found!') . '--',
);
}
$form["fs{$nid}"] = array(
'#type' => 'fieldset',
'#title' => t('Settings for') . ' ' . $n->title . ' ( ' . l(t('view form'), "node/{$nid}") . ' | ' . l(t('edit form'), "node/{$nid}/edit") . ' )',
);
$form["fs{$nid}"]["form_key_order_id{$nid}"] = array(
'#type' => 'select',
'#title' => t('Order ID Field'),
'#description' => t('Please add and associate a hidden field to store the Order ID.'),
'#options' => $fields,
'#default_value' => $n->cid_order_id,
);
}
}
$form['#suffix'] = '<p>' . t('Checkout pane weights can be modified on the <a href="@link">Checkout Settings</a> page.', array(
'@link' => url('admin/store/settings/checkout/edit/panes'),
));
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
return $form;
}
/**
* Save webform configuration.
*/
function uc_webfom_pane_admin_submit($form, &$form_state) {
$form_values = $form_state['values'];
foreach ($form_values as $k => $v) {
if (substr($k, 0, 3) == 'nid' && $v) {
$nid = substr($k, 3);
$form_key_order_id = $form_values["form_key_order_id{$nid}"] ? db_escape_string($form_values["form_key_order_id{$nid}"]) : '';
$insert[] = "({$nid}, '{$form_key_order_id}')";
}
}
db_query("DELETE FROM {uc_webform_pane}");
if (isset($insert)) {
db_query("INSERT INTO {uc_webform_pane} VALUES " . implode(",", $insert));
}
drupal_set_message(t('Webform Panes saved.'));
}
/**
* Implementation of hook_checkout_pane().
*/
function uc_webform_pane_checkout_pane() {
$webforms = _uc_webfom_pane_get_nodes('INNER');
$panes = array();
foreach ($webforms as $r) {
if ($r->form_key_order_id) {
$funcname = '_uc_webform_pane_' . $r->nid;
// Dynamically create callback function
if (!function_exists($funcname)) {
eval('function ' . $funcname . '($op, &$arg1, $arg2) { return uc_webform_pane_checkout_pane_callback(' . $r->nid . ',$op, $arg1, $arg2); } ');
}
$panes[] = array(
'id' => 'webform_nid' . $r->nid,
'callback' => $funcname,
'title' => $r->title,
'desc' => $r->body,
'weight' => 0,
'process' => TRUE,
'collapsible' => FALSE,
);
}
}
return $panes;
}
/**
* Checkout Pane callback for dynamic callback function.
*
* @link http://www.ubercart.org/docs/developer/245/checkout.
* @param $arg1 is the current order object if it exists.
* @param $arg2 is the contents of the array of the submitted form information for that pane.
*/
function uc_webform_pane_checkout_pane_callback($nid, $op, &$arg1, $arg2) {
$node = node_load($nid);
$info = _uc_webfom_pane_get_node_info($nid);
$form_state = array();
$form = webform_client_form($form_state, $node, NULL, TRUE);
$form = $form['submitted'];
unset($form['#tree']);
unset($form[$info->form_key_order_id]);
// Assign default values to webform
if ($arg1->order_id) {
$data = get_object_vars(_uc_webform_pane_get_data($nid, $arg1->order_id));
foreach ($node->webform['components'] as $field) {
if (isset($form[$field['form_key']]) && isset($form[$field['form_key']]['#default_value'])) {
$default = $data['data'][$field['cid']]['value'];
// options require safe key name
if (is_array($default) && (count($default) > 1 || in_array($form[$field['form_key']]['#type'], array(
'radios',
'select',
)))) {
$default = array_filter($default);
foreach ($default as $optk => $optv) {
$default[$optk] = _webform_safe_name($optv);
}
}
if (count($default) == 1) {
$default = $default[0];
}
$form[$field['form_key']]['#default_value'] = $default;
}
}
}
// Cannot begin with a number
foreach ($form as $k => $v) {
$form["webform{$k}"] = $v;
unset($form[$k]);
}
switch ($op) {
case 'view':
return array(
'contents' => $form,
);
break;
case 'process':
_uc_webform_pane_delete($nid, $arg1->order_id);
// reset
_uc_webfom_pane_save($nid, $arg1->order_id, $arg2);
// save to database
return TRUE;
break;
case 'review':
return _uc_webform_pane_render($nid, $arg1->order_id);
break;
default:
break;
}
}
/**
* Implementation of hook_order_pane().
*/
function uc_webform_pane_order_pane() {
$webforms = _uc_webfom_pane_get_nodes('INNER');
$panes = array();
foreach ($webforms as $r) {
if ($r->form_key_order_id) {
$funcname = '_uc_webform_order_pane_' . $r->nid;
// Dynamically create callback function
if (!function_exists($funcname)) {
eval('function ' . $funcname . '($op, $arg1) { return uc_webform_pane_order_pane_callback(' . $r->nid . ',$op, $arg1); } ');
}
$panes[] = array(
'id' => 'webform_nid' . $r->nid,
'callback' => $funcname,
'title' => $r->title,
'class' => 'abs-left',
'weight' => 7,
'show' => array(
'view',
'edit',
),
);
}
}
return $panes;
}
/**
* Order Pane callback for dynamic order callback function.
*/
function uc_webform_pane_order_pane_callback($nid, $op, $arg1) {
switch ($op) {
case 'view':
$data = _uc_webform_pane_render($nid, $arg1->order_id);
$output = '<table>';
foreach ($data as $row) {
$border = '';
if (isset($row['border'])) {
$border = ' class="row-border-' . $row['border'] . '"';
}
$output .= '<tr valign="top"' . $border . '><td class="title-col" ' . 'nowrap>' . $row['title'] . ':</td><td class="data-col">' . $row['data'] . '</td></tr>';
}
$output .= '</table>';
return $output;
break;
case 'edit-form':
break;
}
}
/**
* Implementation of hook_order().
* @todo edit webforms?
*/
function uc_webform_pane_order($op, &$arg1, $arg2) {
switch ($op) {
// Save to the database.
case 'save':
break;
// Load from the database.
case 'load':
break;
// Delete from the database.
case 'delete':
break;
}
}
/**
* Save pane values as webform submission through Webform submit handler.
*/
function _uc_webfom_pane_save($nid, $order_id, $values) {
$info = _uc_webfom_pane_get_node_info($nid);
// need form_key for order_id
// reset keys (remove "webform" prefix)
foreach ($values as $k => $v) {
$values[substr($k, 7)] = $v;
unset($values[$k]);
}
$form_values['op'] = t('Submit');
$form_values['submitted'] = $values;
$form_values['submitted']["{$info->form_key_order_id}"] = $order_id;
$form_values['details']['nid'] = $nid;
$form_state = array();
$form_state['values'] = $form_values;
webform_client_form_submit(NULL, $form_state);
}
/**
* Delete webform submission data from database.
*/
function _uc_webform_pane_delete($nid, $order_id) {
if ($sid = _uc_webform_pane_get_sid($nid, $order_id)) {
db_query('DELETE FROM {webform_submitted_data} WHERE nid = %d AND sid = %d', $nid, $sid);
db_query('DELETE FROM {webform_submissions} WHERE nid = %d AND sid = %d', $nid, $sid);
}
}
/**
* Return webform submission id.
*/
function _uc_webform_pane_get_sid($nid, $order_id) {
$info = _uc_webfom_pane_get_node_info($nid);
return db_result(db_query("SELECT sid FROM {webform_component} wc INNER JOIN {webform_submitted_data} d ON (wc.cid = d.cid) WHERE wc.nid = %d AND wc.form_key = '%s' AND data='%s'", $nid, $info->form_key_order_id, $order_id));
}
/**
* Return webform submission data.
*/
function _uc_webform_pane_get_data($nid, $order_id) {
if ($sid = _uc_webform_pane_get_sid($nid, $order_id)) {
include_once drupal_get_path('module', 'webform') . "/webform_submissions.inc";
return webform_get_submission($nid, $sid);
}
return array();
}
/**
* Get webform pane info for node id.
*/
function _uc_webfom_pane_get_node_info($nid) {
$info = _uc_webfom_pane_get_nodes('INNER', $nid);
return $info[0];
}
/**
* Return list of webform nodes.
*/
function _uc_webfom_pane_get_nodes($join_type = 'LEFT', $nid = NULL) {
$webforms = array();
$q = db_query("SELECT n.nid, n.title, nr.body, uc.nid AS uc_nid, uc.cid_order_id, c.form_key AS form_key_order_id\n FROM {node} n \n INNER JOIN {node_revisions} nr ON (n.nid = nr.nid AND nr.vid = n.vid)\n {$join_type} JOIN {uc_webform_pane} uc ON (n.nid = uc.nid)\n {$join_type} JOIN {webform_component} c ON (c.cid = uc.cid_order_id)\n WHERE n.type= 'webform' " . ($nid ? ' AND n.nid=' . $nid : '') . " ORDER BY title ASC ");
while ($r = db_fetch_object($q)) {
$webforms[] = $r;
}
return $webforms;
}
/**
* Render webform submission data.
*/
function _uc_webform_pane_render($nid, $order_id) {
$node = node_load($nid);
$form_state = array();
$form = webform_client_form($form_state, $node, NULL);
$form = $form['submitted'];
$data = get_object_vars(_uc_webform_pane_get_data($nid, $order_id));
$output = array();
foreach ($node->webform['components'] as $field) {
if (isset($form[$field['form_key']]) && $field['type'] != 'hidden') {
$view_function = '_webform_table_data_' . $field['type'];
if (function_exists($view_function)) {
$field_data = isset($data['data'][$field['cid']]) ? $data['data'][$field['cid']] : NULL;
$submission_output = $view_function($field_data, $field);
if ($submission_output !== NULL) {
$output[] = array(
'title' => $field['name'],
'data' => $submission_output,
);
}
}
}
}
return $output;
}
Functions
Name![]() |
Description |
---|---|
uc_webfom_pane_admin | Admin form to assign webform nodes to Ubercart panes. |
uc_webfom_pane_admin_submit | Save webform configuration. |
uc_webform_pane_checkout_pane | Implementation of hook_checkout_pane(). |
uc_webform_pane_checkout_pane_callback | Checkout Pane callback for dynamic callback function. |
uc_webform_pane_menu | Implementation of hook_menu(). |
uc_webform_pane_order | Implementation of hook_order(). @todo edit webforms? |
uc_webform_pane_order_pane | Implementation of hook_order_pane(). |
uc_webform_pane_order_pane_callback | Order Pane callback for dynamic order callback function. |
_uc_webfom_pane_get_nodes | Return list of webform nodes. |
_uc_webfom_pane_get_node_info | Get webform pane info for node id. |
_uc_webfom_pane_save | Save pane values as webform submission through Webform submit handler. |
_uc_webform_pane_delete | Delete webform submission data from database. |
_uc_webform_pane_get_data | Return webform submission data. |
_uc_webform_pane_get_sid | Return webform submission id. |
_uc_webform_pane_render | Render webform submission data. |