• 15 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 11/06/2019

[Nouvelle fonctionnalité] Ajouter des commentaires

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Bon, maintenant qu'on a réorganisé pas mal notre code, reprenons un peu la pratique. Cette fois, on aimerait permettre aux lecteurs d'ajouter des commentaires sur les billets. Que faut-il faire ?

Vous devriez commencer à avoir l'habitude. Ce sera une bonne occasion de pratiquer ! On va faire les choses dans cet ordre :

  1. Ecrire le modèle (et créer au besoin des tables en base).

  2. Ecrire le contrôleur, pour récupérer les informations et les envoyer à la vue.

  3. Ecrire la vue, pour afficher les informations.

  4. Mettre à jour le routeur, pour envoyer vers le bon contrôleur.

Voyons voir comment ça se passe en pratique !

Ecriture du modèle

Il suffit de rajouter une petite fonction  addComment  dans  model/frontend.php  qui ajoute un commentaire en base :

<?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

Le reste des informations (l'ID du commentaire, la date) sera généré automatiquement.

Ecriture 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 :

<?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);
    }
}

Vous noterez qu'on teste le retour de la requête. Normalement, celle-ci renvoie le nombre de lignes impactées par la requête ou "false" s'il y a eu une erreur. On teste donc s'il y a eu une erreur, et on arrête tout (avec un  die  ) si jamais il y a eu un souci.

Si tout va bien, il n'y a aucune page à afficher. Les données ont été insérées, on redirige donc le visiteur vers la page du billet pour qu'il puisse voir son beau commentaire qui vient d'être inséré ! 😍

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 !

<!-- ... -->

<h2>Commentaires</h2>

<form action="index.php?action=addComment&amp;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>

<!-- ... -->

Rien de spécial, c'est un formulaire quoi. 😅

Il faut juste bien écrire l'URL vers laquelle le formulaire est censé envoyer. Ici, vous voyez que j'envoie vers une action addComment. Hum... ça me fait penser qu'on n'a pas encore écrit le routeur qui appelle le contrôleur ! 🤔

Mise à jour du routeur

Bon on y est presque. 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 !

<?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();
}

Ouah ! Eh, il devient dur à lire ce routeur non ?

C'est vrai qu'avec tous ces if imbriqués, ça commence à faire beaucoup... mais il n'y a pas trop le choix. Ceci dit, il y a une meilleure façon de gérer les erreurs, on va en reparler dans un prochain chapitre. 😉

Comme vous pouvez le voir, je teste si on a bien un ID de billet, mais aussi si un nom d'auteur et un message ont bien été envoyés. Si c'est le cas, j'appelle le contrôleur  addComment  , qui appelle le modèle pour enregistrer les informations en base. Ah, c'est beau quand tout est bien organisé ! 😄

Essayez !

Voici le nouveau code au complet !

https://www.codevolve.com/api/v1/publishable_key/2A9CAA3419124E3E8C3F5AFCE5306292?content_id=4c70d69d-15b2-49c0-843f-81c1d97c6b6f

Exemple de certificat de réussite
Exemple de certificat de réussite