<html>
<head>
<title>Phpcovid : Génération du menu de gauche</title>
<meta name=author content="Bernard Chardonneau">
<meta name=copyleft content="Logiciel et données publiés dans le domaine public">
<meta name=robots content="noindex,follow">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="css/misenpage.css" rel="stylesheet" type="text/css">
<link href="css/styles.css" rel="stylesheet" type="text/css">
</head>
<body>
<div id="contenu">
<h1>Génération du menu de gauche</h1>
Après avoir décrit comment est généré de contenu de la partie droite des
différentes pages de ce site web, il reste à nous intéresser au menu qui
permet de sélectionner l'une de ces pages et apparaît du coté gauche.<br>
<br>
Au niveau du code HTML, il y a de grosses différences entre la partie
rédactionnelle d'une page et son menu.<br>
<ul>
<li>Si la partie rédactionnelle contient essentiellement du texte
(comme c'est le cas de ces pages de documentation), la quantité
de balises HTML qu'elle contient pourra rester modérée.<br>
<br>
Il faudra des balises HTML pour :<br>
<br>
<ul>
<li>demander des passages à la ligne,</li>
<li>insérer des images,</li>
<li>insérer des liens hypertexte,</li>
<li>changer temporairement l'apparence des caractères,</li>
<li>présenter des données sous forme de tableaux.</li>
</ul>
<br>
Mais lorsque le code HTML est écrit proprement (sans les
redondances inutiles introduite par certains générateurs de
code HTML), la quantité de balises HTML reste faible à modérée
par rapport au reste du contenu.</li>
<br>
<li>Au contraire, le menu d'un site est composé essentiellement ou
exclusivement de balises HTML qui correspondent à des liens
hypertextes vers le différentes pages du site.</li>
</ul>
D'autre part :<br>
<ul>
<li>Le contenu de la partie rédactionnelle de la page varie beaucoup
d'une page à l'autre.</li>
<br>
<li>Le menu reste le même pour toutes les pages du site, ou en tout
cas pour toutes les pages concernées par le même menu, lorsque
le site en contient plusieurs.</li>
</ul>
Une première démarche évidente consiste à écrire ce menu une seule fois
dans un fichier séparé et à l'utiliser pour toutes les pages du site
concernées par ce menu.<br>
Si le contenu du menu vient à changer (par exemple, si on rajoute une
page au site), cette modification du menu n'aura à être faite qu'à un
seul endroit.<br>
<br>
Ensuite, plutôt que de demander au créateur du site d'écrire les balises
HTML des différentes lignes du menu, un script PHP peut se charger du
travail à partir d'un fichier qui a une syntaxe plus simple.<br>
Accessoirement, ce script PHP pourra afficher différemment dans le menu
le nom de la page qu'on est en train de visualiser.<br>
<br>
C'est cette approche qui est utilisée pour ce site web (et tous mes
autres sites également).<br>
<h2>Le menu des statistiques de vaccination</h2>
Voici le contenu du fichier contenant ce menu :<br>
<br>
<iframe src="menus/menu-vaccin" width="400" height="300"></iframe><br>
<br>
On constate qu'il contient des lignes obéissant à plusieurs types de
syntaxe :<br>
<ul>
<li>des lignes vides,</li>
<li>des lignes qui commencent par # ou ## suivies, après un espace,
d'un peu de texte,</li>
<li>des lignes qui commencent par le nom d'un script php (lien vers
une page du site) suivi, après un ou plusieurs espaces d'un peu
de texte.</li>
</ul>
Le travail du script PHP va consister à lire les différentes lignes du
fichier menu et à générer pour chacune d'elles, une ligne de code HTML
dont la syntaxe variera en fonction de la nature de l'information
contenue dans cette ligne, c'est à dire de ce qu'on trouvera avant le
premier espace dans la ligne.<br>
<br>
La génération du menu est réalisée par une fonction qui possède le
prototype suivant :
<pre>
function genmenu ($page_cour)</pre>
Cette fonction est dans un fichier PHP séparé qui sera mentionné dans
tous les scripts PHP qui en ont besoin.
<pre>
require ("genmenu.php");</pre>
Dans les scripts PHP chargés de générer une page du site, la demande
d'insertion du menu se fait par cette instruction :
<pre>
genmenu (basename ($_SERVER ['SCRIPT_NAME']));</pre>
La fonction <tt>genmenu</tt> reçoit un paramètre qui est le nom de la
page qu'on est en train de visualiser. Dans le cas des statistiques de
vaccination, chaque page du site fait appel à un script PHP spécifique.
Il suffira donc de passer en paramètre le nom de ce script qui est
directement connu du serveur web.<br>
<br>
Le travail de la fonction <tt>genmenu</tt> consiste à ouvrir en lecture
le fichier texte contenant le menu des statistiques de vaccination, et
pour chaque ligne qu'il contient, à générer une ligne de code HTML.<br>
!vsource exemples-code/struct-genmenu.php
On peut remarquer que pour les lignes vides du fichier menu, on va
générer une ligne de code HTML qui entraînera un passage à la ligne
dans le menu :<br>
!vsource exemples-code/trt-lignevidemenu.php
Dans le cas où la ligne du fichier menu n'est pas vide, on va générer du
texte supplémentaire entre les 2 appels de l'instruction <tt>echo</tt><br>
<br>
le type de traitement à effectuer dépend de ce qu'il y a au début de la
ligne. On commence donc par séparer la première information de la ligne
(ce qui précède le premier espace) du reste :<br>
!vsource exemples-code/decomp-lignemenu.php
puis on génère un contenu différent en fonction de <tt>$debut</tt><br>
<br>
<table border="1" cellpadding="5px">
<tr align="center"><td>Premier champ</td><td>Traitement</td></tr>
<tr>
<td align="center">##</td>
<td>Titre de premier niveau : on affiche la suite de la ligne
en caractères gras et agrandis
</td>
</tr>
<tr>
<td align="center">#</td>
<td>Titre de deuxième niveau : on affiche la suite de la ligne
en caractères gras
</td>
</tr>
<tr>
<td align="center">Page courante</td>
<td>C'est un cas particulier du cas suivant : le premier
champ de la ligne contient le nom d'un script PHP qui se
trouve être celui reçu dans la variable <tt>$page_cour</tt><br>
<br>
Il n'est pas nécessaire de générer un lien hypertexte sur la
page déjà affichée. Par contre, marque qu'on est déjà sur
cette page en affichant la suite de la ligne dans une autre
couleur est utile.
</td>
</tr>
<tr>
<td align="center">Cas général</td>
<td>On génère un lien hypertexte dans lequel le premier champ
de la ligne représente le lien et la suite de la ligne, le
texte à afficher.
</td>
</tr>
</table>
<br>
!vsource exemples-code/trt-lignemenuvacc.php
<h2>Le menu de la documentation</h2>
La structure du fichier menu <tt>menu-doc</tt> est semblable à celle
du fichier menu sur les statistiques de vaccination :<br>
<br>
<iframe src="menus/menu-doc" width="500" height="300"></iframe><br>
<br>
Il y a tout de même une différence. A l'exception du premier lien
hypertexte qui indique la nom d'un script PHP, le premier champ des
autres liens comporte des noms sans suffixe.<br>
<br>
Ceci est dû au fait que les différentes pages de la documentation de
ce site sont affichées grâce à un script unique de nom <tt>voir.php</tt>
auquel on passe en paramètre un nom de page HTML.<br>
<br>
C'est le script <tt>voir.php</tt> qui se charge de sélectionner le bon
fichier HTML. Si aucune page n'est indiquée, la page d'accueil est
choisie par défaut.<br>
!vsource exemples-code/recup-pagedoc.php
Plus tard, la variable <tt>$page</tt> sera passée en paramètre lors de
l'appel de la fonction qui va générer le menu :
<pre>
genmenudoc ($page);</pre>
La fonction <tt>genmenudoc ($page)</tt> est définie dans un script
PHP spécifique de nom <tt>genmenudoc.php</tt><br>
<br>
A l'origine, lorsque la documentation sur le fonctionnement de ce site
a été rajoutée aux pages sur les statistiques de vaccination, la fonction
<tt>genmenu (...)</tt> a été complétée pour traiter différentes
variantes de menus. Le nom du fichier menu était alors passé en paramètre.
Mais cela emmenait à rajouter des instructions spécifiques au traitement
de tel ou tel menu et inutiles dans le cas des autres menus.<br>
<br>
En écrivant plusieurs fonctions PHP spécifiques à différentes variantes
de menus, on simplifie celles-ci en supprimant le code inutile.<br>
<br>
La fonction <tt>genmenudoc (...)</tt> ne diffère de celle décrite
plus haut qu'au niveau de la génération des liens hypertexte.<br>
<br>
Il faut distinguer le cas où le lien indiqué est un script PHP et celui
où c'est une page HTML. Dans le deuxième cas, son contenu sera affiché
par le script <tt>voir.php</tt><br>
<br>
Pour distinguer les deux cas, il suffit de vérifier si la chaîne de
caractères <tt>.php</tt> est présente dans le nom du lien.<br>
!vsource exemples-code/liens-menudoc.php
En dehors de l'accès au fichier <tt>menu-doc</tt> à la place du
fichier <tt>menu-vaccin</tt>, c'est la seule différence qu'il y a
entre le contenu des deux fonctions <tt>genmenudoc (...)</tt>
et <tt>genmenu (...)</tt><br>
<br>
<h2>Les menus pour voir les fichiers CSV</h2>
Il existe deux scripts PHP pour afficher le contenu des fichiers
CSV :<br>
<ul>
<li>
<tt>voirfich.php</tt> permet de voir le contenu de fichiers CSV
locaux dont la liste est dans le fichier <tt>menu-csvloc</tt>,
</li>
<br>
<li>
<tt>voirurl.php</tt> permet de voir le contenu de fichiers CSV
de référence dont la liste est dans le fichier
<tt>menu-refcsv</tt>.
</li>
</ul>
Ces deux scripts utilisent tous les deux la même fonction
<tt>genmenucsv (...)</tt> pour générer le menu. Un premier paramètre
permet de préciser lequel des deux fichiers menu doit être utilisé.<br>
!vsource exemples-code/recup-nomscript.php
D'autre part, les fichiers à visualiser sont identifiés par leur nom dans
les fichiers <tt>menu-csvloc</tt> et <tt>menu-refcsv</tt>.<br>
<br>
Il est inutile de mettre deux fois le même nom de fichier dans une ligne
du fichier menu, d'abord pour indiquer quel fichier doit être visualisé,
ensuite pour préciser ce qui doit être écrit dans la ligne du menu pour
voir le contenu de ce fichier.<br>
<br>
Donc, on se contente dans les fichiers menu d'écrire une seule fois les
noms des fichiers à visualiser et la détection ou non d'un espace dans
une ligne non vide permet de savoir si on doit traiter un cas particulier
(ligne commençant par # ## ou lien vers un script PHP) ou le cas général
qui consiste à afficher le contenu d'un fichier CSV si la page courante
ne le montre pas déjà.
!vsource exemples-code/trt-lignemenucsv.php
<h2>Les menus pour voir les fichiers source</h2>
Enfin, le script <tt>voirsource.php</tt> permet d'afficher le contenu
des fichiers permanents du site (scripts PHP, fichiers HTML, fichiers
CSS, programmes C, fichier menus) tant pour la partie statistiques de
vaccination que pour cette documentation. Au total, un peu plus d'une
centaine de fichiers sont concernés.<br>
<br>
Plutôt que de faire un fichier menu unique très long, la liste est
décomposée en 4 fichier menu : un pour la documentation et 3
pour les différents types de fichiers relatifs aux statistiques de
vaccination.<br>
<br>
Ces menus peuvent être identifiés par un numéro (de 0 (pour la
doculmentation) à 3).<br>
!vsource exemples-code/sel-menusrc.php
Lorsqu'on demande, depuis une page qui décrit la liste des fichiers
à voir un fichier particulier, le numéro du menu à afficher est
passé en paramètre en même temps que le nom du fichier dans le lien
hypertexte.<br>
<br>
Il est toutefois possible lorsqu'on regarde l'un des nombreux fichiers
du serveur relatifs aux statistiques de vaccination et qu'on souhaite
en examiner un autre d'une autre nature de sélectionner directement
le menu dans lequel il sera proposé.<br>
<br>
Pour celà, ces fichiers menu prennent en compte une nouvelle
syntaxe&nmsp;: des lignes qui commencent par <tt>></tt> suivi
d'un numéro de menu.<br>
<br>
Par exemple, le menu pour voir les fichiers CSS et HTML des satistiques
de vaccination donnent également accès aux menus pour voir les scripts
PHP et les sources C.<br>
<br>
<iframe src="menus/menu-src-html" width="400" height="300"></iframe><br>
<br>
On remarque que, comme pour les menus qui concernent les fichiers CSV,
les lignes du fichier menu qui permettent de voir un fichier particulier
ne contiennent pas d'espace.<br>
<br>
Mais dans ce cas-ci, à part pour les scripts PHP, les fichiers sont
mémorisés par catégories dans différents sous-répertoires.<br>
<br>
Cette information est nécessaire pour accéder au fichier, mais on évite
de l'afficher dans le menu en utilisant la fonction basename ()<br>
!vsource exemples-code/trt-lien-menusrc.php
</div>
<div id="menu">
XXXMENU
</div>
</body>
</html>