Nouvelle fonctionnalité
Utilisez une architecture MVC en PHP : Proposer des commentaires
Ajouter des commentaires
Cette fois, on aimerait permettre aux lecteurs d'ajouter des commentaires sur les billets. Que faut-il faire ? On va faire les choses dans cet ordre :- Écrire le modèle (et créer au besoin des tables en base).
- Écrire le contrôleur, pour récupérer les informations et les envoyer à la vue.
- Écrire la vue, pour afficher les informations.
- Mettre à jour le routeur, pour envoyer vers le bon contrôleur.
Ecriture du modèle
Il suffit d'ajouter une petite fonction postComment dans model/frontend.php qui ajoute un commentaire en base :model/frontend.php :
<?php
//...
function postComment($postId, $author, $comment) {
$db = dbConnect();
$comments = $db->prepare('INSERT INTO comments(post_id, author, comment, comment_date) VALUES(?, ?, ?, NOW())');
$affectedLines = $comments->execute(array($postId, $author, $comment));
return $affectedLines;
}
Rien de bien sorcier. Il faut juste penser à récupérer en paramètres les informations dont on a besoin :
- L'ID du billet auquel se rapporte le commentaire
- Le nom de l'auteur
- Le contenu du commentaire
Écriture du contrôleur
Le contrôleur controller/frontend.php récupère lui aussi les informations dont on a besoin (id du billet, auteur, commentaire) et les transmet au modèle :controller/frontend.php
<?php
// ...
function addComment($postId, $author, $comment) {
$affectedLines = postComment($postId, $author, $comment);
if ($affectedLines === false) {
die('Impossible d\'ajouter le commentaire !');
}
else {
header('Location: index.php?action=post&id=' . $postId);
}
}
Mise à jour de la vue
Il faut aussi modifier un peu la vue qui affiche un billet et ses commentaires (view/frontend/postView.php). En effet, nous devons ajouter le formulaire pour pouvoir envoyer des commentaires !view/frontend/postView.php :
<!-- ... -->
<h2>Commentaires</h2>
<form action="index.php?action=addComment&id=<?= $post['id'] ?>" method="post">
<div>
<label for="author">Auteur</label><br>
<input type="text" id="author" name="author">
</div>
<div>
<label for="comment">Commentaire</label><br>
<textarea id="comment" name="comment"></textarea>
</div>
<div>
<input type="submit">
</div>
</form>
<!-- ... -->
Mise à jour du routeur
Ajoutons un elseif dans notre routeur (index.php) pour appeler le nouveau contrôleur addComment qu'on vient de créer, et on devrait avoir tout bon !index.php :
<?php
require('controller/frontend.php');
if (isset($_GET['action'])) {
if ($_GET['action'] == 'listPosts') {
listPosts();
}
elseif ($_GET['action'] == 'post') {
if (isset($_GET['id']) && $_GET['id'] > 0) {
post();
}
else {
echo 'Erreur : aucun identifiant de billet envoyé';
}
}
elseif ($_GET['action'] == 'addComment') {
if (isset($_GET['id']) && $_GET['id'] > 0) {
if (!empty($_POST['author']) && !empty($_POST['comment'])) {
addComment($_GET['id'], $_POST['author'], $_POST['comment']);
}
else {
echo 'Erreur : tous les champs ne sont pas remplis !';
}
}
else {
echo 'Erreur : aucun identifiant de billet envoyé';
}
}
}
else {
listPosts();
}