• Aucun résultat trouvé

Maintenant que nous avons nos données en provenance du model, ainsi que la logique applicative et les flux définis par notre controller, nous allons créer une vue pour l’action « index » que nous avons créé ci-dessus.

Les vues de CakePHP sont juste des fragments de présentation « assaisonnée », qui s’intègrent au sein d’un layout applicatif. Pour la plupart des applications, elles sont un mélange de HTML et PHP, mais les vues peuvent aussi être constituées de XML, CSV ou même de données binaires.

Un Layout est un code de présentation, encapsulé autour d’une vue. Ils peuvent être définis et interchangés, mais pour le moment, utilisons juste celui par défaut.

Vous souvenez-vous, dans la dernière section, comment nous avions assigné la variable “articles” à la vue en utilisant la méthode set() ? Cela devrait transmettre l’objet query à la vue pour être invoqué par une itération foreach. Les fichiers de template de CakePHP sont stockés dans src/Template à l’intérieur d’un dossier dont le nom correspond à celui du controller (nous aurons à créer un dossier appelé “Articles” dans ce cas). Pour mettre en forme les données de ces articles dans un joli tableau, le code de notre vue devrait ressembler à quelque chose comme cela :

<!-- File: src/Template/Articles/index.ctp --> <h1>Tous les articles du Blog</h1>

<table> <tr> <th>Id</th> <th>Title</th> <th>Created</th> </tr>

<!-- Ici se trouve l'itération sur l'objet query de nos $articles, l'affichage ˓→des infos des articles -->

<?php foreach ($articles as $article): ?> <tr>

<td><?= $article->id ?></td> <td>

<?= $this->Html->link($article->title, ['action' => 'view', $article-> ˓→id]) ?>

</td> <td>

<?= $article->created->format(DATE_RFC850) ?> </td>

</tr>

<?php endforeach; ?> </table>

Espérons que cela vous semble simple.

Vous avez sans doute remarqué l’utilisation d’un objet appelé $this->Html. C’est une instance de la classe Ca- kePHPCake\View\Helper\HtmlHelper. CakePHP est livré avec un ensemble de « helpers » (des assistants) pour les vues, qui réalisent en un clin d’œil des choses comme le « linking » (mettre les liens dans un texte), l’affi- chage des formulaires, du JavaScript et de l’AJAX. Vous pouvez en apprendre plus sur la manière de les utiliser dans le chapitreHelpers (Assistants), mais ce qu’il est important de noter ici, c’est que la méthode link() génèrera un lien HTML à partir d’un titre (le premier paramètre) et d’une URL (le second paramètre).

Lorsque vous indiquez des URLs dans CakePHP, il est recommandé d’utiliser les tableaux. Ceci est expliqué dans le chapitre des Routes. Utiliser les tableaux dans les URLs vous permet de tirer profit des capacités de CakePHP à ré-inverser les routes. Vous pouvez aussi utiliser les URLs relatives depuis la base de l’application sous la forme /controller/action/param1/param2ou en utilisant lesroutes nommées.

A ce stade, vous devriez être en mesure de pointer votre navigateur sur la pagehttp://www.exemple.com/articles/index. Vous devriez voir votre vue, correctement formatée avec le titre et le tableau listant les articles.

Si vous avez essayé de cliquer sur l’un des liens que nous avons créés dans cette vue (le lien sur le titre d’un article mène à l’URL /articles/view/un_id_quelconque), vous avez sûrement été informé par CakePHP que l’action n’a pas encore été définie. Si vous n’avez pas été informé, soit quelque chose s’est mal passé, soit en fait vous aviez déjà défini l’action, auquel cas vous êtes vraiment sournois ! Sinon, nous allons la créer sans plus tarder dans le Controller Articles :

// src/Controller/ArticlesController.php namespace App\Controller;

use App\Controller\AppController;

class ArticlesController extends AppController {

public function index() {

$this->set('articles', $this->Articles->find('all')); }

public function view($id = null) {

$article = $this->Articles->get($id); $this->set(compact('article')); }

L’appel de set() devrait vous être familier. Notez que nous utilisons get() plutôt que find('all') parce que nous voulons seulement récupérer les informations d’un seul article.

Notez que notre action « view » prend un paramètre : l’ID de l’article que nous aimerions voir. Ce paramètre est transmis à l’action grâce à l’URL demandée. Si un utilisateur demande /articles/view/3, alors la valeur “3” est transmise à la variable $id.

Nous faisons aussi une petite vérification d’erreurs pour nous assurer qu’un utilisateur accède bien à l’enregistre- ment. Si un utilisateur requête /articles/view, nous lancerons un NotFoundException et laisserons le Gestionnaire d’Erreur de CakePHP ErrorHandler prendre le dessus. En utilisant la fonction get() dans la table Articles, nous faisons aussi une vérification similaire pour nous assurer que l’utilisateur a accès à l’enregistrement qui existe. Dans le cas où l’article requêté n’est pas présent dans la base de données, la fonction get() va lancer une NotFoundException.

Maintenant, créons la vue pour notre nouvelle action “view” et plaçons-la dans src/Template/Articles/view.ctp.

<!-- File: src/Template/Articles/view.ctp -->

<h1><?= h($article->title) ?></h1> <p><?= h($article->body) ?></p>

<p><small>Created: <?= $article->created->format(DATE_RFC850) ?></small></p>

Vérifiez que cela fonctionne en testant les liens de la page /articles/index ou en affichant manuellement un article via /articles/view/{id}.