192 lines
6.9 KiB
PHP
192 lines
6.9 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
*
|
||
|
* @version 1.0.5 October 6, 2015
|
||
|
* @author Llewellyn van der Merwe <https://www.vdm.io/> (forked - <https://code.google.com/p/php-class-for-google-chart-tools/>)
|
||
|
* @license GNU General Public License <http://www.gnu.org/copyleft/gpl.html>
|
||
|
*
|
||
|
**/
|
||
|
|
||
|
// No direct access.
|
||
|
defined('_JEXEC') or die;
|
||
|
|
||
|
class Chartbuilder
|
||
|
{
|
||
|
|
||
|
private static $_first = true;
|
||
|
public static $_count = 0;
|
||
|
|
||
|
private $_chartType;
|
||
|
|
||
|
private $_data;
|
||
|
private $_dataType;
|
||
|
private $_skipFirstRow;
|
||
|
|
||
|
/**
|
||
|
* sets the chart type and updates the chart counter
|
||
|
*/
|
||
|
public function __construct($chartType, $skipFirstRow = false){
|
||
|
$this->_chartType = $chartType;
|
||
|
$this->_skipFirstRow = $skipFirstRow;
|
||
|
self::$_count++;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* loads the dataset and converts it to the correct format
|
||
|
*/
|
||
|
public function load($data, $dataType = 'json'){
|
||
|
$this->_data = ($dataType != 'json') ? $this->dataToJson($data) : $data;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* load jsapi
|
||
|
*/
|
||
|
private function initChart(){
|
||
|
self::$_first = false;
|
||
|
|
||
|
$output = '';
|
||
|
// start a code block
|
||
|
/*$output .= '<script type="text/javascript" src="https://www.google.com/jsapi"></script>'."\n";*/
|
||
|
$output .= '<script type="text/javascript">google.load(\'visualization\', \'1.0\', {\'packages\':[\'corechart\']});</script>'."\n";
|
||
|
|
||
|
return $output;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* draws the chart
|
||
|
*/
|
||
|
|
||
|
public function draw($div, Array $options = array()){
|
||
|
$output = '';
|
||
|
|
||
|
if(self::$_first)$output .= $this->initChart();
|
||
|
|
||
|
// start a code block
|
||
|
$output .= '<script type="text/javascript">';
|
||
|
|
||
|
// set callback function
|
||
|
$output .= 'google.setOnLoadCallback(drawChart' . self::$_count . ');';
|
||
|
|
||
|
// create callback function
|
||
|
$output .= 'function drawChart' . self::$_count . '(){';
|
||
|
|
||
|
$output .= 'var data = new google.visualization.DataTable(' . $this->_data . ');';
|
||
|
|
||
|
// make chart resize
|
||
|
$output .= "var width = 0;
|
||
|
|
||
|
var graphHeight". self::$_count ." = 0;
|
||
|
var graphWidth". self::$_count ." = 0;
|
||
|
jQuery(window).ready(function() {
|
||
|
width = jQuery(window).width();
|
||
|
if (width < 1000){
|
||
|
sizeGraph". self::$_count ."(true,width);
|
||
|
} else if (width > 1000) {
|
||
|
sizeGraph". self::$_count ."(false);
|
||
|
}
|
||
|
";
|
||
|
|
||
|
|
||
|
// draw on tab change
|
||
|
if (isset($options['tabclickdraw']))
|
||
|
{
|
||
|
$output .= "jQuery('.".$options['tabclickdraw']."').on('click', function(){
|
||
|
width = jQuery(window).width();
|
||
|
if (width < 1000){
|
||
|
sizeGraph". self::$_count ."(true,width);
|
||
|
} else if (width > 1000) {
|
||
|
sizeGraph". self::$_count ."(false);
|
||
|
}
|
||
|
});";
|
||
|
unset($options['tabclickdraw']);
|
||
|
}
|
||
|
|
||
|
$output .= "
|
||
|
jQuery('.icon').on('click', function(){
|
||
|
width = jQuery(window).width();
|
||
|
if (width < 1000){
|
||
|
sizeGraph". self::$_count ."(true,width);
|
||
|
} else if (width > 1000) {
|
||
|
sizeGraph". self::$_count ."(false);
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
|
||
|
jQuery(window).resize(function () {
|
||
|
width = jQuery(window).width();
|
||
|
if (width < 1000){
|
||
|
sizeGraph". self::$_count ."(true,width);
|
||
|
} else if (width > 1000) {
|
||
|
sizeGraph". self::$_count ."(false);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
function sizeGraph". self::$_count ."(set, width) {
|
||
|
if(set){
|
||
|
var setTo = width/1200;
|
||
|
graphHeight". self::$_count ." = setTo*".$options['height'].";
|
||
|
graphWidth". self::$_count ." = setTo*".$options['width'].";
|
||
|
} else {
|
||
|
graphHeight". self::$_count ." = ".$options['height'].";
|
||
|
graphWidth". self::$_count ." = ".$options['width'].";
|
||
|
}
|
||
|
|
||
|
";
|
||
|
|
||
|
// set the options
|
||
|
$output .= 'var options = ' . json_encode($options) . '; options["height"]=graphHeight'. self::$_count .'; options["width"]=graphWidth'. self::$_count .';';
|
||
|
|
||
|
// create and draw the chart
|
||
|
$output .= 'var chart = new google.visualization.' . $this->_chartType . '(document.getElementById(\'' . $div . '\'));';
|
||
|
$output .= 'chart.draw(data, options);';
|
||
|
|
||
|
$output .= '}} </script>' . "\n";
|
||
|
return $output;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* substracts the column names from the first and second row in the dataset
|
||
|
*/
|
||
|
private function getColumns($data){
|
||
|
$cols = array();
|
||
|
foreach($data[0] as $key => $value){
|
||
|
if(is_numeric($key)){
|
||
|
if(is_string($data[1][$key])){
|
||
|
$cols[] = array('id' => '', 'label' => $value, 'type' => 'string');
|
||
|
} else {
|
||
|
$cols[] = array('id' => '', 'label' => $value, 'type' => 'number');
|
||
|
}
|
||
|
$this->_skipFirstRow = true;
|
||
|
} else {
|
||
|
if(is_string($value)){
|
||
|
$cols[] = array('id' => '', 'label' => $key, 'type' => 'string');
|
||
|
} else {
|
||
|
$cols[] = array('id' => '', 'label' => $key, 'type' => 'number');
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return $cols;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* convert array data to json
|
||
|
* info: https://code.google.com/intl/nl-NL/apis/chart/interactive/docs/datatables_dataviews.html#javascriptliteral
|
||
|
*/
|
||
|
private function dataToJson($data){
|
||
|
$cols = $this->getColumns($data);
|
||
|
|
||
|
$rows = array();
|
||
|
foreach($data as $key => $row){
|
||
|
if($key != 0 || !$this->_skipFirstRow){
|
||
|
$c = array();
|
||
|
foreach($row as $v){
|
||
|
$c[] = array('v' => $v);
|
||
|
}
|
||
|
$rows[] = array('c' => $c);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return json_encode(array('cols' => $cols, 'rows' => $rows));
|
||
|
}
|
||
|
|
||
|
}
|