Bargraphes de plusieurs couleurs
Principe général
Les 4 séries de bargraphes du menu autres que celle décrite
précédemment :
- Général
- Par classe d'âge (2)
- Par région
- Par département d'outre-mer
sont générées selon le même principe.
Tout d'abord, comme pour la présentation des données sous forme de
tableaux, il est nécessaire de mettre à jour périodiquement le fichier
csv local à partir du fichier csv de référence. Pour cela, on fait
appel à la même fonction
testmaj-tot.... ()
Les données étant présentées sous la forme de bargraphes (qui sont des
images au format BMP), ces bargraphes devront être mis à jour chaque fois
que le fichier csv local qui a permit de les générer est actualisé.
Ce tableau indique pour chaque série de bargraphes quels fichiers sont
utilisés.
Critère de tri | Fichier csv local |
Fonction de mise à jour | Nom des bargraphes |
Général |
vacsi-totgen-fra.csv |
testmaj_totgen_fra () |
barre-gen-??.bmp |
Par classe d'âge |
vacsi-tot-a-fra.csv |
testmaj_tot_a_fra () |
barre-age-??.bmp |
Par région |
vacsi-tot-reg.csv |
testmaj_tot_reg () |
barre-reg-???.bmp |
Par DOM |
vacsi-tot-dom.csv |
Voir explication |
barre-dom-???.bmp |
Comme dans le cas de la présentation des données sous forme de tables,
le fichier
vacsi-totgen-fra.csv utilise le fichier csv local
vacsi-tot-a-fra.csv pour être réactualisé. En conséquence,
la fonction
testmaj_tot_a_fra () est appelée avant
testmaj_totgen_fra () .
Si ces données redeviennent disponibles, une fonction
testmaj_tot_dom () sera rajoutée.
Chaque page web affichant plusieurs bargraphes, il faut plusieurs
images bmp dont chacune a un nom différent. C'est au niveau des ? que
diffèrent les noms des différents bargraphes d'une catégorie.
À la place de ces ? on trouve :
- Pour les bargraphes généraux et pour ceux par classe d'âge,
un nombre à 2 chiffres qui correspond au premier champ de
la ligne du fichier csv local;
- Pour les bargraphes par région, les 3 premières lettres
du nom de la région en minuscules;
- Pour les bargraphes par département d'outre-mer, également
un code de 3 lettres minuscules.
Les différents bargraphes dont on aura besoin sont générés par un
programme C appelé depuis le script php.
Le modèle de fichier html
Pour les 4 séries de bargraphes, le modèle de page html utilisé est
similaire.
Voici le partie <body> de celui qui permet d'afficher les
bargraphes par région.
<body>
<div id="contenu" align="center">
<h1>Vaccination COVID 19 en France<br>
par région au XXXDATE</h1>
XXXLISTE
<br>
</div>
<div id="menu">
XXXMENU
</div>
</body>
On peut remarquer que le contenu de la partie droite de la page web
est centré.
<div id="contenu" align="center">
Comme les bargraphes ont tous la même largeur, il n'est pas nécessaire
de recourir à une table pour les aligner d'un coté, comme c'est le cas
pour les bargraphes "Par classe d'âge (1)".
Le script PHP va devoir mettre la date de l'état de vaccination à la
place de
XXXDATE puis générer une série de bargraphes à la
place de la ligne contenant
XXXLISTE .
Le script php qui génère la page
Le début du traitement effectué par ce script est le même que pour
l'affichage des données sous la forme d'une table.
- on sélectionne le modèle de page html;
- on recopie l'entête de ce fichier en remplaçant noindex
par index;
- on continue de recopier le modèle de fichier HTML jusqu'à
l'endroit où sera le contenu de la partie droite de la page.
- on vérifie si le fichier csv local dont on a besoin est à jour
et si nécessaire, on l'actualise.
Dans le cas du script qui affiche les bargraphes relatifs à la
vaccination par région, on commence par le code suivant :
// modèle de page html
$ficpage = DIR_PAGES."/bargraphe-reg.html";
// ouvrir le fichier contenant la page à afficher
$descfic = fopen ($ficpage, "r");
// si l'ouverture s'est bien passée
if ($descfic)
{
// recopier le début de l'entête html en remplaçant noindex par index
copmaj ($descfic, "noindex,", "index,");
// recopier le début du fichier html jusqu'à la zone contenu
copie_jusque_chaine ($descfic, "contenu", 1);
// vérifier si le fichier csv à utiliser est à jour
// l'actualiser si nécessaire
testmaj_tot_reg ();
Si le fichier csv local a été mis à jour, il faut le faire aussi pour
tous les bargraphes. Pour cela, on compare la date de mise à jour de
l'un des bargraphes concernés (dans l'exemple ci dessous, le bargraphe
pour la région Occitanie) avec celle du fichier csv local.
Si le fichier csv local est plus récent, on utilise la commande
exec du PHP pour lancer l'exécution du programme C
gen-serie-bargraphes auquel on passe comme paramètre le nom
du fichier csv local et le début du nom des images bmp à générer.
Si l'exécution du programme C se passe mal, un affichage d'erreur est
prévu.
// chemin d'accès au fichier csv
$ficcsv = DIR_CSV."/vacsi-tot-reg.csv";
// si les bargraphes sont trop anciens (ou inexistants)
if (filemtime (DIR_IMAGES."/barre-reg-occ.bmp") < filemtime ($ficcsv))
// les construire ou les actualiser
exec ("bin/gen-serie-bargraphes ".$ficcsv." barre-reg 2>&1", $erreur);
// si erreur pour fabriquer les images
if (count ($erreur))
// l'afficher
echo ' <font color = "#FF0000">'.$erreur [0]."</font><br>\n";
Ensuite, on accède au fichier csv local, on récupère la date dans sa
première ligne, on la met au format jj/mm/aaaa, on l'affiche au bon
endroit et on recopie la suite du fichier HTML jusqu'à la ligne où
on rajoutera les différents bargraphes.
// ouvrir en lecture le fichier csv
$descscv = fopen ($ficcsv, "r");
// si l'ouverture s'est bien passée
if ($descscv)
{
// lire la date mémorisée (format aaaa/mm/jj)
$datefic = trim (fgets ($descscv, 20));
// mettre la date au format jj/mm/aaaa
$datefic = substr ($datefic, 8, 2)."/".substr ($datefic, 5, 2)."/".substr ($datefic, 0, 4);
// recopier le début du fichier html en mettant la date dans le titre
copmaj ($descfic, "XXXDATE", $datefic);
// recopier le fichier html jusqu'à la liste
copie_jusque_chaine ($descfic, "XXXLISTE");
On est prêt pour traiter les lignes du fichier csv local qui suivent.
Comme on le fait pour générer les bargraphes similaires au site officiel,
on commence par lire la première ligne du fichier csv et en extraire le
nombre de doses de vaccin :
// lire la ligne de la première région
$ligne = trim (fgets ($descscv, LG_MAX_CSV));
// trouver le nombre de doses mémorisées
$args = explode (";", $ligne, 20);
$nb_doses = (count ($args) - 2) / 2;
Puis pour chacune des lignes du fichier csv local, on va :
- afficher le titre du bargraphe,
- afficher les taux de vaccination pour chaque dose,
- calculer et afficher le taux de non vaccinés.
Pour le titre du bargraphe, dans le cas des régions ou des DOM, c'est
directement le champ 0 de la ligne lue. Dans le cas des bargraphes par
classe d'âge ou à partir d'un certain âge, il y a une petite transformation
à faire qui similaire à celle réalisée pour la colonne 1 des tableaux
(voir 2 lignes plus haut dans le menu de gauche).
Pour les taux de vaccination, on remplacera les points décimaux par des
virgules et on ajoutera
% après la valeur numérique.
// tant que non fin de fichier
while ($ligne)
{
// récupérer les différents champs de la ligne
$args = explode (";", $ligne, 20);
echo " <h2>".$args [0]."</h2>\n ";
// pour chaque dose de vaccin
for ($dose = 1; $dose <= $nb_doses; $dose++)
{
// mettre en forme le taux de vaccination
$taux = str_replace (".", ",", $args [$nb_doses + 1 + $dose])." %";
// l'afficher
echo "Dose ".$dose." : ".$taux." ";
}
// calculer le taux de non vaccinés
$nonvacc = str_replace (".", ",", 100 - $args [$nb_doses + 2]);
// l'afficher aussi
echo "Non vacciné : ".$nonvacc." %<br><br>\n";
Il ne reste plus qu'à afficher le bon bargraphe. Le cas des bargraphes
généraux et des bargraphes par classe d'âge est le plus simple :
le champ $args [0] contient directement le code de 2 chiffres
qui apparaît dans le nom de l'image bmp à afficher.
Pour les bargraphes par région, la partie variable de leur nom est
constituée pas les 3 premières lettres du nom de la région écrites
en minuscules :
// récupérer le code de la région utilisé pour le fichier bmp
$code = substr (strtolower ($args [0]), 0, 3);
C'est pour les DOM que c'est le plus compliqué.
- si le nom du DOM commence par "Saint" (en abrégé "ST") le code
utilisé pour le bargraphe est la lettre "s" suivie des 2 premiers
caractère du 2ème mot écrits en minuscules.
- dans les autres cas, comme pour les régions, on prend les 3
premiers caractères du nom, qu'on met en minuscules, mais si
on y trouve un "é" (Réunion), il perd son accent.
// récupération du code du DOM utilisé pour le fichier bmp
$regdom = strtolower ($args [0]);
// si le nom commence par "st"
if (substr ($regdom, 0, 2) == "st")
// on prend les caractères 1, 4 et 5 du nom
$code = substr ($regdom, 0, 1).substr ($regdom, 3, 2);
// sinon
else
// on prend les 3 premiers caractères en remplaçant les é par e
$code = substr (str_replace ("é", "e", $regdom), 0, 3);
On est en mesure d'afficher le bargraphe. Le code qui suit est celui
pour les bargraphes concernant une région.
// afficher le bargraphe en 5 couleurs
echo ' <img src="'.DIR_IMAGES."/barre-reg-".$code.".bmp\"><br>\n";
On peut passer à la ligne suivante du fichier csv local et recommencer le
même traitement jusqu'à ce que ce fichier ait été traité en entier.
Il ne reste plus alors qu'à terminer le fichier HTML en rajoutant le
menu qui doit apparaître du coté gauche. Ce traitement est réalisé à
l'identique pour toutes les pages du site qui donnent des statistiques
de vaccination.
// copie la suite du fichier html jusqu'à la section du menu
copie_jusque_chaine ($descfic, "XXXMENU");
// générer le menu
genmenu ("menu-vaccin", basename ($_SERVER ['SCRIPT_NAME']));
// copier la fin de la page html
copie_jusque_fin ($descfic);
// terminé avec le fichier html
fclose ($descfic);
Le programme C pour générer les bargraphes
Ce point est détaillé
ici.