<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>