franck@0
|
1 <?php |
franck@0
|
2 // $Id: theme.inc,v 1.9 2009/04/23 18:32:48 karens Exp $ |
franck@0
|
3 |
franck@0
|
4 /** |
franck@0
|
5 * @file theme.inc |
franck@0
|
6 * |
franck@0
|
7 * An array of preprocessors to fill variables for templates and helper |
franck@0
|
8 * functions to make theming easier. |
franck@0
|
9 */ |
franck@0
|
10 /** |
franck@0
|
11 * Theme the form for the table style plugin |
franck@0
|
12 */ |
franck@0
|
13 function theme_views_calc_ui_table($form) { |
franck@0
|
14 $output = drupal_render($form['description_markup']); |
franck@0
|
15 |
franck@0
|
16 $header = array( |
franck@0
|
17 t('Field'), |
franck@0
|
18 t('Justification'), |
franck@0
|
19 t('Column calculations'), |
franck@0
|
20 t('Column'), |
franck@0
|
21 t('Separator'), |
franck@0
|
22 array( |
franck@0
|
23 'data' => t('Sortable'), |
franck@0
|
24 'align' => 'center', |
franck@0
|
25 ), |
franck@0
|
26 array( |
franck@0
|
27 'data' => t('Default sort'), |
franck@0
|
28 'align' => 'center', |
franck@0
|
29 ), |
franck@0
|
30 ); |
franck@0
|
31 $rows = array(); |
franck@0
|
32 foreach (element_children($form['columns']) as $id) { |
franck@0
|
33 $row = array(); |
franck@0
|
34 $row[] = drupal_render($form['info'][$id]['name']); |
franck@0
|
35 $row[] = drupal_render($form['info'][$id]['justification']); |
franck@0
|
36 $row[] = drupal_render($form['info'][$id]['has_calc']) . drupal_render($form['info'][$id]['calc']); |
franck@0
|
37 $row[] = drupal_render($form['columns'][$id]); |
franck@0
|
38 $row[] = drupal_render($form['info'][$id]['separator']); |
franck@0
|
39 if (!empty($form['info'][$id]['sortable'])) { |
franck@0
|
40 $row[] = array( |
franck@0
|
41 'data' => drupal_render($form['info'][$id]['sortable']), |
franck@0
|
42 'align' => 'center', |
franck@0
|
43 ); |
franck@0
|
44 $row[] = array( |
franck@0
|
45 'data' => drupal_render($form['default'][$id]), |
franck@0
|
46 'align' => 'center', |
franck@0
|
47 ); |
franck@0
|
48 } |
franck@0
|
49 else { |
franck@0
|
50 $row[] = ''; |
franck@0
|
51 $row[] = ''; |
franck@0
|
52 } |
franck@0
|
53 $rows[] = $row; |
franck@0
|
54 } |
franck@0
|
55 |
franck@0
|
56 // Add the special 'None' row. |
franck@0
|
57 $rows[] = array(t('None'), '', '', '', '', array('align' => 'center', 'data' => drupal_render($form['default'][-1]))); |
franck@0
|
58 |
franck@0
|
59 $output .= theme('table', $header, $rows); |
franck@0
|
60 $output .= drupal_render($form); |
franck@0
|
61 return $output; |
franck@0
|
62 } |
franck@0
|
63 |
franck@0
|
64 |
franck@0
|
65 /** |
franck@0
|
66 * Display a view as a table style. |
franck@0
|
67 */ |
franck@0
|
68 function template_preprocess_views_calc_table(&$vars) { |
franck@0
|
69 $view = $vars['view']; |
franck@0
|
70 if (!empty($view->views_calc_calculation)) { |
franck@0
|
71 $vars['rows'] = array(); |
franck@0
|
72 return; |
franck@0
|
73 } |
franck@0
|
74 |
franck@0
|
75 drupal_add_css(drupal_get_path('module', 'views_calc') .'/views_calc.css'); |
franck@0
|
76 |
franck@0
|
77 // We need the raw data for this grouping, which is passed in as $vars['rows']. |
franck@0
|
78 // However, the template also needs to use for the rendered fields. We |
franck@0
|
79 // therefore swap the raw data out to a new variable and reset $vars['rows'] |
franck@0
|
80 // so that it can get rebuilt. |
franck@0
|
81 $result = $vars['rows']; |
franck@0
|
82 $vars['rows'] = array(); |
franck@0
|
83 $totals = $view->totals; |
franck@0
|
84 $sub_totals = $view->sub_totals; |
franck@1
|
85 if ($vars['title'] && $view->group_totals[$vars['title']]) { |
franck@1
|
86 $totals = $view->group_totals[$vars['title']]; |
franck@1
|
87 } |
franck@0
|
88 |
franck@0
|
89 $options = $view->style_plugin->options; |
franck@0
|
90 $handler = $view->style_plugin; |
franck@0
|
91 $vars['options'] = $options; |
franck@0
|
92 $hide_details = $options['detailed_values']; |
franck@0
|
93 |
franck@0
|
94 $fields = &$view->field; |
franck@0
|
95 $columns = $handler->sanitize_columns($options['columns'], $fields); |
franck@0
|
96 |
franck@0
|
97 $active = !empty($handler->active) ? $handler->active : ''; |
franck@0
|
98 $order = !empty($handler->order) ? $handler->order : 'asc'; |
franck@0
|
99 |
franck@0
|
100 $query = tablesort_get_querystring(); |
franck@0
|
101 if ($query) { |
franck@0
|
102 $query = '&' . $query; |
franck@0
|
103 } |
franck@0
|
104 |
franck@0
|
105 foreach ($columns as $field => $column) { |
franck@0
|
106 // render the header labels |
franck@0
|
107 if ($field == $column && empty($fields[$field]->options['exclude'])) { |
franck@0
|
108 $label = check_plain(!empty($fields[$field]) ? $fields[$field]->label() : ''); |
franck@0
|
109 if (empty($options['info'][$field]['sortable'])) { |
franck@0
|
110 $vars['header'][$field] = $label; |
franck@0
|
111 } |
franck@0
|
112 else { |
franck@0
|
113 // @todo -- make this a setting |
franck@0
|
114 $initial = 'asc'; |
franck@0
|
115 |
franck@0
|
116 if ($active == $field && $order == 'asc') { |
franck@0
|
117 $initial = 'desc'; |
franck@0
|
118 } |
franck@0
|
119 |
franck@0
|
120 $image = theme('tablesort_indicator', $initial); |
franck@0
|
121 $title = t('sort by @s', array('@s' => $label)); |
franck@0
|
122 $link_options = array( |
franck@0
|
123 'html' => true, |
franck@0
|
124 'attributes' => array('title' => $title), |
franck@0
|
125 'query' => 'order=' . urlencode($field) . '&sort=' . $initial . $query, |
franck@0
|
126 ); |
franck@0
|
127 $vars['header'][$field] = l($label . $image, $_GET['q'], $link_options); |
franck@0
|
128 } |
franck@0
|
129 } |
franck@0
|
130 |
franck@0
|
131 // Create a second variable so we can easily find what fields we have and what the |
franck@0
|
132 // CSS classes should be. |
franck@0
|
133 $vars['fields'][$field] = views_css_safe($field); |
franck@0
|
134 if ($active == $field) { |
franck@0
|
135 $vars['fields'][$field] .= ' active'; |
franck@0
|
136 } |
franck@0
|
137 |
franck@0
|
138 // Render each field into its appropriate column. |
franck@0
|
139 foreach ($result as $num => $row) { |
franck@0
|
140 if (!empty($fields[$field]) && empty($fields[$field]->options['exclude'])) { |
franck@0
|
141 $field_output = $fields[$field]->theme($row); |
franck@0
|
142 |
franck@0
|
143 // Don't bother with separators and stuff if the field does not show up. |
franck@0
|
144 if (!isset($field_output) && isset($vars['rows'][$num][$column])) { |
franck@0
|
145 continue; |
franck@0
|
146 } |
franck@0
|
147 |
franck@0
|
148 if ($hide_details) { |
franck@0
|
149 continue; |
franck@0
|
150 } |
franck@0
|
151 |
franck@0
|
152 // Place the field into the column, along with an optional separator. |
franck@0
|
153 if (isset($vars['rows'][$num][$column])) { |
franck@0
|
154 if (!empty($options['info'][$column]['separator'])) { |
franck@0
|
155 $vars['rows'][$num][$column] .= filter_xss_admin($options['info'][$column]['separator']); |
franck@0
|
156 } |
franck@0
|
157 } |
franck@0
|
158 else { |
franck@0
|
159 $vars['rows'][$num][$column] = ''; |
franck@0
|
160 } |
franck@0
|
161 |
franck@0
|
162 $vars['rows'][$num][$column] .= $field_output; |
franck@0
|
163 } |
franck@0
|
164 } |
franck@0
|
165 } |
franck@0
|
166 |
franck@0
|
167 // Add totals. |
franck@0
|
168 if($view->total_rows > $view->pager['items_per_page']) { |
franck@0
|
169 $process_available = array('sub_totals', 'totals'); |
franck@0
|
170 } |
franck@0
|
171 else{ |
franck@0
|
172 $process_available = array('totals'); |
franck@0
|
173 $vars['sub_totals'] = array(); //if don't set, error in template |
franck@0
|
174 } |
franck@0
|
175 foreach ($process_available as $process) { |
franck@0
|
176 $vars[$process] = array(); |
franck@0
|
177 $added_label = array(); |
franck@0
|
178 foreach ($columns as $field => $column) { |
franck@0
|
179 $field_alias = $fields[$field]->field_alias; |
franck@0
|
180 if ($field == $column && empty($fields[$field]->options['exclude'])) { |
franck@0
|
181 foreach ($$process as $num => $row) { |
franck@0
|
182 $type = ''; |
franck@0
|
183 foreach ($row as $item) { |
franck@0
|
184 if (in_array($item, array_keys(_views_calc_calc_options()))) { |
franck@0
|
185 $type = $item; |
franck@0
|
186 break; |
franck@0
|
187 } |
franck@0
|
188 } |
franck@0
|
189 if (!empty($row->$field_alias) || (isset($row->$field_alias) && $row->$field_alias === 0)) { |
franck@0
|
190 |
franck@0
|
191 // COUNT is always a numeric value, no matter what kind of field it is. |
franck@0
|
192 if ($type == 'COUNT') { |
franck@0
|
193 $vars[$process][$type][$column] = $row->$field_alias; |
franck@0
|
194 } |
franck@0
|
195 // Calculations other than COUNT should run the value through the field's theme. |
franck@0
|
196 // This will allow dates and numeric values to apply the right formatting to the result. |
franck@0
|
197 else { |
franck@0
|
198 $vars[$process][$type][$column] = $fields[$field]->theme($row); |
franck@0
|
199 } |
franck@0
|
200 } |
franck@0
|
201 elseif (!empty($type)) { |
franck@0
|
202 // Add the calc type label into the first empty column. |
franck@0
|
203 // Identify which is the sub total and which the grand total |
franck@0
|
204 // when both are provided. |
franck@0
|
205 if (empty($added_label[$type])) { |
franck@0
|
206 if ($process == 'sub_totals') { |
franck@0
|
207 $label = t("Page !Calculation", array("!Calculation" => $type)); |
franck@0
|
208 } |
franck@0
|
209 else { |
franck@0
|
210 $label = t("Total !Calculation", array("!Calculation" => $type)); |
franck@0
|
211 } |
franck@0
|
212 $vars[$process][$type][$column] = $label; |
franck@0
|
213 $added_label[$type] = TRUE; |
franck@0
|
214 } |
franck@0
|
215 else { |
franck@0
|
216 $vars[$process][$type][$column] = ''; |
franck@0
|
217 } |
franck@0
|
218 } |
franck@0
|
219 } |
franck@0
|
220 } |
franck@0
|
221 } |
franck@0
|
222 } |
franck@0
|
223 |
franck@0
|
224 $vars['class'] = 'views-table'; |
franck@0
|
225 if (!empty($options['sticky'])) { |
franck@0
|
226 drupal_add_js('misc/tableheader.js'); |
franck@0
|
227 $vars['class'] .= " sticky-enabled"; |
franck@0
|
228 } |
franck@0
|
229 |
franck@0
|
230 return; |
franck@0
|
231 |
franck@1
|
232 } |