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@0
|
85 |
franck@0
|
86 $options = $view->style_plugin->options; |
franck@0
|
87 $handler = $view->style_plugin; |
franck@0
|
88 $vars['options'] = $options; |
franck@0
|
89 $hide_details = $options['detailed_values']; |
franck@0
|
90 |
franck@0
|
91 $fields = &$view->field; |
franck@0
|
92 $columns = $handler->sanitize_columns($options['columns'], $fields); |
franck@0
|
93 |
franck@0
|
94 $active = !empty($handler->active) ? $handler->active : ''; |
franck@0
|
95 $order = !empty($handler->order) ? $handler->order : 'asc'; |
franck@0
|
96 |
franck@0
|
97 $query = tablesort_get_querystring(); |
franck@0
|
98 if ($query) { |
franck@0
|
99 $query = '&' . $query; |
franck@0
|
100 } |
franck@0
|
101 |
franck@0
|
102 foreach ($columns as $field => $column) { |
franck@0
|
103 // render the header labels |
franck@0
|
104 if ($field == $column && empty($fields[$field]->options['exclude'])) { |
franck@0
|
105 $label = check_plain(!empty($fields[$field]) ? $fields[$field]->label() : ''); |
franck@0
|
106 if (empty($options['info'][$field]['sortable'])) { |
franck@0
|
107 $vars['header'][$field] = $label; |
franck@0
|
108 } |
franck@0
|
109 else { |
franck@0
|
110 // @todo -- make this a setting |
franck@0
|
111 $initial = 'asc'; |
franck@0
|
112 |
franck@0
|
113 if ($active == $field && $order == 'asc') { |
franck@0
|
114 $initial = 'desc'; |
franck@0
|
115 } |
franck@0
|
116 |
franck@0
|
117 $image = theme('tablesort_indicator', $initial); |
franck@0
|
118 $title = t('sort by @s', array('@s' => $label)); |
franck@0
|
119 $link_options = array( |
franck@0
|
120 'html' => true, |
franck@0
|
121 'attributes' => array('title' => $title), |
franck@0
|
122 'query' => 'order=' . urlencode($field) . '&sort=' . $initial . $query, |
franck@0
|
123 ); |
franck@0
|
124 $vars['header'][$field] = l($label . $image, $_GET['q'], $link_options); |
franck@0
|
125 } |
franck@0
|
126 } |
franck@0
|
127 |
franck@0
|
128 // Create a second variable so we can easily find what fields we have and what the |
franck@0
|
129 // CSS classes should be. |
franck@0
|
130 $vars['fields'][$field] = views_css_safe($field); |
franck@0
|
131 if ($active == $field) { |
franck@0
|
132 $vars['fields'][$field] .= ' active'; |
franck@0
|
133 } |
franck@0
|
134 |
franck@0
|
135 // Render each field into its appropriate column. |
franck@0
|
136 foreach ($result as $num => $row) { |
franck@0
|
137 if (!empty($fields[$field]) && empty($fields[$field]->options['exclude'])) { |
franck@0
|
138 $field_output = $fields[$field]->theme($row); |
franck@0
|
139 |
franck@0
|
140 // Don't bother with separators and stuff if the field does not show up. |
franck@0
|
141 if (!isset($field_output) && isset($vars['rows'][$num][$column])) { |
franck@0
|
142 continue; |
franck@0
|
143 } |
franck@0
|
144 |
franck@0
|
145 if ($hide_details) { |
franck@0
|
146 continue; |
franck@0
|
147 } |
franck@0
|
148 |
franck@0
|
149 // Place the field into the column, along with an optional separator. |
franck@0
|
150 if (isset($vars['rows'][$num][$column])) { |
franck@0
|
151 if (!empty($options['info'][$column]['separator'])) { |
franck@0
|
152 $vars['rows'][$num][$column] .= filter_xss_admin($options['info'][$column]['separator']); |
franck@0
|
153 } |
franck@0
|
154 } |
franck@0
|
155 else { |
franck@0
|
156 $vars['rows'][$num][$column] = ''; |
franck@0
|
157 } |
franck@0
|
158 |
franck@0
|
159 $vars['rows'][$num][$column] .= $field_output; |
franck@0
|
160 } |
franck@0
|
161 } |
franck@0
|
162 } |
franck@0
|
163 |
franck@0
|
164 // Add totals. |
franck@0
|
165 if($view->total_rows > $view->pager['items_per_page']) { |
franck@0
|
166 $process_available = array('sub_totals', 'totals'); |
franck@0
|
167 } |
franck@0
|
168 else{ |
franck@0
|
169 $process_available = array('totals'); |
franck@0
|
170 $vars['sub_totals'] = array(); //if don't set, error in template |
franck@0
|
171 } |
franck@0
|
172 foreach ($process_available as $process) { |
franck@0
|
173 $vars[$process] = array(); |
franck@0
|
174 $added_label = array(); |
franck@0
|
175 foreach ($columns as $field => $column) { |
franck@0
|
176 $field_alias = $fields[$field]->field_alias; |
franck@0
|
177 if ($field == $column && empty($fields[$field]->options['exclude'])) { |
franck@0
|
178 foreach ($$process as $num => $row) { |
franck@0
|
179 $type = ''; |
franck@0
|
180 foreach ($row as $item) { |
franck@0
|
181 if (in_array($item, array_keys(_views_calc_calc_options()))) { |
franck@0
|
182 $type = $item; |
franck@0
|
183 break; |
franck@0
|
184 } |
franck@0
|
185 } |
franck@0
|
186 if (!empty($row->$field_alias) || (isset($row->$field_alias) && $row->$field_alias === 0)) { |
franck@0
|
187 |
franck@0
|
188 // COUNT is always a numeric value, no matter what kind of field it is. |
franck@0
|
189 if ($type == 'COUNT') { |
franck@0
|
190 $vars[$process][$type][$column] = $row->$field_alias; |
franck@0
|
191 } |
franck@0
|
192 // Calculations other than COUNT should run the value through the field's theme. |
franck@0
|
193 // This will allow dates and numeric values to apply the right formatting to the result. |
franck@0
|
194 else { |
franck@0
|
195 $vars[$process][$type][$column] = $fields[$field]->theme($row); |
franck@0
|
196 } |
franck@0
|
197 } |
franck@0
|
198 elseif (!empty($type)) { |
franck@0
|
199 // Add the calc type label into the first empty column. |
franck@0
|
200 // Identify which is the sub total and which the grand total |
franck@0
|
201 // when both are provided. |
franck@0
|
202 if (empty($added_label[$type])) { |
franck@0
|
203 if ($process == 'sub_totals') { |
franck@0
|
204 $label = t("Page !Calculation", array("!Calculation" => $type)); |
franck@0
|
205 } |
franck@0
|
206 else { |
franck@0
|
207 $label = t("Total !Calculation", array("!Calculation" => $type)); |
franck@0
|
208 } |
franck@0
|
209 $vars[$process][$type][$column] = $label; |
franck@0
|
210 $added_label[$type] = TRUE; |
franck@0
|
211 } |
franck@0
|
212 else { |
franck@0
|
213 $vars[$process][$type][$column] = ''; |
franck@0
|
214 } |
franck@0
|
215 } |
franck@0
|
216 } |
franck@0
|
217 } |
franck@0
|
218 } |
franck@0
|
219 } |
franck@0
|
220 |
franck@0
|
221 $vars['class'] = 'views-table'; |
franck@0
|
222 if (!empty($options['sticky'])) { |
franck@0
|
223 drupal_add_js('misc/tableheader.js'); |
franck@0
|
224 $vars['class'] .= " sticky-enabled"; |
franck@0
|
225 } |
franck@0
|
226 |
franck@0
|
227 return; |
franck@0
|
228 |
franck@0
|
229 } |