Home / Programmazione / PHP / Creazione grafici con Codeigniter e JpGraph
Mattepuffo

Creazione grafici con Codeigniter e JpGraph

Creazione grafici con Codeigniter e JpGraph

Ultimamente mi sono dato allo studio di Codeigniter, un framework per PHP, e devo dire che mi sto trovando bene.

Una problematica è stata quella di ceare grafici prendendo i dati da database.

Vediamo come fare.

Innanzitutto installate CI (codeigniter) e controllate che funzioni.

Dopo di che scaricate la libreria JpGraph e mettete tutti i files dentro libraries -> jpgraph.

Infine a livello di root del sito create una directory temp e dategli i permessi in scrittura; qua dentro verranno salvate temporaneamente le immagini.

Poi verifichiamo che in config -> autolad sia caricata la libreria database:

$autoload['libraries'] = array('database');

e che siano caricato l'helper url:

$autoload['helper'] = array('url', 'form');

Questa configurazione dovrebbe essere sufficiente.

Adesso passiamo al controller che chiamerò Report:

// report.php

<?php

class Report extends CI_Controller {

    function __construct() {
        parent::__construct();
        $this->load->library('jpgraph');
    }

    public function index() {
            $this->load->model('report_model');
            $data = array();
            $data['titolo'] = 'Report';
            $data['causali'] = $this->report_model->getCausali();

            $graphTempDirectory = 'temp';

            $gEntrate = $this->report_model->graphEntrate(); // DATI
            $legendsCausaliE = $this->report_model->legendsCausaliE(); // LEGGENDA
            $graphE = $this->jpgraph->chartEntrate($gEntrate, 'Enters graph', $legendsCausaliE); // CHART
            $graphEnterName = 'enter.png';
            $graphFileLocationE = $graphTempDirectory . '/' . $graphEnterName;
            $graphE->Stroke('./' . $graphFileLocationE);
            $data['graphe'] = $graphFileLocationE;

            $this->load->view('header', $data);
            $this->load->view('report_view', $data);
            $this->load->view('footer');
    }

}

Nel costruttore carichiamo la libreria jpgraph.

 

Sotto carichiamo il model e i dati provenienti dalle varie funzioni.

Ne abbiamo due: una per caricare la leggenda e una per caricare i dati.

Poi richiamiamo la funzione per caricare il grafico; la funzione la vedremo nel dettaglio più avanti.

A questo punto il model:

// report_model.php

<?php

class Report_model extends CI_Model {

    public function graphEntrate() {
        $this->db->select('causali.causale_nome AS Causali, SUM(entrata_valore) AS Valore');
        $this->db->from('entrate');
        $this->db->join('causali', 'entrate.causale_id = causali.causale_id');
        $this->db->group_by("Causali");
        $this->db->order_by('Valore', 'DESC');
        $this->db->limit(10);
        $query = $this->db->get();
        $arrResult = array();
        $count = 0;
        foreach ($query->result() as $var) {
            $arrResult[$count++] = $var->Valore;
        }
        return $arrResult;
    }

    public function legendsCausaliE() {
        $this->db->select('causali.causale_nome AS Causali, SUM(entrata_valore) AS Valore');
        $this->db->from('entrate');
        $this->db->join('causali', 'entrate.causale_id = causali.causale_id');
        $this->db->group_by("Causali");
        $this->db->order_by('Valore', 'DESC');
        $this->db->limit(10);
        $query = $this->db->get();
        $arrResult = array();
        $count = 0;
        foreach ($query->result() as $var) {
            $arrResult[$count++] = $var->Causali;
        }
        return $arrResult;
    }

}

Abbiamo le due funzioni per i dati e per la leggenda.

Come vedete eseguo la stessa query, solo che in un caso prendo i valori e nell'altro le causali; sarebbe da metterle insieme ma non sono riuscito per ora.

A questo punto la view:

// report_view.php

<img src="<?php echo $graphe;  ?>" />

Carica l'immagine con i dati provenienti dal controller.

Concludiamo con il file che interagisce con la libreria e che viene caricato nel controller; in libraries create un file jpgraph.php:

<?php

class Jpgraph {

    function chartEntrate($ydata, $title, $legends) {
        require_once "jpgraph/jpgraph.php";
        require_once "jpgraph/jpgraph_pie.php";
        require_once "jpgraph/jpgraph_pie3d.php";

        $graph = new PieGraph(440, 500, "auto");
        $graph->SetShadow();
        $graph->title->Set($title);
        $graph->title->SetFont(FF_FONT1, FS_BOLD);

        $plot = new PiePlot3D($ydata);
        $plot->SetLegends($legends);
        $graph->legend->SetPos(0, 0.1);
        $plot->SetSize(0.35);
        $plot->SetCenter(0.5);

        $graph->Add($plot);
        return $graph;
    }

}

La funzione chartEntrate è quella caricata nel controller, e come vedete accetta tre parametri.

In questo caso usiamo il tipo chart pi3d.

Diciamo che qua non c'è nulla di complicato.

I due faile più importanto sono il controller e il model.