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.
D'autre part :
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 :
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 champTraitement
## 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 :
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>";