Tableaux de vaccination à ce jour
Les choix du menu qui concernent les tableaux de vaccination à ce jour
sont tous traités selon le même principe :
- Vérifier si le fichier csv local qui contient le données à
afficher est à jour, l'actualiser si nécessaire.
- Récupérer la date dans le fichier csv local, la mettre au
format jj/mm/aaaa et l'afficher.
- Lire les autres lignes du fichier csv local, mettre en forme
si nécessaire l'information de la colonne 1, franciser les
pourcentages de vaccination et afficher les données récupérées
dans une table.
On va détailler le traitement pour le tableau général puis indiquer les
différences pour les autres choix du menu.
Tableau général de la vaccination à ce jour
Comme pour toutes les autres pages de ce site relatives aux statistiques
de vaccination, on utilise un modèle de fichier html.
Comme de script php qui génère cette page s'appelle
tabjour.php
le fichier html correspondant s'appelle
tabjour.html
Le contenu de sa partie
<body> est le suivant :
<body>
<div id="contenu">
<h1>Vaccination COVID 19 en France au XXXDATE</h1>
<br>
<table align="center" border="1" cellpadding="10">
<tr align="center">
<td>À partir de</td><td>Population</td>
<td>1<sup>ère</sup> dose</td><td>2<sup>ème</sup> dose</td>
<td>3<sup>ème</sup> dose</td><td>4<sup>ème</sup> dose</td>
<td>% dose 1</td><td>% dose 2</td>
<td>% dose 3</td><td>% dose 4</td>
</tr>
XXXTABLE
</table>
<br>
</div>
<div id="menu">
XXXMENU
</div>
</body>
ce qui, pour la partie droite de la fenêtre du navigateur donnerait sans
aucun traitement par un script PHP (mais des caractères 25 % plus
grands) :
Le travail du script php
tabjour.php va consister à :
- vérifier si le fichier local vacsi-totgen-fra.csv est
à jour, sinon l'actualiser
- récupérer la date indiquée dans ce fichier et la mettre au format
jj/mm/aaaa à la place du champ XXXDATE
- récupérer la suite du fichier csv local ligne par ligne et
générer la suite de la table à la place de la ligne
XXXTABLE (la suite de la table s'affichera alors en
dessous de la ligne d'entête
- générer le menu dans la colonne de gauche à la place de
XXXMENU mais ce point fera l'objet d'une explication
séparée.
Les scripts PHP qui génèrent les pages de ce site font appels à d'autres
scripts PHP parmi lesquels
constantes.php où sont définis les
sous répertoires du site :
define ('DIR_CSV', "ref-csv"); // répertoires où sont stockés les fichiers csv
define ('DIR_PAGES', "pages"); // répertoire des modèles de pages html
On commence par accéder au modèle de page HTML et à recopier le début
en remplaçant dans l'entête
noindex par
index .
Ainsi, les modèles de page HTML ne seront pas référencés par les moteurs
de recherche alors que les vrais pages du site le seront.
On continue de recopier le début du fichier HTML jusqu'à la ligne qui
indique le début du contenu de la partie principale de la page.
// modèle de page html
$ficpage = DIR_PAGES."/table-gen.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);
On remarque que l'appel de la fonction
copie_jusque_chaine (...)
possède un 3ème paramètre égal à 1. Ça a pour conséquence que la ligne
<div id="contenu">
du fichier HTML sera recopiée au lieu d'être sautée.
On vérifie alors si le fichier
vacsi-totgen-fra.csv est à
jour, mais comme il dépend du fichier
vacsi-tot-a-fra.csv on
vérifie et actualise si nécessaire ce premier fichier d'abord.
On peut alors accéder au fichier
vacsi-totgen-fra.csv
// vérifier si le fichier csv à utiliser est à jour
// l'actualiser si nécessaire
testmaj_tot_a_fra ();
testmaj_totgen_fra ();
// l'ouvrir en lecture
$ficcsv = DIR_CSV."/vacsi-totgen-fra.csv";
$descscv = fopen ($ficcsv, "r");
// si l'ouverture s'est bien passée
if ($descscv)
{
(...)
}
// sinon
else
{
(...)
}
Si tout s'est bien passé jusque là, on récupère la date qui figure en
première ligne du fichier csv local, on la met au format jj/mm/aaaa et
et on l'affiche au bon endroit dans la page HTML.
// lire la date mémorisée (format aaaa/mm/jj)
$datefic = trim (fgets ($descscv, 20));
// la retourner au format jj/mm/aaaa
$datefic = substr ($datefic, 8, 2)."/".substr ($datefic, 5, 2)."/".substr ($datefic, 0, 4);
// recopier le début de fichier html en mettant la date dans le titre
copmaj ($descfic, "XXXDATE", $datefic);
On recopie la suite du fichier HTML jusqu'à l'endroit où on doit remplir
la table.
// recopier le fichier html jusqu'au contenu de la table
copie_jusque_chaine ($descfic, "XXXTABLE");
La première ligne de la table concerne la vaccination tous âges
confondus. On va faire le même traitement pour toutes les lignes du
fichier
vacsi-totgen-fra.csv
// lire l'âge minimum de la première ligne du fichier csv local
$agemin = fgets ($descscv, 2);
// classes d'âge pour la première ligne
$cl_ages = "Tous âges";
// répéter
do
{
(....)
// lire l'âge minimum de la ligne suivante
$agemin = fgets ($descscv, 3);
// classes d'âge pour la ligne suivante
$cl_ages = $agemin." ans";
}
// jusque fin de fichier
while ($agemin);
Les autres champs de chaque ligne seront tous recopiés dans la table
dans l'ordre où ils apparaissent. Le traitement fait une fois dans
les fonctions
testmaj_... , plus précisément par la fonction
selchamps_jour (...) qu'elles appellent permet de disposer
de fichier csv locaux qu'on a très peu besoin de modifier pour générer
les tables et les bargraphes.
Cependant, on veut franciser l'affichage en mettant une virgule à la
place du point décimal pour les taux de vaccination qui seront suivis
d'un %
Ce traitement n'a pas été fait directement dans le fichier
vacsi-totgen-fra.csv car cela aurait compliqué son analyse
pour réaliser des bargraphes.
Le premier champ de la ligne étant déjà lu, on lit la suite de la ligne
et on cherche le premier point décimal.
À partir de cet endroit de la ligne, on remplace les points par des
virgules et on rajoute des % avant chaque passage au champ suivant et
après le dernier champ. Le début de la ligne reste inchangé.
// lire la suite de la ligne
$suite = trim (fgets ($descscv, LG_MAX_CSV));
// séparer les nombres de vaccination des taux
$pos_point = strpos ($suite, ".");
$debsuite = substr ($suite, 0, $pos_point);
$finsuite = substr ($suite, $pos_point);
// franciser les . décimaux
$finsuite = str_replace (".", ",", $finsuite);
// rajouter les pourcentages
$finsuite = str_replace (";", " %;", $finsuite)." %";
Il ne reste plus qu'à générer une ligne dans la table en remplaçant
les délimiteurs de champs des fichier csv ";" par les balises HTML de
changement de colonne.
// mettre en forme la suite de la ligne
$suite = str_replace (";", "</td><td>", $debsuite.$finsuite);
// générer une ligne dans la table
echo " <tr align=\"center\">\n";
echo " <td>".$cl_ages.$suite."</td>\n";
echo " </tr>\n";
Dans le cas (très improbable en phase d'exploitation du site) où on ne
pourrait pas accéder au fichier
vacsi-totgen-fra.csv on affiche
le titre de la page avec une date inconnue, suivi d'un message d'erreur
en rouge, et un saute l'écriture de la table.
// la date de mise à jour du fichier est inconnue
copmaj ($descfic, "XXXDATE", "??/??/??");
// message d'erreur
echo ' <font color = "#FF0000">';
echo "Fichier contenant les données inaccessible</font>\n";
// sauter la table
sauter_jusque_chaine ($descfic, "</table>");
Pour finir, dans tous les cas on termine le fichier HTML en rajoutant
le menu dans la partie gauche de la page. La fonction
genmenu
utilisée sera détaillée dans une page de documentation spécifique.
// 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);
Tableau de la vaccination par classe d'âge à ce jour
Pour remplir la table, le fichier csv local utilisé est
vacsi-tot-a-fra.csv
On vérifie si ce fichier est à jour, et si nécessaire, on l'actualise
grâce à un appel de la fonction
testmaj_tot_a_fra ()
Ensuite, le remplissage de la table est très proche de celui réalisé
pour l'état de la vaccination à ce jour à partir de certains âges.
Pour toutes les classes d'âge jusqu'à l'avant dernière, on va afficher
l'âge minimum et l'âge maximum de la classe d'âge concernée.
Pour ça, on utilise 2 variables
$agemin et
$agemax
$agemax est le premier champ de la ligne lue. Chaque classe
d'âge, sauf la dernière, est identifiées par un numéro représentant
l'âge maximum pour cette classe.
$agemin correspond à un an de plus que la valeur
$agemax
de la classe d'âge précédente. La première classe d'âge commence à
0.
Mais il y a le cas particulier de la classe d'âge notée
80 qui
signifie "à partir de 80 ans".
Dans la boucle qui traite les différentes lignes du fichier csv local,
on commence par lire une ligne complète avant de séparer le premier
champ (classe d'âge) du reste.
Les autres traitements, notamment la francisation des nombres décimaux
et le rajout de % pour les taux de vaccination s'effectuent comme pour
la table général décrite en détail plus haut.
On s'arrête après avoir traité la classe d'âge notée
80 . La
catégorie "tous âges confondus" présent à la fin du fichier csv est donc
ignorée.
// initialisation
$agemin = 0;
// répéter
do
{
// lire une ligne du fichier csv local
$ligne = trim (fgets ($descscv, LG_MAX_CSV));
// récupérer l'âge maximum sans 0 à gauche du chiffre
$agemax = (substr ($ligne, 0, 2) + 0);
// et la suite de la ligne
$suite = substr ($ligne, 2);
(....)
// générer la tranche d'âge
if ($agemin)
{
if ($agemin < 80)
$ages = "de ".$agemin." à ".$agemax." ans";
else
$ages = "à partir de ".$agemin." ans";
}
else
$ages = "jusqu'à ".$agemax." ans";
// générer une ligne dans la table
(....)
// pour la ligne suivante
$agemin = $agemax + 1;
}
// jusqu'à ce que toutes les classes d'âge soient traitées
while ($ligne && $agemax < 80);
Tableau de la vaccination par département à ce jour
Pour ce tableau, on utilise le fichier csv
vacsi-tot-dep.csv
qui est mis à jour si nécessaire par la fonction
testmaj_tot_dep ()
Il n'y a pas de traitement particulier à effectuer pour le code du
département (un numéro à 2 chiffres sauf dans le cas de la Corse) qui
est affiché tel quel.
On commence donc par lire une ligne complète du fichier csv avant de
faire le même traitement pour les taux de vaccination que pour les 2
tables précédente.
On s'arrête après avoir traité toutes les lignes du fichier
vacsi-tot-dep.csv
// lire la ligne du premier département
$ligne = trim (fgets ($descscv, LG_MAX_CSV));
// tant que non fin de fichier
while ($ligne)
{
(....)
// lire la ligne suivante du fichier csv local
$ligne = trim (fgets ($descscv, LG_MAX_CSV));
}
Tableau de la vaccination par région et par DOM à ce jour
Jusqu'au début décembre 2021, la même page web présentait à la fois
l'état de la vaccination à ce jour dans les régions de métropole et
dans les départements d'outre-mer.
Les données des départements d'outre-mer n'apparaissant plus ensuite
dans les fichiers de référence, des choix distincts ont été mis dans
le menu pour accéder séparément à l'état de la vaccination par région
et par DOM.
Pour le tableau de la vaccination par région, on utilise le fichier
csv
vacsi-tot-reg.csv qui est mis à jour si nécessaire par
la fonction
testmaj_tot_reg ()
Pour le tableau de la vaccination par DOM, on utilisé pendant 2 mois
les données enregistrées dans le fichier csv
vacsi-tot-dom.csv
pour le 30 novembre 2021. Puis en février 2022, les données pour les DOM
sont redevenues disponibles. La fonction
testmaj_tot_dom ()
permet de mettre à jour le fichier csv local.
À part le nom de fichier csv local utilisé et la fonction appelée pour
le mettre à jour, les fichiers PHP pour les tableaux de vaccination par
département (de métropole), région et DOM sont à présent identiques.