Easy-Micro

LANGAGE MVC PHP
Ajouter des commentaires

Utilisez une architecture MVC en PHP : Afficher des commentaires

Nouvelle table comments

Nouvelle table comments à ajouter dans votre base de données
Créé une table comments avec un champ id (integer), post_id (integer), author (varchar), comment (text) et comment_date (datetime)

Création du modèle

Maintenant, concentrons-nous sur le code du modèle. Pour l'instant, notre fichier model.php ne contient qu'une seule fonction getPosts qui récupère tous les derniers posts de blog. On va écrire 2 nouvelles fonctions :
  • getPost (au singulier !) : récupère un post précis en fonction de son ID.
  • getComments : récupère les commentaires associés à un ID de post.
model.php :
<?php
function getPosts() {
    $db = dbConnect();
    $req = $db->query('SELECT id, title, content, DATE_FORMAT(creation_date, \'%d/%m/%Y à %Hh%imin%ss\') AS creation_date_fr FROM posts ORDER BY creation_date DESC LIMIT 0, 5');

    return $req;
}

function getPost($postId) {
    $db = dbConnect();
    $req = $db->prepare('SELECT id, title, content, DATE_FORMAT(creation_date, \'%d/%m/%Y à %Hh%imin%ss\') AS creation_date_fr FROM posts WHERE id = ?');
    $req->execute(array($postId));
    $post = $req->fetch();

    return $post;
}

function getComments($postId) {
    $db = dbConnect();
    $comments = $db->prepare('SELECT id, author, comment, DATE_FORMAT(comment_date, \'%d/%m/%Y à %Hh%imin%ss\') AS comment_date_fr FROM comments WHERE post_id = ? ORDER BY comment_date DESC');
    $comments->execute(array($postId));

    return $comments;
}

// Nouvelle fonction qui nous permet d'éviter de répéter du code
function dbConnect() {
    try {
        $db = new PDO('mysql:host=localhost;dbname=mabase;charset=utf8', 'root', '');
        return $db;
    }
    catch(Exception $e) {
        die('Erreur : '.$e->getMessage());
    }
}

Ces deux premières nouvelles fonctions prennent un paramètre : l'id du post qu'on recherche. Cela nous permet notamment de ne sélectionner que les commentaires liés au post concerné.

Création du contrôleur

Nous avions déjà écrit un contrôleur index.php pour gérer la liste des derniers billets. Je vous propose d'écrire un autre contrôleur post.php qui affiche un post et ses commentaires.

post.php
<?php
require('model.php');

if (isset($_GET['id']) && $_GET['id'] > 0) {
    $post = getPost($_GET['id']);
    $comments = getComments($_GET['id']);
    require('postView.php');
}
else {
    echo 'Erreur : aucun identifiant de billet envoyé';
}

Création de la vue

Il nous faut maintenant créer cette vue postView.php qu'on appelle dans le contrôleur. C'est normalement facile si vous avez bien suivi jusqu'ici et ne devrait poser aucune difficulté.

postView.php
<!DOCTYPE html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <title>Mon blog</title>
        <link href="style.css" rel="stylesheet"> 
    </head>
    <body>
        <h1>Mon super blog !</h1>
        <p><a href="index.php">Retour à la liste des billets</a></p>

        <div class="news">
            <h3>
                <?= htmlspecialchars($post['title']) ?>
                <em>le <?= $post['creation_date_fr'] ?></em>
            </h3>
            
            <p>
                <?= nl2br(htmlspecialchars($post['content'])) ?>
            </p>
        </div>

        <h2>Commentaires</h2>

        <?php
        while ($comment = $comments->fetch()) {
        ?>
            <p><strong><?= htmlspecialchars($comment['author']) ?></strong> le <?= $comment['comment_date_fr'] ?></p>
            <p><?= nl2br(htmlspecialchars($comment['comment'])) ?></p>
        <?php
        }
        ?>
    </body>
</html>
Le code de indexView.php est dorénavant entièrement en anglais. Remarquez l'utilisation des "short open tags" en PHP pour faciliter la lisibilité du code : <?= ... ?> correspond à <?php echo ...; ?>

> Voir cet exemple Easy-Micro

« Prev - Architecture MVC en PHP - Next »


< Page précédente MVC PHP Page suivante >