Notre code est maintenant découpé en 3 fichiers :
Un pour le traitement PHP : il récupère les données de la base. On l'appelle le modèle.
Un pour l'affichage : il affiche les informations dans une page HTML. On l'appelle la vue.
Un pour faire le lien entre les deux : on l'appelle le contrôleur.
Cette structure est bonne, mais nous allons faire quelques améliorations cosmétiques. Ce ne sont peut-être que des détails pour vous, mais ça fera une vraie différence à la fin.
Voici ce que nous allons améliorer :
l'anglais ;
la balise de fermeture PHP ;
l'utilisation de short open tags.
Je vous présente le code amélioré. Nous le commenterons un peu ensuite.
Découvrez le code amélioré
index.php
<?php
require('src/model.php');
$posts = getPosts();
require('templates/homepage.php');
Vous constaterez que j'ai enlevé la balise de fermeture?>
à la fin du fichier. Plus fou encore, je vais vous dire que c'est... une amélioration.
Les développeurs professionnels enlèvent en effet la balise de fermeture PHP dans les pages qui ne contiennent que du PHP. Sans rentrer dans les détails, ça permet d'éviter que ces fichiers n'envoient par erreur du code HTML sous forme d'espaces blancs alors qu'ils ne devraient pas. Faites-moi confiance et retirez ce?>
si votre fichier ne contient que du PHP. Et si vous ne me faites pas confiance, lisez la recommandation officielle appelée PSR-12 qui dit :
The closing
?>
tag MUST be omitted from files containing only PHP.
Rassurez-vous, PHP sait que la balise se ferme à la fin du fichier (il n'y a pas le choix de toute façon !).
src/model.php
<?php
function getPosts() {
// We connect to the database.
try {
$database = new PDO('mysql:host=localhost;dbname=blog;charset=utf8', 'blog', 'password');
} catch(Exception $e) {
die('Erreur : '.$e->getMessage());
}
// We retrieve the 5 last blog posts.
$statement = $database->query(
"SELECT id, title, content, DATE_FORMAT(creation_date, '%d/%m/%Y à %Hh%imin%ss') AS french_creation_date FROM posts ORDER BY creation_date DESC LIMIT 0, 5"
);
$posts = [];
while (($row = $statement->fetch())) {
$post = [
'title' => $row['title'],
'french_creation_date' => $row['french_creation_date'],
'content' => $row['content'],
];
$posts[] = $post;
}
return $posts;
}
Dans le modèle, les requêtes se font depuis une base de données en anglais (j'ai renommé les noms des champs en base).
templates/homepage.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Le blog de l'AVBN</title>
<link href="style.css" rel="stylesheet" />
</head>
<body>
<h1>Le super blog de l'AVBN !</h1>
<p>Derniers billets du blog :</p>
<?php
foreach ($posts as $post) {
?>
<div class="news">
<h3>
<?= htmlspecialchars($post['title']); ?>
<em>le <?= $post['french_creation_date']; ?></em>
</h3>
<p>
<?= nl2br(htmlspecialchars($post['content'])); ?>
<br />
<em><a href="#">Commentaires</a></em>
</p>
</div>
<?php
}
?>
</body>
</html>
Ce n'est pas obligatoire, mais j'en profite pour faire découvrir les short echo tags. C'est un raccourci en PHP pour faciliter la lisibilité du code. Ainsi, par exemple :
<?php echo htmlspecialchars($post['title']); ?>
... est devenu :
<?= htmlspecialchars($post['title']) ?>
Cela permet d'éviter d'avoir à écrireecho
quand on souhaite juste afficher une variable. Le but est d'être plus lisible dans la vue en enlevant le maximum de code PHP là-dedans (même si on ne peut pas tout enlever).
La base de données
Pour avoir du code uniquement en anglais, j'ai dû renommer ma base de données en anglais. Pour l'instant, nous avons une seule table posts
qui doit représenter les posts de blog.
Il y a 4 champs, nommés en anglais :
id
(integer)title
(varchar)content
(text)creation_date
(datetime)
Cette table vous prendra 30 secondes à créer maximum. 😉
Sachez que vous pouvez aussi renommer votre table et ses champs depuis phpMyAdmin, pour ne pas avoir à en créer une nouvelle.
Récapitulons en vidéo
Exercez-vous
Vous pensez avoir retenu ces quelques finitions ? Il est temps de refaire les modifications par vous-même.
En résumé
Il est recommandé de garder uniquement la balise ouvrante
<?php
dans les fichiers qui contiennent seulement du PHP. Ceux qui contiennent aussi du HTML ne changent pas.La syntaxe des "short open tags" peut être utilisée pour avoir des gabarits d'affichage plus concis.
En tant que développeur PHP, vous êtes aussi responsable de la bonne gestion de la base de données. Vous pouvez la traiter comme votre code : des noms clairs, de l'anglais…
Et voilà pour cette première partie de cours. Vous pouvez dès à présent mettre à l'épreuve vos connaissances à travers le quiz ! Si vous avez des doutes, n'hésitez pas à relire certains chapitres. Essayez aussi de repartir du code de la toute première étape et de l'améliorer sans lire le cours !