Code source du fichier pages-doc/menu.html

<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&nbsp;:<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&nbsp;:<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&nbsp;:<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&nbsp;:<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&nbsp;:
      <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&nbsp;:
      <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&nbsp;:<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&nbsp;:<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&nbsp;: 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&nbsp;:<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&nbsp;:
      <pre>
      genmenudoc ($page);</pre>
      La fonction <tt>genmenudoc&nbsp;($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&nbsp;(...)</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&nbsp;(...)</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&nbsp;(...)</tt>
      et <tt>genmenu&nbsp;(...)</tt><br>
      <br>
      <h2>Les menus pour voir les fichiers CSV</h2>
      Il existe deux scripts PHP pour afficher le contenu des fichiers
      CSV&nbsp;:<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&nbsp;(...)</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&nbsp;: 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>&gt;</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&nbsp;()<br>
!vsource exemples-code/trt-lien-menusrc.php
  </div>

  <div id="menu">
      XXXMENU
  </div>
</body>

</html>