You are here

class flot_views_plugin_style in Flot 7

Same name and namespace in other branches
  1. 6 views/flot_views_plugin_style.inc \flot_views_plugin_style

Hierarchy

Expanded class hierarchy of flot_views_plugin_style

1 string reference to 'flot_views_plugin_style'
flot_views_views_plugins in flot_views/views/flot_views.views.inc
Implements hook_views_plugins().

File

flot_views/views/flot_views_plugin_style.inc, line 4

View source
class flot_views_plugin_style extends views_plugin_style {
  function option_definition() {
    $options = parent::option_definition();
    $options['type'] = array(
      'default' => 'line',
    );
    $options['size'] = array(
      'default' => '400x200',
    );
    $options['x'] = array(
      'default' => array(
        'granularity' => 'auto',
        'label' => 'default',
      ),
    );
    $options['y'] = array(
      'default' => array(
        'granularity' => 'auto',
        'label' => 'default',
        'pad' => 1,
      ),
    );
    return $options;
  }
  function options_form(&$form, &$form_state) {
    $form['type'] = array(
      '#type' => 'select',
      '#title' => t('Graph type'),
      '#options' => array(
        'line' => t('Line'),
        'bar' => t('Bar'),
        'point' => t('Point'),
        'pie' => t('Pie chart'),
      ),
      '#description' => t("Choose the type of chart you would like to display."),
      '#default_value' => $this->options['type'],
    );
    $form['size'] = array(
      '#type' => 'textfield',
      '#title' => t('Size'),
      '#description' => t("Enter the dimensions for the chart. Format: WIDTHxHEIGHT (e.g. 200x100)"),
      '#default_value' => $this->options['size'],
    );

    // Generate label fields
    $label_options = array(
      '' => '< ' . t('No labels') . ' >',
      'default' => t('Default (from data points)'),
    );

    // Generate granularity options
    $yaxis_granularity = $xaxis_granularity = array(
      'auto' => t('Auto generate'),
      'endpoints' => t('Endpoints only'),
    );
    for ($i = 3; $i < 10; $i++) {
      $yaxis_granularity[$i] = t('Granularity: !count ticks', array(
        '!count' => $i,
      ));
    }
    $form['x'] = array(
      '#tree' => TRUE,
      '#type' => 'fieldset',
      '#title' => t('X Axis'),
      '#collapsible' => TRUE,
      '#collapsed' => FALSE,
    );
    $form['x']['label'] = array(
      '#type' => 'select',
      '#options' => $label_options,
      '#title' => t('Labels'),
      '#default_value' => $this->options['x']['label'],
    );
    $form['x']['granularity'] = array(
      '#type' => 'select',
      '#options' => $xaxis_granularity,
      '#title' => t('Granularity'),
      '#default_value' => $this->options['x']['granularity'],
    );
    $form['y'] = array(
      '#tree' => TRUE,
      '#type' => 'fieldset',
      '#title' => t('Y Axis'),
      '#collapsible' => TRUE,
      '#collapsed' => FALSE,
    );
    $form['y']['label'] = array(
      '#type' => 'select',
      '#options' => $label_options,
      '#title' => t('Labels'),
      '#default_value' => $this->options['y']['label'],
    );
    $form['y']['granularity'] = array(
      '#type' => 'select',
      '#options' => $yaxis_granularity,
      '#title' => t('Granularity'),
      '#default_value' => $this->options['y']['granularity'],
    );
    $form['y']['pad'] = array(
      '#type' => 'checkbox',
      '#title' => t('Add headroom above points'),
      '#default_value' => $this->options['y']['pad'],
    );
  }

  /**
   * Theme template preprocessor.
   */
  function preprocess(&$vars) {

    // Get flot field, and bail if not present.
    $flot_field = $this
      ->get_flot_field();
    if (!$flot_field) {
      return;
    }
    $view = $this->view;
    $options = $this->options;

    // Parameters
    $type = !empty($options['type']) ? $options['type'] : 'line';
    $size = !empty($options['size']) ? explode('x', $options['size']) : array(
      '200',
      '100',
    );

    // DOM element options
    $element = array();
    $element['style'] = is_numeric($size[0]) ? "width:{$size[0]}px;" : "width:{$size[0]};";
    $element['style'] .= is_numeric($size[1]) ? "height:{$size[1]}px;" : "height:{$size[1]};";
    $vars['element'] = $element;
    $series = array();
    $range = array(
      'min' => NULL,
      'max' => NULL,
    );
    $ticks = array();

    // Iterate over results to build data and ticks
    foreach ($vars['rows'] as $id => $row) {
      $datapoint = $view->field[$flot_field]
        ->flot_render($row);
      $value = $datapoint['value'];
      $label = isset($datapoint['label']) ? $datapoint['label'] : $datapoint['value'];
      $series[] = array(
        $value[0],
        $value[1],
      );
      $ticks[] = array(
        $value[0],
        $label[0],
      );
      if (!isset($range['min']) || $value[1] < $range['min']) {
        $range['min'] = $value[1];
      }
      if (!isset($range['max']) || $value[1] > $range['max']) {
        $range['max'] = $value[1];
      }
    }
    $series = new flotData($series);
    $vars['data'] = array(
      $series,
    );

    // Set up the type class, set axes
    switch ($options['type']) {
      case 'point':
        $style = new flotStylePoint();
        break;
      case 'bar':
        $style = new flotStyleBar();
        break;
      case 'pie':
        $style = new flotStylePie();
        break;
      case 'line':
      default:
        $style = new flotStyleLine();
        break;
    }

    // Format Y Axis
    $granularity = 0;

    // If max is too small Flot barfs -- set a minimum value
    $range['max'] = $range['max'] < 5 ? 5 : $range['max'];

    // Pad Y axis if necessary
    if ($options['y']['pad']) {
      $range['min'] = 0;
      $range['max'] = floor($range['max'] + $range['max'] * 0.1);
    }
    switch ($options['y']['granularity']) {
      case 'endpoints':
        $yticks = array(
          array(
            $range['min'],
            $range['min'],
          ),
          array(
            $range['max'],
            $range['max'],
          ),
        );
        $style
          ->axis_ticks('yaxis', $yticks);
        break;
      case 'auto':
        $style
          ->axis_range('yaxis', $range);
        break;
      default:
        $style
          ->axis_range('yaxis', $range, $options['yaxis']);
        break;
    }

    // Format X Axis
    if ($options['x']['granularity'] == 'endpoints' && count($ticks) > 1) {
      $simplified_ticks = array();
      $simplified_ticks[] = array_shift($ticks);
      $simplified_ticks[] = array_pop($ticks);
      $ticks = $simplified_ticks;
    }
    $style
      ->axis_ticks('xaxis', $ticks);
    $vars['options'] = $style;
  }

