14. View

Notre classe View

Nous allons créer une classe  View.php  (dans src/model) qui va s'occuper de la gestion de nos vues.
Voici notre classe  View  : 

<?php

namespace App\src\model;

class View
{
    private $file;
    private $title;

    public function render($template, $data = [])
    {
        $this->file = '../templates/'.$template.'.php';
        $content  = $this->renderFile($this->file, $data);
        $view = $this->renderFile('../templates/base.php', [
            'title' => $this->title,
            'content' => $content
        ]);
        echo $view;
    }

    private function renderFile($file, $data)
    {
        if(file_exists($file)){
            extract($data);
            ob_start();
            require $file;
            return ob_get_clean();
        }
        header('Location: index.php?route=notFound');
    }
}

À partir de maintenant, je donnerais de moins en moins d'explications pour que vous puissiez aussi chercher à comprendre comment ça fonctionne 😀

Tu nous expliques ce que fait ce fichier ?

Qu'est-ce que je viens de dire plus haut ? 😤

Je vous laisse essayer de comprendre ce que font chacune de ces méthodes.

On va adapter nos contrôleurs en conséquence :

FrontController.php

<?php

namespace App\src\controller;
use App\src\DAO\ArticleDAO;
use App\src\DAO\CommentDAO;
use App\src\model\View;

class FrontController
{
    private $articleDAO;
    private $commentDAO;
    private $view;

    public function __construct()
    {
        $this->articleDAO = new ArticleDAO();
        $this->commentDAO = new CommentDAO();
        $this->view = new View();
    }

    public function home()
    {
        $articles = $this->articleDAO->getArticles();
        return $this->view->render('home', [
            'articles' => $articles
        ]);
    }

    public function article($articleId)
    {
        $article = $this->articleDAO->getArticle($articleId);
        $comments = $this->commentDAO->getCommentsFromArticle($articleId);
        return $this->view->render('single', [
            'article' => $article,
            'comments' => $comments
        ]);
    }
}

Actualisez votre page web 😁

Ça ne marche plus 😢

Eh oui, à votre avis, pour quelle raison est-ce que ça ne fonctionne plus ?

Pour ceux qui ont bien regardé la classe  View  ,  on indique un fichier qui s'appelle  base.php  , mais celui-ci n'a jamais été créé.

Eh bien, allons-y 😀

 

Un template de base

Je pense que vous l'avez remarqué, on répète plusieurs fois dans nos vues la structure html de base. On va donc la centraliser dans le fichier  base.php  : 

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8" />
    <title><?= $title ?></title>
</head>
<body>
    <div id="content">
        <?= $content ?>
    </div>
</body>
</html>

On adapte nos deux fichiers  home.php  et  single.php  :

home.php

<?php $this->title = "Accueil"; ?>

<h1>Mon blog</h1>
<p>En construction</p>
<?php
foreach ($articles as $article)
{
    ?>
    <div>
        <h2><a href="../public/index.php?route=article&articleId=<?= htmlspecialchars($article->getId());?>"><?= htmlspecialchars($article->getTitle());?></a></h2>
        <p><?= htmlspecialchars($article->getContent());?></p>
        <p><?= htmlspecialchars($article->getAuthor());?></p>
        <p>Créé le : <?= htmlspecialchars($article->getCreatedAt());?></p>
    </div>
    <br>
    <?php
}
?>

single.php

<?php $this->title = "Article"; ?>
<h1>Mon blog</h1>
<p>En construction</p>
<div>
    <h2><?= htmlspecialchars($article->getTitle());?></h2>
    <p><?= htmlspecialchars($article->getContent());?></p>
    <p><?= htmlspecialchars($article->getAuthor());?></p>
    <p>Créé le : <?= htmlspecialchars($article->getCreatedAt());?></p>
</div>
<br>
<a href="../public/index.php">Retour à l'accueil</a>
<div id="comments" class="text-left" style="margin-left: 50px">
    <h3>Commentaires</h3>
    <?php
    foreach ($comments as $comment)
    {
        ?>
        <h4><?= htmlspecialchars($comment->getPseudo());?></h4>
        <p><?= htmlspecialchars($comment->getContent());?></p>
        <p>Posté le <?= htmlspecialchars($comment->getCreatedAt());?></p>
        <?php
    }
    ?>
</div>

Et voilà le travail 😏

Je vous laisse adapter le contrôleur  ErrorController  ainsi que les vues que vous avez crées.

 

Bilan

Dans ce chapitre, nous avons mis en place une classe View qui s'occupe de gérer nos fichiers de template.

Vous pouvez retrouver le code associé à ce chapitre sur GitHub.