Architecture d'un site web, deuxième partie —
Organisation des répertoires

Alexandre Niveau
GREYC — Université de Caen

Résumé de l'épisode précédent

Sur un site avec plusieurs pages, on a des éléments communs (bannière, menu, structure, métadonnées, etc.), et des éléments qui changent de page en page.

Faire un fichier HTML distinct pour chaque page, en recopiant le contenu commun, est une violation du principe DRY (don't repeat yourself)

toute modification des éléments communs est fastidieuse et comporte un grand risque d'introduire des erreurs et incohérences.

Ce qu'il faut faire : écrire chaque morceau une et une seul fois

Pour cela, il faut séparer les parties spécifiques à chaque page (le contenu) des parties communes (le squelette des pages)

Suite du résumé

Pour cela, on s'est servi de PHP, un langage fait pour écrire des scripts qui sont exécutés par le serveur web pour générer du HTML

Principe de base de notre architecture : chaque « page » se contente de mettre des informations dans des variables (informations qui sont spécifiques à cette page) puis fait appel au script squelette, qui affiche le squelette HTML en comblant les trous avec le contenu des variables

Pour une illustration très simple, voir le corrigé de l'exercice sur le Royaume-Uni

Après plusieurs améliorations sur le site des poèmes, on était arrivé à cette version (archive du code), dans laquelle on avait modifié l'organisation des répertoires.

Organisation du site

Voici le détail de la structure des répertoires de la dernière version du site des poèmes :

poemes/
|-- index.php   (la page d'accueil)
|-- automne.php   (page de « Chanson d'automne »)
|-- boheme.php    (page de « Ma Bohème »)
|-- bois.php    (page de « Dans les bois »)
|-- correspondances.php    (page de « Correspondances »)
|-- screen.css    (feuille de style)
|-- images/    (images utilisées dans le HTML)
|   |-- baudelaire.jpg
|   |-- nerval.jpg
|   |-- rimbaud.jpg
|   `-- verlaine.jpg
`-- squel/    (les squelettes et leurs éléments)
    |-- defaut.squel.php    (le squelette par défaut)
    |-- poeme.squel.php    (le squelette d'une page de poème)
    `-- fragments/    (les morceaux communs à plusieurs squelettes)
        |-- debut.frg.php    (le haut de page des squelettes)
        `-- fin.frg.php    (le bas de page des squelettes)
  • En gras, les pages qui seront accédées par le navigateur de l'internaute :
    • en vert, les pages elles-mêmes (celles qui apparaissent dans la barre d'adresse)
    • en violet, les « ressources », qui seront téléchargées par le navigateur automatiquement
  • En rouge, les squelettes.
    • Ils contiennent du HTML « à trous » (des variables)
    • Chaque vraie page appelle (include) un squelette après avoir rempli les variables nécessaires
    • Il y a un squelette par « type de page » (il peut n'y en avoir qu'un seul)
    • Les squelettes peuvent eux-mêmes utiliser des fragments de squelettes (toujours avec include)
  • En bleu, les fragments de squelettes. Ce sont juste des morceaux de code qu'on utilise dans plusieurs squelettes et qu'on a donc envie de mutualiser.

Intérêt de l'organisation

On voit que c'est déjà assez complexe, et on n'a que cinq pages très simples.

Pour un vrai site, il y aura plus d'images, plus de fichiers CSS, plein d'images utilisées dans le CSS, des polices, des fichiers JavaScript… Et encore plus de confusion entre les pages, les squelettes et les fragments

Il est vital de bien ranger ses répertoires ! Et pour ça il faut s'y entraîner dès maintenant.

Organisation du site : CSS

Dans l'exemple précédent, un seul fichier CSS ⇒ tout va bien

En pratique c'est assez rare même pour de petits sites, et les fichiers CSS utilisent eux-mêmes d'autres fichiers

on va mettre tout ça dans un répertoire skin (ou autre…) consacré à la présentation (maquette, décoration…) du site

Une façon de voir les choses est que si on enlève ce répertoire, le site fonctionne toujours et le contenu est toujours accessible.

Reprenons le schéma précédent :
poemes/
|-- index.php
|-- automne.php
|-- boheme.php
|-- bois.php
|-- correspondances.php
|-- skin/    (ressources de présentation du site)
|   |-- screen.css    (feuille de style pour écran)
|   `-- print.css    (feuille de style pour impression)
|-- images/    (images utilisées dans le HTML)
`-- squel/    (les squelettes et leurs éléments)

Organisation du site : images

Rappel : certaines images sont du contenu et vont dans le HTML, d'autres sont plutôt de la décoration et sont appelées via CSS

Le choix n'est pas toujours très tranché ; au final c'est vous qui décidez

… mais il est en tout cas important de bien ranger les images en fonction de leur utilisation

On aura donc un répertoire images dans le répertoire skin

poemes/
|-- index.php
|-- automne.php
|-- boheme.php
|-- bois.php
|-- correspondances.php
|-- skin/    (ressources de présentation du site)
|   |-- screen.css    (feuille de style pour écran)
|   |-- print.css    (feuille de style pour impression)
|   `-- images/    (images utilisées dans le CSS)
|       |-- fond.jpg    (image de fond)
|       `-- icone.png    (une icône de décoration)
|-- images/    (images utilisées dans le HTML)
`-- squel/    (les squelettes et leurs éléments)

Une conséquence importante : dans les fichiers CSS, on saura toujours où chercher les images : background: url("images/fond.jpg"); (jamais besoin de réfléchir au chemin relatif à prendre pour atteindre l'image)

Bref retour sur PHP (pour les plus à l'aise !)

On rappelle que le fichier boheme.php ressemblait à ça :
<?php
$titre 
"Ma bohème";
$auteur "Arthur Rimbaud";
$image "rimbaud.jpg";
$infos_publication 'publié en octobre 1870';
$texte "
    <p>Je m’en allais, les poings dans mes poches crevées&nbsp;;<br />
    Mon paletot aussi devenait idéal&nbsp;;<br />
    J’allais sous le ciel, Muse&nbsp;! et j’étais ton féal&nbsp;;<br />
    Oh&nbsp;! là là&nbsp;! que d’amours splendides j’ai rêvées&nbsp;!</p>

    <p>Mon unique culotte avait un large trou.<br />
    — Petit Poucet rêveur, j’égrenais dans ma course<br />
    Des rimes. Mon auberge était à la Grande-Ourse&nbsp;;<br />
    — Mes étoiles au ciel avaient un doux frou-frou.</p>

    <p>Et je les écoutais, assis au bord des routes,<br />
    Ces bons soirs de septembre où je sentais des gouttes<br />
    De rosée à mon front, comme un vin de vigueur&nbsp;;</p>

    <p>Où, rimant au milieu des ombres fantastiques,<br />
    Comme des lyres, je tirais les élastiques<br />
    De mes souliers blessés, un pied près de mon cœur&nbsp;!</p>
"
;

include(
"squel/poeme.squel.php");
?>

On a bien séparé le squelette et le contenu qui varie de page en page

Cependant, ce n'est pas très agréable d'écrire du HTML dans une chaîne de caractères PHP
Ça marche bien pour les infos courtes, mais dès qu'il y a plusieurs lignes ce n'est pas pratique
  • pas de coloration syntaxique de l'éditeur ⇒ erreurs de HTMLplus difficiles à détecter
  • nécessité d'échapper les guillemets ou les apostrophes ⇒ fastidieux, risque d'erreur

Inclusion de fragments HTML

Une solution est d'écrire ces fragments de HTML dans des fichiers séparés et d'en récupérer le contenu depuis PHP avec la fonction file_get_contents, qui prend le contenu d'un fichier et le met dans une variable

Ainsi si le fichier boheme.frg.html ne contient que le texte du poème :
    <p>Je m’en allais, les poings dans mes poches crevées&nbsp;;<br />
    Mon paletot aussi devenait idéal&nbsp;;<br />
    J’allais sous le ciel, Muse&nbsp;! et j’étais ton féal&nbsp;;<br />
    Oh&nbsp;! là là&nbsp;! que d’amours splendides j’ai rêvées&nbsp;!</p>

    <p>Mon unique culotte avait un large trou.<br />
    — Petit Poucet rêveur, j’égrenais dans ma course<br />
    Des rimes. Mon auberge était à la Grande-Ourse&nbsp;;<br />
    — Mes étoiles au ciel avaient un doux frou-frou.</p>

    <p>Et je les écoutais, assis au bord des routes,<br />
    Ces bons soirs de septembre où je sentais des gouttes<br />
    De rosée à mon front, comme un vin de vigueur&nbsp;;</p>

    <p>Où, rimant au milieu des ombres fantastiques,<br />
    Comme des lyres, je tirais les élastiques<br />
    De mes souliers blessés, un pied près de mon cœur&nbsp;!</p>

alors dans la « vraie page » boheme.php, on peut remplir la variable $texte simplement avec
$texte file_get_contents("boheme.frg.html");
Ça revient exactement au même que précédemment, mais le HTML est plus facile à manipuler, et notre page PHP ne contient quasiment plus que des informations, pas directement du contenu.

Si vous avez du mal avec l'architecture, vous pouvez ignorer ce slide et le précédent, et remplir les variables directement, ça marche aussi très bien.

Récapitulatif de l'organisation du site

Si on utilise la méthode des fragments HTML, il faudra un répertoire de plus pour contenir les fragments de contenu.

La structure complète du site est donc la suivante :
poemes/
|-- index.php   (la page d'accueil)
|-- automne.php   (page de « Chanson d'automne »)
|-- boheme.php    (page de « Ma Bohème »)
|-- bois.php    (page de « Dans les bois »)
|-- correspondances.php    (page de « Correspondances »)
|-- fragments/    (les fragments HTML, utilisés pour remplir les variables)
|   |-- automne.frg.html    (le texte de « Chanson d'automne »)
|   |-- boheme.frg.html    (le texte de « Ma Bohème »)
|   |-- bois.frg.html    (le texte de « Dans les bois »)
|   `-- correspondances.frg.html    (le texte de « Correspondances »)
|-- images/    (images utilisées dans le HTML)
|   |-- baudelaire.jpg
|   |-- nerval.jpg
|   |-- rimbaud.jpg
|   `-- verlaine.jpg
|-- skin/    (ressources de présentation du site)
|   |-- screen.css    (feuille de style pour écran)
|   |-- print.css    (feuille de style pour impression)
|   `-- images/    (images utilisées dans le CSS)
|       `-- PD-icon.png    (icône « domaine public »)
`-- squel/    (les squelettes et leurs éléments)
    |-- defaut.squel.php    (le squelette par défaut)
    |-- poeme.squel.php    (le squelette d'une page de poème)
    `-- fragments/    (les morceaux communs à plusieurs squelettes)
        |-- debut.frg.php    (le haut de page des squelettes)
        `-- fin.frg.php    (le bas de page des squelettes)
Le résultat est visible ici (NB, j'ai ajouté une icône dans le pied de page, pour que l'exemple soit complet), et le code récupérable dans cette archive.

Conclusion encore partielle

On a encore mieux séparé la structure du contenu, et on a bien organisé nos fichiers

Le problème évoqué la dernière fois reste le même : l'architecture n'est pas encore adaptée à un contenu dynamique (on est obligé d'avoir une page PHP par page réelle du site)

Pour avoir une vraie architecture de site, il faudrait que le serveur web n'appelle que la page index.php, en lui fournissant l'URL demandée par l'internaute ; le script générerait alors la page du poème demandé en fonction de l'URL

on peut alors utiliser une base de données et générer les pages à la volée

Sera vu en parcours dev