  /**
   * Validate function.
   */
  function validate() {
    parent::validate();
    $field = $this
      ->get_flot_field();
    if (!$field) {
      return array(
        t('You must use a field that is compatible (e.g. <strong>Data point</strong>) with Flot to use the Flot style plugin.'),
      );
    }
  }

  /**
   * Get the first usable flot field on this view.
   */
  function get_flot_field() {
    $fields = $this->display->handler
      ->get_option('fields');
    foreach ($fields as $field => $info) {
      $handler = get_class(views_get_handler($info['table'], $info['field'], 'field'));
      if (method_exists($handler, 'flot_render')) {
        return $field;
      }
    }
    return FALSE;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
flot_views_plugin_style::get_flot_field function Get the first usable flot field on this view.
flot_views_plugin_style::options_form function Provide a form to edit options for this plugin. Overrides views_plugin_style::options_form
flot_views_plugin_style::option_definition function Information about options for all kinds of purposes will be held here. Overrides views_plugin_style::option_definition
flot_views_plugin_style::preprocess function Theme template preprocessor. 1
flot_views_plugin_style::validate function Validate function. Overrides views_plugin_style::validate
views_object::$definition public property Handler's definition.
views_object::$options public property Except for displays, options for the object will be held here. 1
views_object::altered_option_definition function Collect this handler's option definition and alter them, ready for use.
views_object::construct public function Views handlers use a special construct function. 4
views_object::export_option public function 1
views_object::export_options public function
views_object::export_option_always public function Always exports the option, regardless of the default value.
views_object::options Deprecated public function Set default options on this object. 1
views_object::set_default_options public function Set default options.
views_object::set_definition public function Let the handler know what its full definition is.
views_object::unpack_options public function Unpack options over our existing defaults, drilling down into arrays so that defaults don't get totally blown away.
views_object::unpack_translatable public function Unpack a single option definition.
views_object::unpack_translatables public function Unpacks each handler to store translatable texts.
views_object::_set_option_defaults public function
views_plugin::$display public property The current used views display.
views_plugin::$plugin_name public property The plugin name of this plugin, for example table or full.
views_plugin::$plugin_type public property The plugin type of this plugin, for example style or query.
views_plugin::$view public property The top object of a view. Overrides views_object::$view 1
views_plugin::additional_theme_functions public function Provide a list of additional theme functions for the theme info page.
views_plugin::options_submit public function Handle any special handling on the validate form. 9
views_plugin::plugin_title public function Return the human readable name of the display.
views_plugin::summary_title public function Returns the summary of the settings in the display. 8
views_plugin::theme_functions public function Provide a full list of possible theme templates used by this style.
views_plugin_style::$row_plugin public property The row plugin, if it's initialized and the style itself supports it.
views_plugin_style::$row_tokens public property Store all available tokens row rows.
views_plugin_style::build_sort public function Called by the view builder to see if this style handler wants to interfere with the sorts. If so it should build; if it returns any non-TRUE value, normal sorting will NOT be added to the query. 1
views_plugin_style::build_sort_post public function Called by the view builder to let the style build a second set of sorts that will come after any other sorts in the view. 1
views_plugin_style::destroy public function Destructor. Overrides views_object::destroy
views_plugin_style::even_empty public function Should the output of the style plugin be rendered even if it's empty. 1
views_plugin_style::get_field public function Get a rendered field.
views_plugin_style::get_field_value public function Get the raw field value.
views_plugin_style::get_row_class public function Return the token replaced row class for the specified row.
views_plugin_style::init public function Initialize a style plugin.
views_plugin_style::options_validate public function Validate the options form. Overrides views_plugin::options_validate
views_plugin_style::pre_render public function Allow the style to do stuff before each row is rendered.
views_plugin_style::query public function Add anything to the query that we might need to. Overrides views_plugin::query 2
views_plugin_style::render public function Render the display in this style. 5
views_plugin_style::render_fields public function Render all of the fields for a given style and store them on the object.
views_plugin_style::render_grouping public function Group records as needed for rendering.
views_plugin_style::render_grouping_sets public function Render the grouping sets.
views_plugin_style::tokenize_value public function Take a value and apply token replacement logic to it.
views_plugin_style::uses_fields public function Return TRUE if this style also uses fields.
views_plugin_style::uses_row_class public function Return TRUE if this style also uses a row plugin.
views_plugin_style::uses_row_plugin public function Return TRUE if this style also uses a row plugin.
views_plugin_style::uses_tokens public function Return TRUE if this style uses tokens.