De plus, le contenu de l'élément head
est (pratiquement) le même sur chaque page
Recopier le contenu commun dans le fichier HTML de chaque page ⇒ non-respect du principe DRY (don't repeat yourself)
Meilleure solution : séparer parties communes et parties spécifiques à chaque page
Le reste constitue le squelette de la page
#principal
(texte de la page d'accueil ou photo+poème)Modifier le nom de la feuille de style, le menu, et la structure de la page est fastidieux et risqué
Une possibilité : séparer squelette et contenu unique de chaque page…
… et générer les fichiers HTML à partir de ces éléments, avant de les mettre en ligne
squel/debut.frg.html
(le début du squelette)squel/fin.frg.html
(la fin du squelette)contenu/index.frg.html
(le contenu du bloc #principal
de la page d'accueil)contenu/boheme.frg.html
(le contenu du bloc #principal
de la page du poème « Ma Bohème »)contenu/automne.frg.html
(le contenu du bloc #principal
de la page du poème « Chanson d'automne »).frg.html
, pour mettre en évidence le fait que ce sont des fragments de fichiers HTML,
qui n'ont pas de sens pris isolément
NB: on prend soin d'organiser ses fichiers dans des répertoires distincts, en l'occurrence squel
pour les fragments de squelette et contenu
pour les fragments de contenu
On va utiliser ces fragments pour générer les fichiers HTML dans le répertoire site
, qui va contenir le résultat final,
c'est-à-dire le site à déployer sur le serveur web
Le répertoire site
contient déjà le CSS et les images
archive du code dans cet état de départ
Pour chaque page, il faut simplement concaténer le début de squelette, le contenu de la page et la fin du squelette, et écrire tout ça dans un fichier HTML dans le répertoire site
cat squel/debut.frg.html contenu/boheme.frg.html squel/fin.frg.html >site/boheme.html
generer.sh
:
#!/bin/sh cat squel/debut.frg.html contenu/index.frg.html squel/fin.frg.html >site/index.html cat squel/debut.frg.html contenu/boheme.frg.html squel/fin.frg.html >site/boheme.html cat squel/debut.frg.html contenu/automne.frg.html squel/fin.frg.html >site/automne.html …ou plus proprement (DRY) :
#!/bin/sh for page in boheme correspondances bois automne index do cat squel/debut.frg.html contenu/"$page".frg.html squel/fin.frg.html >site/"$page".html done
Il ne reste plus qu'à déployer le répertoire site
(on peut aussi faire
un script qui génère le HTML puis déploie le site — attention cependant à bien le tester avant de l'utiliser, la catastrophe est vite arrivée…)
N.B.: on ne met pas les répertoires contenu
et squel
sur le serveur — seulement les fichiers HTML « finalisés ».
impossible de faire varier le titre des pages (title
dans le head
), par exemple pour mettre le titre du poème
si on veut changer cette structure, même problème qu'au départ
Pour résoudre ces problèmes : un programme de génération de pages moins basique suffirait
on aura besoin d'une base de données contenant les poèmes et leurs caractéristiques (titre, auteur, date de publication…)
il va falloir que le serveur construise les pages dynamiquement, à partir de la base de données, en fonction des requêtes des internautes
Page web dynamique = le serveur a généré le HTML à la demande
toto.truc
toto.truc
: il sait que cette page
doit être générée en lançant un certain programmeLe client ne sait pas tout ça : il a demandé une page et a obtenu du HTML. Il n'a aucun moyen de savoir que la page a été générée dynamiquement.
Dans le cadre de ce cours, et dans toute la licence pro, on utilisera le langage PHP
Langage de script, comme Python ou bash
Spécialement conçu pour les sites web (architecture client/serveur)
Idée de départ : rendre « simple » la réalisation de sites web dynamiques en permettant d'inclure des instructions dans le code HTML (en pratique, très souvent mal utilisé)
Pas le meilleur langage de programmation, mais toujours très utilisé, notamment par les principaux CMS (WordPress, Drupal, Joomla)
<!DOCTYPE html>
<html>
<head><title>Ma page</title><meta charset="UTF-8" /></head>
<body>
<h2>Les nombres</h2>
<p>Voici les nombres de 1 à 10000 :
<?php
for ($i = 1; $i <= 10000; $i++) {
echo "$i, ";
}
?>
</p>
</body>
</html>
C'est une page HTML avec des blocs d'instructions encadrées
par <?php
et ?>
Ce qui est en dehors de ces blocs est affiché tel quel
Les blocs sont remplacés par le résultat de l'exécution des instructions
Regarder le code source de la page : noter qu'il ne subsiste aucune trace du code PHP !
nombres.php
nombres.php
Le navigateur ne voit jamais le code PHP : il ne récupère que de l'HTML !
echo
PHP permet d'utiliser des variables. Elles commencent toujours par le caractère $
.
Elles permettent par exemple de stocker un contenu pour éviter de le répéter
L'instruction echo
permet d'afficher une variable ou une chaîne de caractères
<?php
$titre = "Page démo";
$contenu = "Le contenu sera généré par mon programme";
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<title><?php echo $titre; ?></title>
</head>
<body>
<h1><?php echo $titre; ?></h1>
<p><?php echo $contenu; ?></p>
</body>
</html>
Pour le navigateur, ça ne change rien : le résultat est toujours de l'HTML
PHP permet de construire des sites dynamiques, par opposition aux sites statiques n'utilisant qu'HTML/CSS.
On va reprendre exactement le même principe que précédemment, mais cette fois on va assembler les morceaux dynamiquement, côté serveur, avec PHP
On garde les mêmes répertoires squel
(avec les fragments de squelette)
et contenu
(avec les fragments de contenu),
mais cette fois ils seront placés sur le serveur (puisque les pages seront assemblées dynamiquement)
index.php
pour la page d'accueilboheme.php
pour la page de « Ma Bohème »Aucun de ces fichiers ne contiendra de HTML : il assemblera les deux fragments de squelette avec le bon fragment de contenu
include
La fonction PHP include
permet d'inclure un fichier.
toto.frg.html
contient
<p><code>toto</code> est une <em>variable
métasyntaxique</em> utilisée dans les
exemples de programmes.</p>
<h1>Toto</h1>
<?php include("toto.frg.html"); ?>
<footer>Copyright Toto</footer>
<h1>Toto</h1>
<p><code>toto</code> est une <em>variable
métasyntaxique</em> utilisée dans les
exemples de programmes.</p>
<footer>Copyright Toto</footer>
include
boheme.php
sera donc par exemple
simplement :
<?php
include("squel/debut.frg.html");
include("contenu/boheme.frg.html");
include("squel/fin.frg.html");
?>
Pour l'instant, on n'a rien gagné par rapport à la version statique… (On a même plutôt perdu, puisqu'on fait faire du travail en plus au serveur à chaque fois que quelqu'un accède au site)
Mais on peut aussi utiliser include
pour inclure du code PHP
On peut alors exploiter les variables pour rendre notre squelette plus flexible
include
sur un fichier PHPtexte.php
contient
<p><code><?php echo $variable; ?></code>
est une <em>variable
métasyntaxique</em> utilisée dans les
exemples de programmes.</p>
<h1>Des variables</h1>
<?php
$variable = "toto";
include("texte.php");
$variable = "titi";
include("texte.php");
?>
<footer>Copyright Toto</footer>
<h1>Des variables</h1>
<?php
$variable = "toto";
?>
<p><code><?php echo $variable; ?></code>
est une <em>variable
métasyntaxique</em> utilisée dans les
exemples de programmes.</p>
<?php
$variable = "titi";
?>
<p><code><?php echo $variable; ?></code>
est une <em>variable
métasyntaxique</em> utilisée dans les
exemples de programmes.</p>
<footer>Copyright Toto</footer>
<h1>Des variables</h1>
<p><code>toto</code> est une <em>variable
métasyntaxique</em> utilisée dans les
exemples de programmes.</p>
<p><code>titi</code> est une <em>variable
métasyntaxique</em> utilisée dans les
exemples de programmes.</p>
<footer>Copyright Toto</footer>
En quelque sorte, le script courant s'interrompt pour exécuter le script inclus
On va pouvoir rendre notre squelette plus flexible
changer .frg.html en .frg.php
En premier lieu, on peut utiliser une variable pour que l'élément title
soit adapté à la page
On peut aussi maintenant faire un fragment de squelette qui affiche un poème, avec pour variables le titre, l'auteur, la photo et le texte
Voir démos pendant le cours
chaque page de poème inclut les trois morceaux ⇒ faire un seul include avec un squelette
Le résultat final du site des poèmes est dans cette archive (et visible ici, mais la différence avec les précédents est très minime)
<?php
include("fragments/debut.frg.php");
?>
<figure class="photo">
<img src="images/<?php echo $image; ?>" alt="Photo de <?php echo $auteur; ?>" />
<figcaption><?php echo $auteur; ?></figcaption>
</figure>
<article class="poeme">
<h1><?php echo $titre; ?></h1>
<?php echo $texte; ?>
<div class="signature"><?php echo $auteur; ?>, <?php echo $infos_publication; ?></div>
</article>
<?php
include("fragments/fin.frg.php");
?>
<?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 ;<br />
Mon paletot aussi devenait idéal ;<br />
J’allais sous le ciel, Muse ! et j’étais ton féal ;<br />
Oh ! là là ! que d’amours splendides j’ai rêvées !</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 ;<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 ;</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 !</p>
";
include("squel/poeme.squel.php");
?>
NB: on en a profité pour mieux organiser les fichiers du site. Très important, on en reparlera.
On a déjà énormément factorisé le code et séparé la structure du contenu