| 
<?php
 namespace JLaso\SimpleStats\Graph;
 
 use JLaso\SimpleStats\Model\DB;
 use JLaso\SimpleStats\StatsBase;
 
 abstract class BaseGraph implements GraphInterface
 {
 protected static $instance;
 /** @var StatsBase  */
 protected $statsBase;
 /** @var  DB */
 protected $db;
 /** @var  array */
 protected $sourceEvents;
 
 /**
 * Stats constructor.
 */
 public function __construct()
 {
 $this->statsBase = new StatsBase();
 $this->db = new DB($this->statsBase->getConn());
 }
 
 /**
 * @return BaseGraph
 */
 public static function getInstance()
 {
 $className = get_called_class();
 if (!self::$instance) {
 self::$instance = new $className;
 }
 
 return self::$instance;
 }
 
 public function draw($title, $sourceEvent, $range, $width, $heigth, $destFile = null)
 {
 $this->sourceEvents = explode(',', $sourceEvent);
 $data = array();
 
 foreach($this->sourceEvents as $event) {
 if (!$model = $this->statsBase->getModel($event)) {
 throw new \Exception("Event {$event} does not have a model associated !");
 }
 $data[$event] = $this->db->fetchDataInRange($model, $range);
 }
 
 $values = $this->genValues($data);
 
 $settings = $this->getSettings(array(
 'graph_title' => $title,
 ));
 $this->renderGraph($this->getGraphType(), $width, $heigth, $settings, array_values($values), $destFile);
 }
 
 
 protected function renderGraph($graphType, $width, $height, $settings, $values, $destFile = null)
 {
 $graph = new \SVGGraph($width, $height, $settings);
 $graph->Values($values);
 
 if($destFile) {
 ob_start();
 }
 
 $graph->Render($graphType, false, false);
 
 if ($destFile){
 file_put_contents($destFile, ob_get_clean());
 }
 }
 
 abstract protected function genValues($data);
 
 }
 |