195 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			195 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
abstract class ChartJS
 | 
						|
{
 | 
						|
	/**
 | 
						|
	* @var array chart data
 | 
						|
	*/
 | 
						|
	protected $_datasets = array();
 | 
						|
	/**
 | 
						|
	* @var array chart labels
 | 
						|
	*/
 | 
						|
	protected $_labels = array();
 | 
						|
	/**
 | 
						|
	* The chart type
 | 
						|
	* @var string
 | 
						|
	*/
 | 
						|
	protected $_type = '';
 | 
						|
	/**
 | 
						|
	* @var array Specific options for chart
 | 
						|
	*/
 | 
						|
	protected $_options = array();
 | 
						|
	/**
 | 
						|
	* @var string Chartjs canvas' ID
 | 
						|
	*/
 | 
						|
	protected $_id;
 | 
						|
	/**
 | 
						|
	* @var string Canvas width
 | 
						|
	*/
 | 
						|
	protected $_width;
 | 
						|
	/**
 | 
						|
	* @var string Canvas height
 | 
						|
	*/
 | 
						|
	protected $_height;
 | 
						|
	/**
 | 
						|
	* @var array Canvas attributes (class,
 | 
						|
	*/
 | 
						|
	protected $_attributes = array();
 | 
						|
	/**
 | 
						|
	* @var array Default colors
 | 
						|
	*/
 | 
						|
	protected static $_defaultColors = array('fill' => 'rgba(220,220,220,0.2)', 'stroke' => 'rgba(220,220,220,1)', 'point' => 'rgba(220,220,220,1)', 'pointStroke' => '#fff');
 | 
						|
	/**
 | 
						|
	* Add label(s)
 | 
						|
	* @param array $labels
 | 
						|
	* @param bool $reset
 | 
						|
	*/
 | 
						|
	public function addLabels(array $labels, $reset = false)
 | 
						|
	{
 | 
						|
		if ($reset) {
 | 
						|
			$this->_labels = array();
 | 
						|
		}
 | 
						|
		$this->_labels = $this->_labels + $labels;
 | 
						|
	}
 | 
						|
	/**
 | 
						|
	* Add dataset
 | 
						|
	* @param $dataset
 | 
						|
	* @param $reset
 | 
						|
	*/
 | 
						|
	public function addDataset($dataset, $reset)
 | 
						|
	{
 | 
						|
		if ($reset) {
 | 
						|
			$this->_datasets = array();
 | 
						|
		}
 | 
						|
		$this->_datasets += $dataset;
 | 
						|
	}
 | 
						|
	public function __construct($id = null, $width = '', $height = '', $otherAttributes = array())
 | 
						|
	{
 | 
						|
		if (!$id) {
 | 
						|
			$id = uniqid('chartjs_', true);
 | 
						|
		}
 | 
						|
		$this->_id = $id;
 | 
						|
		$this->_width = $width;
 | 
						|
		$this->_height = $height;
 | 
						|
		// Always save otherAttributes as array
 | 
						|
		if ($otherAttributes && !is_array($otherAttributes)) {
 | 
						|
			$otherAttributes = array($otherAttributes);
 | 
						|
		}
 | 
						|
		$this->_attributes = $otherAttributes;
 | 
						|
	}
 | 
						|
	/**
 | 
						|
	* This method allows to echo ChartJS object and directly renders canvas (instead of using ChartJS->render())
 | 
						|
	*/
 | 
						|
	public function __toString()
 | 
						|
	{
 | 
						|
		return $this->renderCanvas();
 | 
						|
	}
 | 
						|
	public function renderCanvas()
 | 
						|
	{
 | 
						|
		$data = $this->_renderData();
 | 
						|
		$options = $this->_renderOptions();
 | 
						|
		$height = $this->_renderHeight();
 | 
						|
		$width = $this->_renderWidth();
 | 
						|
		$attributes = $this->_renderAttributes();
 | 
						|
		$canvas = '<canvas id="' . $this->_id . '" data-chartjs="' . $this->_type . '"' . $height . $width . $attributes . $data . $options . '></canvas>';
 | 
						|
		return $canvas;
 | 
						|
	}
 | 
						|
	/**
 | 
						|
	* Prepare canvas' attributes
 | 
						|
	* @return string
 | 
						|
	*/
 | 
						|
	protected function _renderAttributes()
 | 
						|
	{
 | 
						|
		$attributes = '';
 | 
						|
		foreach ($this->_attributes as $attribute => $value) {
 | 
						|
			$attributes .= ' ' . $attribute . '="' . $value . '"';
 | 
						|
		}
 | 
						|
		return $attributes;
 | 
						|
	}
 | 
						|
	/**
 | 
						|
	* Prepare width attribute for canvas
 | 
						|
	* @return string
 | 
						|
	*/
 | 
						|
	protected function _renderWidth()
 | 
						|
	{
 | 
						|
		$width = '';
 | 
						|
		if ($this->_width) {
 | 
						|
			$width = ' width="' . $this->_width . '"';
 | 
						|
		}
 | 
						|
		return $width;
 | 
						|
	}
 | 
						|
	/**
 | 
						|
	* Prepare height attribute for canvas
 | 
						|
	* @return string
 | 
						|
	*/
 | 
						|
	protected function _renderHeight()
 | 
						|
	{
 | 
						|
		$height = '';
 | 
						|
		if ($this->_height) {
 | 
						|
			$height = ' height="' . $this->_height . '"';
 | 
						|
		}
 | 
						|
		return $height;
 | 
						|
	}
 | 
						|
	/**
 | 
						|
	* Render custom options for the chart
 | 
						|
	* @return string
 | 
						|
	*/
 | 
						|
	protected function _renderOptions()
 | 
						|
	{
 | 
						|
		if (empty($this->_options)) {
 | 
						|
			return '';
 | 
						|
		}
 | 
						|
		return ' data-options=\'' . json_encode($this->_options) . '\'';
 | 
						|
	}
 | 
						|
	/**
 | 
						|
	* Prepare data (labels and dataset) for the chart
 | 
						|
	* @return string
 | 
						|
	*/
 | 
						|
	protected function _renderData()
 | 
						|
	{
 | 
						|
		$array_data = array('labels' => array(), 'datasets' => array());
 | 
						|
		$i = 0;
 | 
						|
		foreach ($this->_datasets as $line) {
 | 
						|
			$this->_completeColors($line['options'], $i);
 | 
						|
			$array_data['datasets'][] = $line['options'] + array('data' => $line['data']);
 | 
						|
			$i++;
 | 
						|
		}
 | 
						|
		$array_data['labels'] = $this->_labels;
 | 
						|
		return ' data-data=\'' . json_encode($array_data) . '\'';
 | 
						|
	}
 | 
						|
	/**
 | 
						|
	* Set default colors
 | 
						|
	* @param array $defaultColors
 | 
						|
	*/
 | 
						|
	public static function setDefaultColors(array $defaultColors)
 | 
						|
	{
 | 
						|
		self::$_defaultColors = $defaultColors;
 | 
						|
	}
 | 
						|
	/**
 | 
						|
	* @param array $color
 | 
						|
	*/
 | 
						|
	public static function addDefaultColor(array $color)
 | 
						|
	{
 | 
						|
		if (!empty($color['fill']) && !empty($color['stroke']) && !empty($color['point']) && !empty($color['pointStroke'])) {
 | 
						|
			self::$_defaultColors[] = $color;
 | 
						|
		} else {
 | 
						|
			trigger_error('Color is missing to add this theme (need fill, stroke, point and pointStroke) : color not added', E_USER_WARNING);
 | 
						|
		}
 | 
						|
	}
 | 
						|
	protected function _completeColors(&$options, &$i)
 | 
						|
	{
 | 
						|
		if (empty(static::$_defaultColors[$i])) {
 | 
						|
			$i = 0;
 | 
						|
		}
 | 
						|
		$colors = static::$_defaultColors[$i];
 | 
						|
		foreach (static::$_colorsRequired as $name) {
 | 
						|
			if (empty($options[$name])) {
 | 
						|
				$shortName = str_replace('Color', '', $name);
 | 
						|
				if (empty($colors[$shortName])) {
 | 
						|
					$shortName = static::$_colorsReplacement[$shortName];
 | 
						|
				}
 | 
						|
				$options[$name] = $colors[$shortName];
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |