| 1 |
<?php //$Id$
|
| 2 |
|
| 3 |
|
| 4 |
function order_related_form_alter($form_id, &$form) {
|
| 5 |
if (!isset($form['order'])) return;
|
| 6 |
|
| 7 |
// i need to validate the form so that I can add new items to the node
|
| 8 |
$form["#validate"]['order_related_update_relations'] = array();
|
| 9 |
|
| 10 |
/* find all nodes that are order-able. This is a big silly hack and needs
|
| 11 |
to be replaced with a better selection mechanism (i'm lookin' at you, mark!)
|
| 12 |
mark sez: hold your horses, it's coming. if i didn't have to build a new ecommerce system
|
| 13 |
it'd be here sooner. ;-)
|
| 14 |
*/
|
| 15 |
|
| 16 |
/* Hack time -- pull data out of post to stick in the node form, so that code below
|
| 17 |
can render the right number of related items.
|
| 18 |
TODO I should probably reimplement this as a form element (ie. hook_elements) */
|
| 19 |
|
| 20 |
// dprint_r($_POST);
|
| 21 |
if ($_POST['op'] == t('Update relations')) {
|
| 22 |
if ($new_nid = $_POST['order_related']['selection']) {
|
| 23 |
$form['#node']->order_related[$new_nid]->cost = NULL;
|
| 24 |
$form['#node']->order_related[$new_nid]->description = NULL;
|
| 25 |
$form['#node']->order_related[$new_nid]->selected = false;
|
| 26 |
}
|
| 27 |
}
|
| 28 |
|
| 29 |
if (is_array($_POST['order_related'])) {
|
| 30 |
foreach ($_POST['order_related'] as $nid => $values) {
|
| 31 |
if (!is_int($nid)) continue;
|
| 32 |
$form['#node']->order_related[$nid]->cost = $values['cost'];
|
| 33 |
$form['#node']->order_related[$nid]->description = $values['description'];
|
| 34 |
$form['#node']->order_related[$nid]->selected = $values['selected'];
|
| 35 |
}
|
| 36 |
}
|
| 37 |
// end hack
|
| 38 |
|
| 39 |
$node = $form['#node'];
|
| 40 |
|
| 41 |
$all_nodes = array();
|
| 42 |
$res = db_query("SELECT * FROM {node} WHERE type IN ( '". join("', '", variable_get('order_node_types', array())) ."')");
|
| 43 |
while ($row = db_fetch_object($res)) {
|
| 44 |
if ($row->nid == $node->nid) continue;
|
| 45 |
$all_nodes[$row->nid] = $row->title;
|
| 46 |
}
|
| 47 |
|
| 48 |
$form['order']['order_related'] = array(
|
| 49 |
'#tree' => 'true',
|
| 50 |
'#type' => 'fieldset',
|
| 51 |
'#title' => t('Related items'),
|
| 52 |
);
|
| 53 |
|
| 54 |
if (is_array($node->order_related)) {
|
| 55 |
foreach ($node->order_related as $nid => $values) {
|
| 56 |
|
| 57 |
$current_node = node_load(array('nid' => $nid));
|
| 58 |
$form['order']['order_related'][$nid]['title'] = array(
|
| 59 |
'#type' => 'markup',
|
| 60 |
'#value' => l($current_node->title, 'node/'. $nid),
|
| 61 |
);
|
| 62 |
|
| 63 |
$form['order']['order_related'][$nid]['description'] = array(
|
| 64 |
'#type' => 'textarea',
|
| 65 |
'#title' => t('Description'),
|
| 66 |
'#default_value' => $values->description,
|
| 67 |
'#rows' => 3,
|
| 68 |
'#cols' => 24,
|
| 69 |
);
|
| 70 |
$form['order']['order_related'][$nid]['cost'] = array(
|
| 71 |
'#type' => 'textfield',
|
| 72 |
'#title' => t('Price'),
|
| 73 |
'#default_value' => $values->cost,
|
| 74 |
'#size' => 5,
|
| 75 |
'#suffix' => isset($current_node->order_cost) ? '<small>'.
|
| 76 |
t('Leave blank to use original price (%cost).', array('%cost' => $current_node->order_cost))
|
| 77 |
.'</small>' : NULL,
|
| 78 |
);
|
| 79 |
$form['order']['order_related'][$nid]['selected'] = array(
|
| 80 |
'#type' => 'checkbox',
|
| 81 |
'#title' => t('Suggest on cart?'),
|
| 82 |
'#default_value' => $values->selected
|
| 83 |
);
|
| 84 |
}
|
| 85 |
}
|
| 86 |
|
| 87 |
$form['order']['order_related']['selection'] = array(
|
| 88 |
'#type' => 'select',
|
| 89 |
'#multiple' => false,
|
| 90 |
'#options' => $all_nodes,
|
| 91 |
'#title' => t('Related'),
|
| 92 |
'#description' => t('Select a node to relate to this orderable item.'),
|
| 93 |
);
|
| 94 |
|
| 95 |
$form['order']['order_related']['button'] = array(
|
| 96 |
'#type' => 'button',
|
| 97 |
'#value' => t('Update relations'),
|
| 98 |
);
|
| 99 |
|
| 100 |
$form['order']['order_related']['#theme'] = 'order_related_form';
|
| 101 |
|
| 102 |
/* todo enable this or put into a separate module
|
| 103 |
$form['order']['order_included'] = array(
|
| 104 |
'#type' => 'select',
|
| 105 |
'#multiple' => true,
|
| 106 |
'#options' => $all_nodes,
|
| 107 |
'#title' => t('Included'),
|
| 108 |
'#description' => t('If this product includes other items, list them here. They will be sold as a bundle'),
|
| 109 |
'#default_value' => $node->order_included,
|
| 110 |
);
|
| 111 |
*/
|
| 112 |
}
|
| 113 |
|
| 114 |
function theme_order_related_form(&$form) {
|
| 115 |
drupal_add_css(drupal_get_path('module', 'order') .'/order.css');
|
| 116 |
$needed = false;
|
| 117 |
|
| 118 |
foreach ($form as $nid => $item) {
|
| 119 |
if (!is_int($nid)) continue;
|
| 120 |
$needed = true;
|
| 121 |
$hdrs = array(
|
| 122 |
t('Title'),
|
| 123 |
$form[$nid]['description']['#title'],
|
| 124 |
$form[$nid]['cost']['#title'],
|
| 125 |
$form[$nid]['selected']['#title']);
|
| 126 |
|
| 127 |
// clear some data in the form
|
| 128 |
unset($form[$nid]['title']['#title']);
|
| 129 |
unset($form[$nid]['description']['#title']);
|
| 130 |
unset($form[$nid]['cost']['#title']);
|
| 131 |
unset($form[$nid]['selected']['#title']);
|
| 132 |
|
| 133 |
$rows[] = array(
|
| 134 |
drupal_render($form[$nid]['title']),
|
| 135 |
drupal_render($form[$nid]['description']),
|
| 136 |
drupal_render($form[$nid]['cost']),
|
| 137 |
drupal_render($form[$nid]['selected'])
|
| 138 |
);
|
| 139 |
}
|
| 140 |
|
| 141 |
if ($needed) {
|
| 142 |
$out = theme('table', $hdrs, $rows, array('id' => 'order_related_node_edit'));
|
| 143 |
}
|
| 144 |
$out .= drupal_render($form);
|
| 145 |
return $out;
|
| 146 |
}
|
| 147 |
|
| 148 |
function order_related_order_cart_alter($op, &$cart, &$item) {
|
| 149 |
switch ($op) {
|
| 150 |
case 'total':
|
| 151 |
foreach ($cart->items as $nid => $data) {
|
| 152 |
$node = $data['node'];
|
| 153 |
if (!isset($node->order_related)) continue;
|
| 154 |
|
| 155 |
$related = array();
|
| 156 |
foreach ($node->order_related as $rnid => $rdata) {
|
| 157 |
$rdata = (array) $rdata;
|
| 158 |
$rnode = $rdata['node'];
|
| 159 |
$rdata['qty'] = 1;
|
| 160 |
|
| 161 |
if (!$rdata['cost']) $rdata['cost'] = $rnode->order_cost;
|
| 162 |
|
| 163 |
// item already in cart
|
| 164 |
if (isset($cart->items[$rnid])) {
|
| 165 |
$cart->items[$rnid]['cost'] = $rdata['cost'];
|
| 166 |
|
| 167 |
// todo update qty and show it as a related item somehow?
|
| 168 |
continue;
|
| 169 |
}
|
| 170 |
|
| 171 |
$related[$rnid] = $rdata;
|
| 172 |
}
|
| 173 |
|
| 174 |
if (count($related)) {
|
| 175 |
$cart->items[$nid]['form']['related']['#theme'] = 'order_related_cart_items';
|
| 176 |
}
|
| 177 |
|
| 178 |
foreach ($related as $rnid => $rdata) {
|
| 179 |
$cart->items[$nid]['form']['related']['qty-'. $rnid] = array(
|
| 180 |
'#type' => 'checkbox',
|
| 181 |
'#return_value' => $rdata['qty'],
|
| 182 |
'#title' => l($rdata['node']->title, 'node/'. $rnode->nid),
|
| 183 |
'#attributes' => $rdata['selected'] ? NULL : array('onclick' => 'this.form.submit();'),
|
| 184 |
'#default_value' => $rdata['selected'],
|
| 185 |
'#description' => $rdata['description'],
|
| 186 |
'#suffix' => $rdata['cost'],
|
| 187 |
);
|
| 188 |
}
|
| 189 |
}
|
| 190 |
}
|
| 191 |
}
|
| 192 |
|
| 193 |
function theme_order_related_cart_items($form) {
|
| 194 |
$out = '<h4>Related Items</h4>';
|
| 195 |
$children = element_children($form);
|
| 196 |
|
| 197 |
$hdrs = array(
|
| 198 |
t('Add'),
|
| 199 |
t('Item'),
|
| 200 |
t('Your Price'));
|
| 201 |
$rows = array();
|
| 202 |
|
| 203 |
foreach ($children as $key) {
|
| 204 |
$current = $form[$key];
|
| 205 |
$cost = $form[$key]['#suffix'];
|
| 206 |
$title = $form[$key]['#title'];
|
| 207 |
$description = $form[$key]['#description'];
|
| 208 |
// clear away some of these items
|
| 209 |
unset($form[$key]['#title']);
|
| 210 |
unset($form[$key]['#suffix']);
|
| 211 |
unset($form[$key]['#description']);
|
| 212 |
|
| 213 |
$rows[] = array(
|
| 214 |
drupal_render($form[$key]),
|
| 215 |
"<h5>$title</h5>\n$description",
|
| 216 |
$cost
|
| 217 |
);
|
| 218 |
}
|
| 219 |
$out .= theme('table', $hdrs, $rows);
|
| 220 |
$out .= drupal_render($form);
|
| 221 |
|
| 222 |
return '<div class = "order-related-items">'. $out .'</div>';
|
| 223 |
}
|