Génération du menu de gauche
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.
Au niveau du code HTML, il y a de grosses différences entre la partie
rédactionnelle d'une page et son menu.
- 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.
Il faudra des balises HTML pour :
- demander des passages à la ligne,
- insérer des images,
- insérer des liens hypertexte,
- changer temporairement l'apparence des caractères,
- présenter des données sous forme de tableaux.
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.
- 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.
D'autre part :
- Le contenu de la partie rédactionnelle de la page varie beaucoup
d'une page à l'autre.
- 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.
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.
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.
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.
Accessoirement, ce script PHP pourra afficher différemment dans le menu
le nom de la page qu'on est en train de visualiser.
C'est cette approche qui est utilisée pour ce site web (et tous mes
autres sites également).
Le menu des statistiques de vaccination
Voici le contenu du fichier contenant ce menu :
On constate qu'il contient des lignes obéissant à plusieurs types de
syntaxe :
- des lignes vides,
- des lignes qui commencent par # ou ## suivies, après un espace,
d'un peu de texte,
- 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.
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.
La génération du menu est réalisée par une fonction qui possède le
prototype suivant :
function genmenu ($page_cour)
Cette fonction est dans un fichier PHP séparé qui sera mentionné dans
tous les scripts PHP qui en ont besoin.
require ("genmenu.php");
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 :
genmenu (basename ($_SERVER ['SCRIPT_NAME']));
La fonction
genmenu 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.
Le travail de la fonction
genmenu 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.
// chemin d'accès au fichier contenant le menu
$ficmenu = DIR_MENUS."/menu-vaccin";
// ouvrir le fichier contenant le menu
$descmenu = fopen ($ficmenu, "r");
// si l'ouverture s'est bien passée
if ($descmenu)
{
// lire la première ligne du menu
$ligne = fgets ($descmenu, LG_MAX_HTML);
// tant qu'on a pu lire une ligne
while ($ligne)
{
// supprimer le retour à la ligne
$ligne = trim ($ligne);
// pour l'indentation
echo " ";
// si la ligne n'est pas vide
if ($ligne)
{
(...)
}
// passage à la ligne
echo "<br>\n";
// lire la ligne suivante du menu
$ligne = fgets ($descmenu, LG_MAX_HTML);
}
// terminé avec le fichier contenant le menu
fclose ($descmenu);
}
// sinon
else
// message d'erreur
echo "Fichier ".basename ($ficmenu)." manquant";
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 :
// pour l'indentation
echo " ";
// si la ligne n'est pas vide
if ($ligne)
{
(...)
}
// passage à la ligne
echo "<br>\n";
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
echo
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 :
// rechercher le premier espace dans la ligne
$posblanc = strpos ($ligne, " ");
// séparer le nom du script php du nom du lien à afficher
// ou l'indicateur en début de ligne du texte à afficher
$debut = substr ($ligne, 0, $posblanc);
$suite = trim (substr ($ligne, $posblanc));
puis on génère un contenu différent en fonction de
$debut
Premier champ | Traitement |
## |
Titre de premier niveau : on affiche la suite de la ligne
en caractères gras et agrandis
|
# |
Titre de deuxième niveau : on affiche la suite de la ligne
en caractères gras
|
Page courante |
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 $page_cour
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.
|
Cas général |
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.
|
// traitement différencié en fonction du premier paramètre
switch ($debut)
{
case "##" : // ligne à afficher en caractères gras agrandis
echo '<font style="font-size:120%"><b>'.$suite."</b></font>";
break;
case "#" : // ligne à afficher en caractères gras
echo "<b>".$suite."</b>";
break;
case $page_cour : // page courante affichée en orange
echo '<font color="#ff8000">'.$suite."</font>";
break;
default : // lien php
echo '<a href="'.$debut.'">'.$suite."</a>";
}
Le menu de la documentation
La structure du fichier menu
menu-doc est semblable à celle
du fichier menu sur les statistiques de vaccination :
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.
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
voir.php
auquel on passe en paramètre un nom de page HTML.
C'est le script
voir.php 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.
// si un nom de page a été passé en paramètre
if (isset ($_GET ['page']))
// le récupérer
$page = strtolower ($_GET ['page']);
// sinon
else
// page d'accueil par défaut
$page = "accueil";
// fabriquer nom et le le chemin d'accès à la page à afficher
$ficpage = DIR_PAGEDOC."/".$page.".html";
// si la page cherchée n'existe pas
if (! file_exists ($ficpage))
// choisir la page d'erreur en remplacement
$ficpage = DIR_PAGEDOC."/manque_page.html";
Plus tard, la variable
$page sera passée en paramètre lors de
l'appel de la fonction qui va générer le menu :
genmenudoc ($page);
La fonction
genmenudoc ($page) est définie dans un script
PHP spécifique de nom
genmenudoc.php
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
genmenu (...) 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.
En écrivant plusieurs fonctions PHP spécifiques à différentes variantes
de menus, on simplifie celles-ci en supprimant le code inutile.
La fonction
genmenudoc (...) ne diffère de celle décrite
plus haut qu'au niveau de la génération des liens hypertexte.
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
voir.php
Pour distinguer les deux cas, il suffit de vérifier si la chaîne de
caractères
.php est présente dans le nom du lien.
default : // si lien vers un script php
if (strpos ($debut, ".php"))
// l'afficher tel quel
echo '<a href="'.$debut.'">'.$suite."</a>";
// sinon
else
// afficher la page de documentation demandée
echo '<a href="voir.php?page='.$debut.'">'.$suite."</a>";
En dehors de l'accès au fichier
menu-doc à la place du
fichier
menu-vaccin, c'est la seule différence qu'il y a
entre le contenu des deux fonctions
genmenudoc (...)
et
genmenu (...)
Les menus pour voir les fichiers CSV
Il existe deux scripts PHP pour afficher le contenu des fichiers
CSV :
-
voirfich.php permet de voir le contenu de fichiers CSV
locaux dont la liste est dans le fichier menu-csvloc,
-
voirurl.php permet de voir le contenu de fichiers CSV
de référence dont la liste est dans le fichier
menu-refcsv.
Ces deux scripts utilisent tous les deux la même fonction
genmenucsv (...) pour générer le menu. Un premier paramètre
permet de préciser lequel des deux fichiers menu doit être utilisé.
// récupérer le nom du script qui permet d'afficher
// la page et rajouter le paramètre de la méthode get
$script = basename ($_SERVER ['SCRIPT_NAME'])."?fich=";
D'autre part, les fichiers à visualiser sont identifiés par leur nom dans
les fichiers
menu-csvloc et
menu-refcsv.
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.
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à.
// rechercher le premier espace dans la ligne
$posblanc = strpos ($ligne, " ");
// s'il existe
if ($posblanc)
{
// ce n'est pas une ligne de lien vers un fichier csv
// séparer le premier paramètre de la ligne de la suite
$debut = substr ($ligne, 0, $posblanc);
$suite = trim (substr ($ligne, $posblanc));
// traitement différencié en fonction du premier paramètre
switch ($debut)
{
case "##" : // ligne à afficher en plus gros caractères et en gras
echo '<font style="font-size:120%"><b>'.$suite."</b></font>";
break;
case "#" : // ligne à afficher en caractères gras
echo "<b>".$suite."</b>";
break;
default : // lien php
echo '<a href="'.$debut.'">'.$suite."</a>";
}
}
// sinon la ligne concerne un fichier csv (local ou de référence)
else
{
// si ce n'est pas celui de la page courante
if ($ligne != $page_cour)
// générer une ligne avec l'appel du lien
echo '<a href="'.$script.$ligne.'">'.$ligne."</a>";
// sinon
else
// générer le nom du lien dans une autre couleur
echo '<font color="#ff8000">'.$ligne."</font>";
}
Les menus pour voir les fichiers source
Enfin, le script
voirsource.php 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.
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.
Ces menus peuvent être identifiés par un numéro (de 0 (pour la
doculmentation) à 3).
function genmenusrc ($fichier, $menu)
{
// sélection du type de menu en fonction de son numéro
switch ($menu)
{
case 1 : $typemenu = "src-php";
break;
case 2 : $typemenu = "src-html";
break;
case 3 : $typemenu = "src-c";
break;
default: $typemenu = "srcdoc";
}
// chemin d'accès au fichier contenant le menu
$ficmenu = DIR_MENUS."/menu-".$typemenu;
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.
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é.
Pour celà, ces fichiers menu prennent en compte une nouvelle
syntaxe&nmsp;: des lignes qui commencent par
> suivi
d'un numéro de menu.
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.
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.
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.
Cette information est nécessaire pour accéder au fichier, mais on évite
de l'afficher dans le menu en utilisant la fonction basename ()
// nom du fichier à afficher
$nomlien = basename ($ligne);
// si ce n'est pas celui de la page courante
if ($nomlien != basename ($fichier))
{
// on affichera le code source du fichier
$lien = "voirsource.php?page=".$ligne."&menu=".$menu;
// générer une ligne avec l'appel du lien
echo '<a href="'.$lien.'">'.$nomlien."</a>";
}
// sinon
else
// générer le nom du lien dans une autre couleur
echo '<font color="#ff8000">'.$nomlien."</font>";