Jusque-là, nous avions travaillé sur la page d'accueil de notre site, qui contient la liste des articles.
Mais notre projet va contenir plusieurs pages :
Une page "recettes".
Une page d'édition et de création de recette.
Une page avec un formulaire de contact.
Et pour pouvoir accéder à ces pages, il faudra nécessairement quelques liens HTML regroupés dans un menu principal.
Vous est-il déjà arrivé de vouloir modifier le menu de votre site et de devoir pour cela corriger le code HTML de chacune de vos pages web ?
Le menu d'une page web apparaît en effet sur chacune des pages, et vous avez très certainement dû le recopier sur chacune d'elles. Ça marche, mais ce n'est pas très pratique…
Au fil de ce chapitre, vous allez découvrir un des multiples avantages que vous donne le PHP lors de la création de votre site. C'est d'ailleurs ce qui m'a fait instantanément aimer ce langage lorsque je l'ai découvert, alors que je venais comme vous seulement d'apprendre le HTML et le CSS. 😉
Visualisez le découpage d'une page web
La plupart des sites web sont généralement découpés selon le schéma suivant.
Regardez le code d'exemple ci-dessous qui représente une page web avec un en-tête, un menu et un pied de page. Appelons cette page : index.php
.
<!DOCTYPE html>
charset="utf-8"
Mon super site
<!-- L'en-tête -->
<!-- Le menu -->
id="menu"
class="element_menu"
Titre menu
href="page1.html"Lien
href="page2.html"Lien
href="page3.html"Lien
<!-- Le corps -->
id="corps"
Mon super site
Bienvenue sur mon super site !
Vous allez adorer ici, c'est un site génial qui va parler de... euh... Je cherche encore un peu le thème de mon site. :-D
<!-- Le pied de page -->
id="pied_de_page"
Copyright moi, tous droits réservés
Pensez votre contenu web en blocs fonctionnels
Le principe de fonctionnement des inclusions en PHP est plutôt simple à comprendre. Vous avez un site web composé de, disons, vingt pages. Sur chaque page, il y a un menu, toujours le même. Pourquoi ne pas écrire ce menu (et seulement lui) une seule fois dans une page header.php
?
Maintenant, imaginez que vous ayez besoin de fonctions ou de variables sur toutes les pages du site.
Créons un nouveau fichier PHP : nous allons insérer uniquement le code HTML correspondant à votre menu, comme ceci :
id="menu"
class="element_menu"
Titre menu
href="page1.html"Lien
href="page2.html"Lien
href="page3.html"Lien
Faites de même pour la page pied_de_page.php
et toute autre page utile, en fonction des besoins de votre site.
Mais… la page headers.php
ne contient pas le moindre code PHP… c'est normal ?
En théorie, vous pourriez très bien enregistrer votre page avec l'extension .html
: header.html
.
Maintenant que vos « morceaux de pages » sont prêts :
Reprenez les pages de votre site, par exemple la page d'accueil nommée
index.php
.Remplacez le menu par le code PHP suivant :
<?php require_once(__DIR__ . '/header.php'); ?>
Cette instruction ordonne à l'ordinateur :
« Insère ici le contenu de la page
header.php
».
Si nous reprenons le code que nous avons vu tout à l'heure et que nous remplaçons chaque code répétitif par un require_once(__DIR__ . '/header.php');
(lignes 10, 12 et 27), cela donne le code source suivant :
<!DOCTYPE html>
charset="utf-8"
Mon super site
<?php require_once(__DIR__ . 'header.php'); ?>
<!-- Le corps -->
id="corps"
Mon super site
Bienvenue sur mon super site !
Vous allez adorer ici, c'est un site génial qui va parler de... euh... Je cherche encore un peu le thème de mon site. :-D
<!-- Le pied de page -->
<?php require_once(__DIR__ . 'footer.php'); ?>
Nous avons vu que la page PHP était générée ; donc la question que vous devez vous poser est : que reçoit le visiteur ? Eh bien, il reçoit exactement le même code qu'avant !
La page finale que reçoit le visiteur est identique à celle que je vous ai montrée au début du chapitre… mais vous, vous avez énormément gagné en flexibilité, puisque votre code n'est plus recopié 150 fois inutilement.
Le nombre de require_once
par page n'est pas limité ; par conséquent, vous pouvez découper votre code en autant de sous-parties que vous le souhaitez !
Réorganisez votre site de recettes
Bon, appliquons ce que nous venons d'apprendre à notre projet, maintenant !
Nous avons besoin de fonctions et de variables pour afficher la liste de nos articles, et puisque nous aurons peut être besoin de les réutiliser (surtout les fonctions), nous allons également extraire ces concepts dans leurs propres fichiers.
Nous aurons donc deux fichiers, variables.php
et functions.php
, qui contiendront respectivement les variables et les fonctions de notre projet :
<?php
$users = [
[
'full_name' => 'Mickaël Andrieu',
'email' => 'mickael.andrieu@exemple.com',
'age' => 34,
],
[
'full_name' => 'Mathieu Nebra',
'email' => 'mathieu.nebra@exemple.com',
'age' => 34,
],
[
'full_name' => 'Laurène Castor',
'email' => 'laurene.castor@exemple.com',
'age' => 28,
],
];
$recipes = [
[
'title' => 'Cassoulet',
'recipe' => 'Etape 1 : des flageolets !',
'author' => 'mickael.andrieu@exemple.com',
'is_enabled' => true,
],
[
'title' => 'Couscous',
'recipe' => 'Etape 1 : de la semoule',
'author' => 'mickael.andrieu@exemple.com',
'is_enabled' => false,
],
[
'title' => 'Escalope milanaise',
'recipe' => 'Etape 1 : prenez une belle escalope',
'author' => 'mathieu.nebra@exemple.com',
'is_enabled' => true,
],
[
'title' => 'Salade Romaine',
'recipe' => 'Etape 1 : prenez une belle salade',
'author' => 'laurene.castor@exemple.com',
'is_enabled' => false,
],
];
<?php
function displayAuthor(string $authorEmail, array $users): string
{
foreach ($users as $user) {
if ($authorEmail === $user['email']) {
return $user['full_name'] . '(' . $user['age'] . ' ans)';
}
}
return 'Auteur inconnu';
}
function isValidRecipe(array $recipe): bool
{
if (array_key_exists('is_enabled', $recipe)) {
$isEnabled = $recipe['is_enabled'];
} else {
$isEnabled = false;
}
return $isEnabled;
}
function getRecipes(array $recipes): array
{
$valid_recipes = [];
foreach ($recipes as $recipe) {
if (isValidRecipe($recipe)) {
$valid_recipes[] = $recipe;
}
}
return $valid_recipes;
}
Codez l'en-tête du site
Ensuite, nous aurons évidemment un en-tête de site avec un menu et un titre :
<!-- header.php -->
class="navbar navbar-expand-lg navbar-light bg-light"
class="container-fluid"
class="navbar-brand" href="index.php"Site de recettes
class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"
class="navbar-toggler-icon"
class="collapse navbar-collapse" id="navbarSupportedContent"
class="navbar-nav me-auto mb-2 mb-lg-0"
class="nav-item"
class="nav-link active" aria-current="page" href="index.php"Home
class="nav-item"
class="nav-link" href="contact.php"Contact
Le menu est basique pour l'instant, mais il vous permet de passer de la page d'accueil à la page de contact, par exemple.
Il est un peu compliqué à comprendre, ton code HTML, non ?
Oui, la partie visuelle est assurée par le framework CSS Bootstrap 5 : il n'est pas nécessaire de le connaître pour suivre ce cours. Gardez juste en tête que chacune des classes ajoutées va permettre de concevoir la page correctement. Mais si cela vous ennuie, supprimez toutes les classes et le projet restera fonctionnel, c'est promis !
Codez le pied de page du site
Cette partie du site reste "ferrée" en bas de page, et contient quelques liens et surtout les conditions d'utilisation du site (les fameux "copyrights") :
class="bg-light text-center text-lg-start mt-auto"
class="text-center p-3"
© 2021 Copyright:
class="text-dark" href="https://openclassrooms.com/"OpenClassrooms
Codez le corps de la page d'accueil du site
Maintenant, nous pouvons reprendre ce que nous avions construit ensemble dans les chapitres précédents. Nous allons avoir besoin d'inclure nos variables et nos fonctions :
<?php
require_once(__DIR__ . '/variables.php');
require_once(__DIR__ . '/functions.php');
?>
<!DOCTYPE html>
charset="UTF-8"
http-equiv="X-UA-Compatible" content="IE=edge"
name="viewport" content="width=device-width, initial-scale=1.0"
Site de recettes - Page d'accueil
href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
class="d-flex flex-column min-vh-100"
class="container"
<!-- inclusion de l'entête du site -->
<?php require_once(__DIR__ . '/header.php'); ?>
Site de recettes
<?php foreach (getRecipes($recipes) as $recipe) : ?>
<?php echo $recipe['title']; ?>
<?php echo $recipe['recipe']; ?>
<?php echo displayAuthor($recipe['author'], $users); ?>
<?php endforeach ?>
<!-- inclusion du bas de page du site -->
<?php require_once(__DIR__ . '/footer.php'); ?>
Pressé(e) de voir le résultat ?
Codez le corps de la page de contact du site
En bonus, nous pourrions ajouter un simple formulaire HTML.
Nous verrons dans les prochains chapitres comment les traiter avec PHP de manière à avoir une navigation fonctionnelle.
Rien d'extraordinaire, voici la page de contact à ce stade du projet :
<!DOCTYPE html>
charset="UTF-8"
http-equiv="X-UA-Compatible" content="IE=edge"
name="viewport" content="width=device-width, initial-scale=1.0"
Site de Recettes - Page d'accueil
href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
class="d-flex flex-column min-vh-100"
class="container"
<?php require_once(__DIR__ . '/header.php'); ?>
Contactez nous
class="mb-3"
for="email" class="form-label"Email
type="email" class="form-control" id="email" name="email" aria-describedby="email-help"
id="email-help" class="form-text"Nous ne revendrons pas votre email.
class="mb-3"
for="message" class="form-label"Votre message
class="form-control" placeholder="Exprimez vous" id="message" name="message"
type="submit" class="btn btn-primary"Envoyer
<?php require_once(__DIR__ . '/footer.php'); ?>
Pour un résultat visuel incroyable !
Exercez-vous
Testez le code de notre projet fil rouge !
Vérifiez si la page d’accueil s’affiche avec les deux recettes.
En cliquant sur le lien 'Contact' dans le menu, vous devriez voir le formulaire s'afficher.
En résumé
Une page PHP peut inclure une autre page (ou un morceau de page) grâce à l'instruction
require_once
.L'instruction
require_once
sera remplacée par le contenu de la page demandée.Cette technique, très simple à mettre en place, permet par exemple de placer les menus de son site dans un fichier
header.php
que l'on inclura dans toutes les pages. Cela permet de centraliser le code des menus, alors qu'on était auparavant obligés de le copier dans chaque page sur nos sites statiques en HTML et CSS.
C'est la fin de cette partie du cours, ouf ! Avant de passer à la suite, testez vos connaissances avec le quiz.