diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/theme.inc	Wed Aug 05 18:20:29 2009 +0200
@@ -0,0 +1,229 @@
+<?php
+// $Id: theme.inc,v 1.9 2009/04/23 18:32:48 karens Exp $
+
+/**
+ * @file theme.inc
+ *
+ * An array of preprocessors to fill variables for templates and helper
+ * functions to make theming easier.
+ */
+/**
+ * Theme the form for the table style plugin
+ */
+function theme_views_calc_ui_table($form) {
+  $output = drupal_render($form['description_markup']);
+
+  $header = array(
+    t('Field'),
+    t('Justification'),
+    t('Column calculations'),
+    t('Column'),
+    t('Separator'),
+    array(
+      'data' => t('Sortable'),
+      'align' => 'center',
+    ),
+    array(
+      'data' => t('Default sort'),
+      'align' => 'center',
+    ),
+  );
+  $rows = array();
+  foreach (element_children($form['columns']) as $id) {
+    $row = array();
+    $row[] = drupal_render($form['info'][$id]['name']);
+    $row[] = drupal_render($form['info'][$id]['justification']);
+    $row[] = drupal_render($form['info'][$id]['has_calc']) . drupal_render($form['info'][$id]['calc']);
+    $row[] = drupal_render($form['columns'][$id]);
+    $row[] = drupal_render($form['info'][$id]['separator']);
+    if (!empty($form['info'][$id]['sortable'])) {
+      $row[] = array(
+        'data' => drupal_render($form['info'][$id]['sortable']),
+        'align' => 'center',
+      );
+      $row[] = array(
+        'data' => drupal_render($form['default'][$id]),
+        'align' => 'center',
+      );
+    }
+    else {
+      $row[] = '';
+      $row[] = '';
+    }
+    $rows[] = $row;
+  }
+
+  // Add the special 'None' row.
+  $rows[] = array(t('None'), '', '', '', '', array('align' => 'center', 'data' => drupal_render($form['default'][-1])));
+
+  $output .= theme('table', $header, $rows);
+  $output .= drupal_render($form);
+  return $output;
+}
+
+
+/**
+ * Display a view as a table style.
+ */
+function template_preprocess_views_calc_table(&$vars) {
+  $view     = $vars['view'];
+  if (!empty($view->views_calc_calculation)) {
+    $vars['rows'] = array();
+    return;
+  }
+  
+  drupal_add_css(drupal_get_path('module', 'views_calc') .'/views_calc.css');
+  
+  // We need the raw data for this grouping, which is passed in as $vars['rows'].
+  // However, the template also needs to use for the rendered fields.  We
+  // therefore swap the raw data out to a new variable and reset $vars['rows']
+  // so that it can get rebuilt.
+  $result   = $vars['rows'];
+  $vars['rows'] = array();
+  $totals   = $view->totals;
+  $sub_totals = $view->sub_totals;
+    
+  $options  = $view->style_plugin->options;
+  $handler  = $view->style_plugin;
+  $vars['options'] = $options;
+  $hide_details = $options['detailed_values'];
+  
+  $fields   = &$view->field;
+  $columns  = $handler->sanitize_columns($options['columns'], $fields);
+
+  $active   = !empty($handler->active) ? $handler->active : '';
+  $order    = !empty($handler->order) ? $handler->order : 'asc';
+
+  $query    = tablesort_get_querystring();
+  if ($query) {
+    $query = '&' . $query;
+  }
+
+  foreach ($columns as $field => $column) {
+    // render the header labels
+    if ($field == $column && empty($fields[$field]->options['exclude'])) {
+      $label = check_plain(!empty($fields[$field]) ? $fields[$field]->label() : '');
+      if (empty($options['info'][$field]['sortable'])) {
+        $vars['header'][$field] = $label;
+      }
+      else {
+        // @todo -- make this a setting
+        $initial = 'asc';
+
+        if ($active == $field && $order == 'asc') {
+          $initial = 'desc';
+        }
+
+        $image = theme('tablesort_indicator', $initial);
+        $title = t('sort by @s', array('@s' => $label));
+        $link_options = array(
+          'html' => true,
+          'attributes' => array('title' => $title),
+          'query' => 'order=' . urlencode($field) . '&sort=' . $initial . $query,
+        );
+        $vars['header'][$field] = l($label . $image, $_GET['q'], $link_options);
+      }
+    }
+
+    // Create a second variable so we can easily find what fields we have and what the
+    // CSS classes should be.
+    $vars['fields'][$field] = views_css_safe($field);
+    if ($active == $field) {
+      $vars['fields'][$field] .= ' active';
+    }
+
+    // Render each field into its appropriate column.
+    foreach ($result as $num => $row) {
+      if (!empty($fields[$field]) && empty($fields[$field]->options['exclude'])) {
+        $field_output = $fields[$field]->theme($row);
+
+        // Don't bother with separators and stuff if the field does not show up.
+        if (!isset($field_output) && isset($vars['rows'][$num][$column])) {
+          continue;
+        }
+        
+        if ($hide_details) {
+          continue;
+        }
+
+        // Place the field into the column, along with an optional separator.
+        if (isset($vars['rows'][$num][$column])) {
+          if (!empty($options['info'][$column]['separator'])) {
+            $vars['rows'][$num][$column] .= filter_xss_admin($options['info'][$column]['separator']);
+          }
+        }
+        else {
+          $vars['rows'][$num][$column] = '';
+        }
+
+        $vars['rows'][$num][$column] .= $field_output;
+      }
+    }
+  }
+  
+  // Add totals.
+  if($view->total_rows > $view->pager['items_per_page']) {
+    $process_available = array('sub_totals', 'totals');  
+  }
+  else{
+    $process_available = array('totals');
+    $vars['sub_totals'] = array(); //if don't set, error in template
+  }
+  foreach ($process_available as $process) {
+    $vars[$process] = array();
+    $added_label = array();
+    foreach ($columns as $field => $column) {
+      $field_alias = $fields[$field]->field_alias;
+      if ($field == $column && empty($fields[$field]->options['exclude'])) {
+        foreach ($$process as $num => $row) {
+          $type = '';
+          foreach ($row as $item) {
+            if (in_array($item, array_keys(_views_calc_calc_options()))) {
+              $type = $item;
+              break;
+            }
+          }
+          if (!empty($row->$field_alias) || (isset($row->$field_alias) && $row->$field_alias === 0)) {
+    
+            // COUNT is always a numeric value, no matter what kind of field it is.
+            if ($type == 'COUNT') {
+              $vars[$process][$type][$column] =  $row->$field_alias;
+            }
+            // Calculations other than COUNT should run the value through the field's theme.
+            // This will allow dates and numeric values to apply the right formatting to the result.
+            else {
+              $vars[$process][$type][$column] =  $fields[$field]->theme($row);
+            }
+          }
+          elseif (!empty($type)) {
+            // Add the calc type label into the first empty column.
+            // Identify which is the sub total and which the grand total
+            // when both are provided.
+            if (empty($added_label[$type])) {
+              if ($process == 'sub_totals') {
+                $label = t("Page !Calculation", array("!Calculation" => $type));
+              }
+              else {
+                $label = t("Total !Calculation", array("!Calculation" => $type));
+              }
+              $vars[$process][$type][$column] = $label;
+              $added_label[$type] = TRUE;
+            }
+            else {
+              $vars[$process][$type][$column] = '';
+            }
+          }
+        }
+      }
+    }
+  }
+
+  $vars['class'] = 'views-table';
+  if (!empty($options['sticky'])) {
+    drupal_add_js('misc/tableheader.js');
+    $vars['class'] .= " sticky-enabled";
+  }
+  
+  return;
+     
+}
\ No newline at end of file