HTML5 / CSS 2.x/3 / PHP / MySQL ...

Recupérer les données pour JavaScript

Pré-requis

Nous supposons que vous utilisez Zend Framework. Donc, nous n'aborderons pas les détails de la connexion à votre base de données.

Si vous n'utilisez pas Zend Framework, les scripts décrits ci-après sont néanmoins facilement adaptables à votre configuration.

La base de données

Pour notre exemple, nous avons une base de données et une table intitulée frequentation. Cette table enregistre l'accès à chaque rubrique d'un site web, ce pour analyser la popularité de ces rubriques.

CREATE TABLE IF NOT EXISTS `frequentation` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nom_script` varchar(64) NOT NULL DEFAULT '',
  `intervalle` varchar(14) DEFAULT NULL,
  `visites` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id_frequentation`),
  UNIQUE KEY `nom_script` (`nom_site`,`nom_script`,`intervalle`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Dans cette table, nous avons quatre champs:

On a dans le site un script qui enregistre l'accès à chaque rubrique. Par exemple, si un visiteur souhaite voir les annonces, il clique sur annonces. Le script cherche une fiche avec nom-scipt='annonces' et avec l'intervalle correspondant à la date souhaitée DATE("Y-m-d") par exemple pour la date du jour:

Donc, si tout fonctionne bien, on se retrouve au bout d'un certain temps avec un historique des rubriques avec un enregistrement par jour et par site.

Voici donc une requête type sur cette table pour récupérer un état statistique:

SELECT sum(visites) AS nb, nom_site
FROM frequentation
GROUP BY nom_site
ORDER BY nb DESC

On rajoutera une clause WHERE.... si nécessaire pour borner l'intervalle de temps à analyser.

Pour notre exemple, nous allons nous contenter d'un résultat global.

Notre modèle d'accès aux données

Avec Zend Framework, tout est objet.

Pour accéder aux données de notre table frequentation, on définit une nouvelle classe qui contiendra cette méthode:

    /**
     * renvoie les stats de visites d'un site web
     * @return array
     */
    public function getStatsVisitesSites() {
        $sql = "SELECT sum(visites) AS nb, nom_site "
        . "FROM `frequentation` "
        . "GROUP BY nom_site "
        . "ORDER BY nb DESC";
        return $this->_db->query($sql)->fetchAll();
    }    

Si vous n'utilisez pas Zend Framework, à vous d'adapter cette ligne de code:

        return $this->_db->query($sql)->fetchAll();

Exemple de résultat obtenu avec cette requête visualisée à l'aide de la fonction var_dump();

array (size=4)
  0 => 
    array (size=2)
      'nb' => string '17701' (length=5)
      'nom_rubrique' => string 'annonces' (length=8)
  1 => 
    array (size=2)
      'nb' => string '6936' (length=4)
      'nom_rubrique' => string 'forum' (length=5)
  2 => 
    array (size=2)
      'nb' => string '6482' (length=4)
      'nom_rubrique' => string 'agenda' (length=6)
  3 => 
    array (size=2)
      'nb' => string '5726' (length=4)
      'nom_rubrique' => string 'articles' (length=8)

Une classe RGraph pour adapter les données

Il nous faut maintenant adapter ces données pour que RGraph qui est une librairie JavaScript puisse les traiter correctement.

C'est donc un script PHP qui va faire ce travail. Pour celà, nous créons une nouvelle classe Rgraph dans le répertoire application/models:

<?php
class Application_Model_Rgraph
{
    /**
     * Extraction données d'un champ et mise en forme pour RGraph
     * @param array  $result   tableau données issues de SQL
     * @param string $field    nom du champ dont les données sont à extraire
     * @return string
     */
    public function getValuesForGraph($result, $field) {
        $outArray = array();
        foreach($result AS $row) {
            $outArray[] = $row[$field];
        }
        return '['.implode(',', $outArray).']';
    }
 
    /**
     * Extraction données d'un champ et mise en forme pour labels RGraph
     * @param array  $result   tableau données issues de SQL
     * @param string $field    nom du champ dont les données sont à extraire
     * @return string
     */
    public function getLabelsForGraph($result, $field) {
        $outArray = array();
        foreach($result AS $row) {
            $outArray[] = $row[$field];
        }
        return "['".implode("','", $outArray)."']";
    }
 
}

Les deux méthodes sont quasiment semblables. la première, getValuesForGraph va extraire les valeurs numériques du tableau et les mettre en forme:

// on récupère les données de fréquentation
$Frequentation = new Application_Model_Frequentation();
$resultat = $Frequentation->getStatsVisiteRubriques();
 
$Rgraph = new Application_Model_Rgraph();
$values = $Rgraph->getValuesForGraph($resultat, 'nb');

La variable $values va contenir ceci:

string '[17701,6936,6482,5726]' (length=22)

la seconde méthode getLabelsForGraph va récupérer les labels:

$labels = $Rgraph->getLabelsForGraph($resultat, 'nom_rubrique');

La variable $labels va contenir ceci:

string '['annonces','forum','agenda','articles']' (length=41)

Intégration au contrôleur

Voici un exemple de contrôleur minimal que l'on va nommer frequentationGlobaleAction:

    public function frequentationGlobaleAction() {
        // on récupère les données de fréquentation
        $Frequentation = new Application_Model_Frequentation();
        $resultat = $Frequentation->getStatsVisiteRubriques();
        // envoi des données mises en forme vers la vue
        $Rgraph = new Application_Model_Rgraph();
        $this->view->rgraphValues = $Rgraph->getValuesForGraph($resultat, 'nb');
        $this->view->rgraphLabels = $Rgraph->getLabelsForGraph($resultat, 'nom_rubrique');
    }

On envoie deux données vers la vue: rgraphValues qui est la chaîne contenant les valeurs du graphe, rgraphLabels qui est la chaîne contenant les labels du graphe. Ces deux chaînes sont exploitables sans autre traitement au sein de la vue frequentation-globale

Intégration à la vue

On crée maintenant dans le répertoire views/scripts et sous-répertoire adéquat notre vue frequentation-globale.phtml

<canvas id="myCanvas" width="500" height="250">[No canvas support]</canvas>
 
<script>
    window.onload = function ()
    {
        var data = <?php echo $this->rgraphValues; ?>;
 
        var bar = new RGraph.Bar('myCanvas', data)
            .Set('labels', <?php echo $this->rgraphLabels; ?>)
            .Set('colors', ['red'])
            .Set('gutter.left',50)
            .Draw();
    }
</script>

Résultat:

notre premier graphe interfacé à la base de données

Maintenant que nous savons faire la jonction entre RGraph et notre base de données, voyons comment faire des graphes en camembert

Tous les articles sur ce thème