/[drupal]/contributions/modules/order/order_related/order_related.module
ViewVC logotype

Contents of /contributions/modules/order/order_related/order_related.module

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.8 - (show annotations) (download) (as text)
Sun Aug 3 16:25:11 2008 UTC (15 months, 3 weeks ago) by vauxia
Branch: MAIN
CVS Tags: HEAD
Changes since 1.7: +50 -50 lines
File MIME type: text/x-php
Great big coder cleanup!
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 }

  ViewVC Help
Powered by ViewVC 1.1.2