Aller au contenu

Navigation et composition de pages

Un site PHP est généralement constitué de plusieurs pages assemblées à partir de parties communes.

Chaque page d’un site PHP est un fichier distinct (index.php, produits.php, contact.php). Aller d’une page à l’autre, c’est faire une nouvelle requête : un lien HTML ordinaire suffit.

<nav>
<a href="index.php">Accueil</a>
<a href="produits.php">Produits</a>
<a href="contact.php">Contact</a>
</nav>

Cliquer un lien envoie une requête au serveur, qui exécute le fichier ciblé et renvoie le HTML produit. Rien de magique : c’est le cycle d’une requête, répété.

On peut aussi transporter une donnée dans le lien, via la chaîne de requête :

<a href="produit.php?id=2">Voir le détail</a>

La page produit.php lira alors $_GET["id"]. Les superglobales et la validation de ces données sont approfondies plus loin dans le cours ; retenez pour l’instant que la navigation peut porter des paramètres.

Plutôt que de réécrire l’en-tête et le pied de page dans chaque fichier, on les inclut. Une page devient alors : inclusion de l’en-tête, contenu propre, inclusion du pied de page.

<?php include __DIR__ . "/includes/header.php"; ?>
<main>
<h2>Nos produits</h2>
<!-- contenu propre à la page -->
</main>
<?php include __DIR__ . "/includes/footer.php"; ?>

Un fichier inclus partage les variables de la page qui l’inclut. On peut donc préparer des valeurs avant l’inclusion et les utiliser dedans. C’est ce qui permet, par exemple, de marquer le lien de la page courante dans une barre de navigation partagée.

  1. Chaque page définit son identité avant d’inclure l’en-tête :

    <?php
    $titre = "Nos produits";
    $pageActive = "produits";
    include __DIR__ . "/includes/header.php";
    ?>
  2. L’en-tête lit ces variables pour adapter le titre et le lien actif :

    <title><?php echo htmlspecialchars($titre ?? "L'Érablière dorée"); ?></title>
    <nav>
    <a href="index.php" class="<?php echo ($pageActive ?? '') === 'accueil' ? 'actif' : ''; ?>">Accueil</a>
    <a href="produits.php" class="<?php echo ($pageActive ?? '') === 'produits' ? 'actif' : ''; ?>">Produits</a>
    <a href="contact.php" class="<?php echo ($pageActive ?? '') === 'contact' ? 'actif' : ''; ?>">Contact</a>
    </nav>

La composition ne s’arrête pas à l’en-tête et au pied de page. Un bloc qui revient, comme la carte d’un produit, peut devenir un fragment inclus dans une boucle.

<?php foreach ($products as $p): ?>
<?php include __DIR__ . "/partials/product-card.php"; ?>
<?php endforeach; ?>

Le fragment partials/product-card.php utilise la variable $p de la boucle, puisqu’il en partage la portée.

Quand un fichier déclare quelque chose (une fonction, une classe), l’inclure deux fois provoque une erreur fatale : on ne peut pas redéclarer une fonction.

<?php
require_once __DIR__ . "/lib/functions.php"; // formatPrix() déclarée ici, une seule fois

Utilisez la variante _once pour tout fichier qui déclare des fonctions ou des classes. Pour un simple fragment de présentation que vous voulez répéter (la carte produit dans une boucle), gardez include sans _once.

Un fichier peut se contenter de retourner une valeur. On l’importe alors comme une expression.

data/products.php
<?php
return [
["name" => "Sirop d'érable 540 ml", "price" => 14.50],
["name" => "Beurre d'érable 250 g", "price" => 9.95],
];
<?php
$products = require __DIR__ . "/data/products.php";

C’est la séparation des données et de la présentation : les produits vivent à un endroit, la page qui les affiche à un autre.

  • Chemin d’URL vs chemin de fichier : href pour le navigateur, include/require pour le serveur. Ne les mélangez pas.
  • _once pour les déclarations : un fichier qui définit des fonctions ou des classes se charge avec require_once.
  • Portée partagée : un fichier inclus voit les variables de l’appelant. Préparez les valeurs avant l’inclusion, et nommez clairement.
  • Échappement : htmlspecialchars(...) sur tout ce qui s’affiche, y compris dans les fragments réutilisés.
  • Naviguer, c’est lier des fichiers .php par des <a href> ; chaque clic est une nouvelle requête.
  • Composer, c’est assembler une page à partir de parties incluses (en-tête, pied de page, fragments), auxquelles on passe des variables via la portée partagée.
  • Importer : include/require (optionnel vs indispensable), _once pour les déclarations, et require d’un fichier qui return pour importer des données.

Quiz. Quelle différence majeure entre include en PHP et import en JavaScript ?

Quiz. Dans un lien <a href='produits.php'>, ce chemin est...