2,
'path' => drupal_get_path('module', 'flot') .'/views',
);
}
/**
* Implementation of hook_theme.
*/
function flot_theme() {
return array(
'flot_graph' => array(
'arguments' => array('element' => array(), 'data' => array(), 'options' => array()),
),
);
}
/**
* Main flot graphing function
*
* @param $element
* An associative array to define a placeholder element. If an 'id' is
* omitted one will be generated, If no 'style' is specified and width and
* height style will be added. In short you can just pass an empty array and
* everything will still work. This argument is essentially optional and has
* been kept as the first argument to remain consistant with flots own api.
* @param $data
* The data series for the graph. Optional. See flot's API.txt for more
* details. This module defines the flotData class which can be used or
* extended to make generating data objects simpler.
* @param $options
* Options to pass to flot. Optional. See flot's API.txt for more details.
* @param $loader
* Allows alterative loading of flot data. If 'false' data will passed
* directly to an invocation of $.plot(). Otherwise the contents of $loader
* should be js.
*
* @return
* The placeholder element
*/
function theme_flot_graph($element, $data = array(), $options = array(), $loader = false) {
static $n;
if (!isset($element['id'])) {
$n++;
$element['id'] = 'flot-auto-identifier-'. $n;
}
if (!isset($element['style'])) {
$element['style'] = "width:100%;height:200px";
}
flot_add_js();
if (count($data)) {
$extra = '';
$id = str_replace('-', '_', $element['id']);
if ($loader) {
$json_data = function_exists('json_encode') ? json_encode($data) : drupal_to_js($data);
$extra = "Drupal.flot.{$id}_data = {$json_data}; {$loader}";
$data = array();
}
$json_data = function_exists('json_encode') ? json_encode($data) : drupal_to_js($data);
$json_options = function_exists('json_encode') ? json_encode($options) : drupal_to_js($options);
$data = "if (Drupal.jsEnabled) {
$(document).ready(function() {
Drupal.flot.{$id} = $.plot($('#{$element['id']}'), {$json_data}, {$json_options});
{$extra}
});
}";
drupal_add_js($data, 'inline');
}
return '
';
}
/**
* Helper to add flot's js
*/
function flot_add_js() {
static $added;
if ($added !== true) {
if (module_exists('libraries') && libraries_get_path('flot')) {
$path = libraries_get_path('flot');
}
if (!isset($path)) {
$path = drupal_get_path('module', 'flot') .'/flot';
}
// Different versions of flot have used different packing methods. Attempt to support both.
$excanvas = file_exists("{$path}/excanvas.min.js") ? "{$path}/excanvas.min.js" : "{$path}/excanvas.pack.js";
drupal_set_html_head('');
drupal_add_js($path . '/jquery.flot.js');
drupal_add_js('if (Drupal.jsEnabled) { Drupal.flot = {}; }', 'inline');
$added = true;
}
}
/**
* Data class for the flot API.
*
* Make some nested objects to keep things simple when creating a data series.
*/
class flotData {
public $data;
public $lines;
public $bars;
public $points;
function __construct($data) {
$this->data = $data;
$this->lines = new stdClass();
$this->bars = new stdClass();
$this->points = new stdClass();
$this->grid = new StdClass();
}
}
/**
* Style class for the flot API.
*
* Provides some sensible defaults and helper methods for managing axes.
*/
class flotStyle {
public $colors;
public $grid;
public $lines;
public $bars;
public $points;
function __construct() {
$this->lines = new StdClass();
$this->bars = new StdClass();
$this->points = new StdClass();
$this->lines->show = FALSE;
$this->bars->show = FALSE;
$this->points->show = FALSE;
$this->colors = array('#666', '#999', '#ccc');
$this->shadowSize = 0;
$this->grid = new StdClass();
$this->grid->labelMargin = 0;
$this->grid->tickColor = '#eee';
$this->grid->backgroundColor = '#f8f8f8';
$this->grid->borderWidth = 0;
$this->grid->hoverable = true;
$this->grid->autoHighlight = true;
$this->grid->clickable = false;
}
function axis_ticks($axis = 'yaxis', $ticks = array()) {
if (count($ticks)) {
$this->{$axis} = new StdClass();
$this->{$axis}->ticks = $ticks;
}
}
function axis_range($axis = 'yaxis', $range = array(), $granularity = 0) {
if (count($range)) {
$this->{$axis} = new StdClass();
$this->{$axis}->min = min($range);
$this->{$axis}->max = max($range);
if (is_numeric($granularity) && $granularity != 0) {
$tickSize = ($this->{$axis}->max - $this->{$axis}->min) / $granularity;
$this->{$axis}->tickSize = floor($tickSize);
}
}
}
}
/**
* Basic line style class for the flot.
*/
class flotStyleLine extends flotStyle {
function __construct() {
parent::__construct();
$this->lines->show = TRUE;
$this->lines->lineWidth = 1;
$this->lines->fill = .1;
}
}
/**
* Basic bar style class for the flot.
*/
class flotStyleBar extends flotStyle {
function __construct() {
parent::__construct();
$this->bars->show = TRUE;
$this->bars->lineWidth = 0;
$this->bars->fill = .5;
}
}
/**
* Points style class for the flot.
*/
class flotStylePoint extends flotStyle {
function __construct() {
parent::__construct();
$this->points->show = TRUE;
$this->points->lineWidth = 1;
$this->points->fill = .1;
}
}