uc_webform_pane.module in Ubercart Webform Checkout Pane 5
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
*/
/**
* 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['submitted'] = $values;
$form_values['submitted']["{$info->form_key_order_id}"] = $order_id;
$form_values['details']['nid'] = $nid;
$form_values['op'] = t('Submit');
webform_client_form_submit(NULL, $form_values);
}
/**
* 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.inc";
return _webform_fetch_submission($sid, $nid);
}
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 = webform_client_form($node);
$form = $form['submitted'];
$data = _uc_webform_pane_get_data($nid, $order_id);
$output = '';
foreach ($node->webformcomponents as $k => $v) {
if (isset($form[$v['form_key']]) && $form[$v['form_key']]['#title']) {
$default = array_filter($data['data'][$k]['value']);
if ($default) {
$output .= '<strong>' . $form[$v['form_key']]['#title'] . '</strong> <ul><li>' . implode('<li>', $default) . '</ul>';
}
}
}
return $output;
}
/**
* Implementation of hook_menu().
*/
function uc_webform_pane_menu($may_cache) {
$items = array();
if ($may_cache) {
$items[] = array(
'path' => 'admin/store/webform_panes',
'title' => t('Webform Checkout Panes'),
'callback' => 'drupal_get_form',
'callback arguments' => 'uc_webfom_pane_admin',
'access' => user_access('administer store'),
'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->webformcomponents) {
foreach ($node->webformcomponents as $cid => $field) {
if ($field['type'] == 'hidden') {
$fields[$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'),
);
//print_r($nodes);
return $form;
}
function uc_webfom_pane_admin_submit($form_id, $form_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.'));
}
/**
* 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 = webform_client_form($node);
$form = $form['submitted'];
unset($form['#tree']);
unset($form[$info->form_key_order_id]);
// Assign default values to webform
if ($arg1->order_id) {
$data = _uc_webform_pane_get_data($nid, $arg1->order_id);
/*
if($nid == 4544) {
print_r($node->webformcomponents);
print_r($form);
print_r($data);
exit;
}
*/
foreach ($node->webformcomponents as $k => $v) {
if (isset($form[$v['form_key']]) && isset($form[$v['form_key']]['#default_value'])) {
$default = $data['data'][$k]['value'];
//echo $form[$v['form_key']]['#title'] . print_R($default,1) . '<br>';
// options require safe key name
if (is_array($default) && (count($default) > 1 || in_array($form[$v['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[$v['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(
//'description' => 'desc',
'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':
$output = _uc_webform_pane_render($nid, $arg1->order_id);
if ($output) {
return array(
//'title' => $node->title,
'data' => $output,
);
}
else {
return FALSE;
}
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,
//'desc' => t('See how the customer found out about your site.'),
'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':
return _uc_webform_pane_render($nid, $arg1->order_id);
/*
.
'['. l(t('edit'), "node/$nid/edit") . ']';
*/
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;
}
}
Functions
Name![]() |
Description |
---|---|
uc_webfom_pane_admin | Admin form to assign webform nodes to Ubercart panes |
uc_webfom_pane_admin_submit | |
uc_webform_pane_checkout_pane | 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 |