Solution
Utilisez une architecture MVC en PHP : Solution de la mise en pratique
Modifier des commentaires
Cette fois, on aimerait permettre aux lecteurs de modifier des commentaires sur les billets. Que faut-il faire ? On va faire les choses dans cet ordre :- Écrire le modèle.
- É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.
1. Ecriture du modèle
Il suffit d'ajouter une fonction changeComment dans model/CommentManager.php qui ajoute un commentaire en base :model/frontend.php :
<?php
//...
public function changeComment($postId, $author, $comment) {
$db = dbConnect();
$comments = $db->prepare('UPDATE comments SET comment = ?, author = ?, comment_date = NOW() WHERE post_id = ? LIMIT 1";
$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 commentaire
- Le nom de l'auteur
- Le contenu du nouveau commentaire
2. É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 changeComment($postId, $author, $comment) {
$affectedLines = postComment($postId, $author, $comment);
if ($affectedLines === false) {
die('Impossible de modifier le commentaire !');
}
else {
header('Location: index.php?action=post&id=' . $postId);
}
}
3. Mise à jour de la vue
Il faut aussi modifier un peu la vue qui affiche un billet et ses commentaires (view/frontend/listPostsView.php). En effet, nous devons ajouter le lien vers le formulaire pour pouvoir modifier des commentaires !view/frontend/listPostsView.php :
<?php $title = 'Mon blog'; ?>
<?php ob_start(); ?>
<h1>Mon super blog !</h1>
<p>Derniers billets du blog :</p>
<?php
while ($data = $posts->fetch()) {
?>
<div class="news">
<h3>
<?= htmlspecialchars($data['title']) ?>
<em>le <?= $data['creation_date_fr'] ?></em>
(<a href="post.php?id=<?= $data['id'] ?>">modifier</a>)
</h3>
<p>
<?= nl2br(htmlspecialchars($data['content'])) ?>
<br>
<em><a href="post.php?id=<?= $data['id'] ?>">Commentaires</a></em>
</p>
</div>
<?php
}
$posts->closeCursor();
?>
<?php $content = ob_get_clean(); ?>
<?php require('view/frontend/template.php'); ?>
4. Mise à jour du routeur
Ajoutons un elseif dans notre routeur (index.php) pour appeler le nouveau contrôleur changeComment 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'] == 'changeComment') {
if (isset($_GET['id']) && $_GET['id'] > 0) {
if (!empty($_POST['author']) && !empty($_POST['comment'])) {
changeComment($_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();
}