franck@0: t('Sortable'), franck@0: 'align' => 'center', franck@0: ), franck@0: array( franck@0: 'data' => t('Default sort'), franck@0: 'align' => 'center', franck@0: ), franck@0: ); franck@0: $rows = array(); franck@0: foreach (element_children($form['columns']) as $id) { franck@0: $row = array(); franck@0: $row[] = drupal_render($form['info'][$id]['name']); franck@0: $row[] = drupal_render($form['info'][$id]['justification']); franck@0: $row[] = drupal_render($form['info'][$id]['has_calc']) . drupal_render($form['info'][$id]['calc']); franck@0: $row[] = drupal_render($form['columns'][$id]); franck@0: $row[] = drupal_render($form['info'][$id]['separator']); franck@0: if (!empty($form['info'][$id]['sortable'])) { franck@0: $row[] = array( franck@0: 'data' => drupal_render($form['info'][$id]['sortable']), franck@0: 'align' => 'center', franck@0: ); franck@0: $row[] = array( franck@0: 'data' => drupal_render($form['default'][$id]), franck@0: 'align' => 'center', franck@0: ); franck@0: } franck@0: else { franck@0: $row[] = ''; franck@0: $row[] = ''; franck@0: } franck@0: $rows[] = $row; franck@0: } franck@0: franck@0: // Add the special 'None' row. franck@0: $rows[] = array(t('None'), '', '', '', '', array('align' => 'center', 'data' => drupal_render($form['default'][-1]))); franck@0: franck@0: $output .= theme('table', $header, $rows); franck@0: $output .= drupal_render($form); franck@0: return $output; franck@0: } franck@0: franck@0: franck@0: /** franck@0: * Display a view as a table style. franck@0: */ franck@0: function template_preprocess_views_calc_table(&$vars) { franck@0: $view = $vars['view']; franck@0: if (!empty($view->views_calc_calculation)) { franck@0: $vars['rows'] = array(); franck@0: return; franck@0: } franck@0: franck@0: drupal_add_css(drupal_get_path('module', 'views_calc') .'/views_calc.css'); franck@0: franck@0: // We need the raw data for this grouping, which is passed in as $vars['rows']. franck@0: // However, the template also needs to use for the rendered fields. We franck@0: // therefore swap the raw data out to a new variable and reset $vars['rows'] franck@0: // so that it can get rebuilt. franck@0: $result = $vars['rows']; franck@0: $vars['rows'] = array(); franck@0: $totals = $view->totals; franck@0: $sub_totals = $view->sub_totals; franck@1: if ($vars['title'] && $view->group_totals[$vars['title']]) { franck@1: $totals = $view->group_totals[$vars['title']]; franck@1: } franck@0: franck@0: $options = $view->style_plugin->options; franck@0: $handler = $view->style_plugin; franck@0: $vars['options'] = $options; franck@0: $hide_details = $options['detailed_values']; franck@0: franck@0: $fields = &$view->field; franck@0: $columns = $handler->sanitize_columns($options['columns'], $fields); franck@0: franck@0: $active = !empty($handler->active) ? $handler->active : ''; franck@0: $order = !empty($handler->order) ? $handler->order : 'asc'; franck@0: franck@0: $query = tablesort_get_querystring(); franck@0: if ($query) { franck@0: $query = '&' . $query; franck@0: } franck@0: franck@0: foreach ($columns as $field => $column) { franck@0: // render the header labels franck@0: if ($field == $column && empty($fields[$field]->options['exclude'])) { franck@0: $label = check_plain(!empty($fields[$field]) ? $fields[$field]->label() : ''); franck@0: if (empty($options['info'][$field]['sortable'])) { franck@0: $vars['header'][$field] = $label; franck@0: } franck@0: else { franck@0: // @todo -- make this a setting franck@0: $initial = 'asc'; franck@0: franck@0: if ($active == $field && $order == 'asc') { franck@0: $initial = 'desc'; franck@0: } franck@0: franck@0: $image = theme('tablesort_indicator', $initial); franck@0: $title = t('sort by @s', array('@s' => $label)); franck@0: $link_options = array( franck@0: 'html' => true, franck@0: 'attributes' => array('title' => $title), franck@0: 'query' => 'order=' . urlencode($field) . '&sort=' . $initial . $query, franck@0: ); franck@0: $vars['header'][$field] = l($label . $image, $_GET['q'], $link_options); franck@0: } franck@0: } franck@0: franck@0: // Create a second variable so we can easily find what fields we have and what the franck@0: // CSS classes should be. franck@0: $vars['fields'][$field] = views_css_safe($field); franck@0: if ($active == $field) { franck@0: $vars['fields'][$field] .= ' active'; franck@0: } franck@0: franck@0: // Render each field into its appropriate column. franck@0: foreach ($result as $num => $row) { franck@0: if (!empty($fields[$field]) && empty($fields[$field]->options['exclude'])) { franck@0: $field_output = $fields[$field]->theme($row); franck@0: franck@0: // Don't bother with separators and stuff if the field does not show up. franck@0: if (!isset($field_output) && isset($vars['rows'][$num][$column])) { franck@0: continue; franck@0: } franck@0: franck@0: if ($hide_details) { franck@0: continue; franck@0: } franck@0: franck@0: // Place the field into the column, along with an optional separator. franck@0: if (isset($vars['rows'][$num][$column])) { franck@0: if (!empty($options['info'][$column]['separator'])) { franck@0: $vars['rows'][$num][$column] .= filter_xss_admin($options['info'][$column]['separator']); franck@0: } franck@0: } franck@0: else { franck@0: $vars['rows'][$num][$column] = ''; franck@0: } franck@0: franck@0: $vars['rows'][$num][$column] .= $field_output; franck@0: } franck@0: } franck@0: } franck@0: franck@0: // Add totals. franck@0: if($view->total_rows > $view->pager['items_per_page']) { franck@0: $process_available = array('sub_totals', 'totals'); franck@0: } franck@0: else{ franck@0: $process_available = array('totals'); franck@0: $vars['sub_totals'] = array(); //if don't set, error in template franck@0: } franck@0: foreach ($process_available as $process) { franck@0: $vars[$process] = array(); franck@0: $added_label = array(); franck@0: foreach ($columns as $field => $column) { franck@0: $field_alias = $fields[$field]->field_alias; franck@0: if ($field == $column && empty($fields[$field]->options['exclude'])) { franck@0: foreach ($$process as $num => $row) { franck@0: $type = ''; franck@0: foreach ($row as $item) { franck@0: if (in_array($item, array_keys(_views_calc_calc_options()))) { franck@0: $type = $item; franck@0: break; franck@0: } franck@0: } franck@0: if (!empty($row->$field_alias) || (isset($row->$field_alias) && $row->$field_alias === 0)) { franck@0: franck@0: // COUNT is always a numeric value, no matter what kind of field it is. franck@0: if ($type == 'COUNT') { franck@0: $vars[$process][$type][$column] = $row->$field_alias; franck@0: } franck@0: // Calculations other than COUNT should run the value through the field's theme. franck@0: // This will allow dates and numeric values to apply the right formatting to the result. franck@0: else { franck@0: $vars[$process][$type][$column] = $fields[$field]->theme($row); franck@0: } franck@0: } franck@0: elseif (!empty($type)) { franck@0: // Add the calc type label into the first empty column. franck@0: // Identify which is the sub total and which the grand total franck@0: // when both are provided. franck@0: if (empty($added_label[$type])) { franck@0: if ($process == 'sub_totals') { franck@0: $label = t("Page !Calculation", array("!Calculation" => $type)); franck@0: } franck@0: else { franck@0: $label = t("Total !Calculation", array("!Calculation" => $type)); franck@0: } franck@0: $vars[$process][$type][$column] = $label; franck@0: $added_label[$type] = TRUE; franck@0: } franck@0: else { franck@0: $vars[$process][$type][$column] = ''; franck@0: } franck@0: } franck@0: } franck@0: } franck@0: } franck@0: } franck@0: franck@0: $vars['class'] = 'views-table'; franck@0: if (!empty($options['sticky'])) { franck@0: drupal_add_js('misc/tableheader.js'); franck@0: $vars['class'] .= " sticky-enabled"; franck@0: } franck@0: franck@0: return; franck@0: franck@1: }