annotate theme.inc @ 0:0651c02e6ed7

views_calc 1.3
author Franck Deroche <franck@defr.org>
date Wed, 05 Aug 2009 18:20:29 +0200
parents
children cedf71edacf5
rev   line source
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 }