• Aucun résultat trouvé

Récupérer les Bookmarks avec un Tag Spécifique

Maintenant que vous avez stocké les mots de passe de façon sécurisé, nous pouvons construire quelques fonctionnalités intéressantes dans notre application. Une fois que vous avez une collection de bookmarks, il peut être pratique de pouvoir les chercher par tag. Ensuite nous allons intégrer une route, une action de controller, et une méthode finder pour chercher les bookmarks par tag.

Idéalement, nous aurions une URL qui ressemble à http ://localhost :8765/bookmarks/tagged/funny/cat/gifs Cela nous aide à trouver tous les bookmarks qui ont les tags “funny”, “cat” ou “gifs”. Avant de pouvoir intégrer ceci, nous allons ajouter une nouvelle route. Votre fichier config/routes.php doit ressembler à ceci :

<?php

use Cake\Routing\Route\DashedRoute;

use Cake\Routing\Router;

Router::defaultRouteClass(DashedRoute::class);

// Nouvelle route ajoutée pour notre action "tagged".

// Le caractère `*` en fin de chaîne indique à CakePHP que cette action a // des paramètres passés

Router::scope(

'/bookmarks',

['controller' => 'Bookmarks'], function ($routes) {

$routes->connect('/tagged/*', ['action' => 'tags']); }

);

Router::scope('/', function ($routes) {

// Connecte la page d'accueil par défaut et les routes /pages/*. $routes->connect('/', [

'controller' => 'Pages',

'action' => 'display', 'home'

]);

$routes->connect('/pages/*', [

'controller' => 'Pages',

'action' => 'display'

]);

// Connecte les routes basées sur les conventions par défaut. $routes->fallbacks();

});

Ce qui est au-dessus définit une nouvelle “route” qui connecte le chemin /bookmarks/tagged/*, vers BookmarksController::tags(). En définissant les routes, vous pouvez isoler la définition de vos URLs, de la façon dont elles sont intégrées. Si nous visitions http ://localhost :8765/bookmarks/tagged, nous verrions une page d’erreur de CakePHP. Intégrons maintenant la méthode manquante. Dans src/Controller/BookmarksController.php, ajoutez ce qui suit :

public function tags() {

// La clé 'pass' est fournie par CakePHP et contient tous les segments // d'URL de la "request" (instance de \Cake\Network\Request)

$tags = $this->request->getParam('pass');

// On utilise l'objet "Bookmarks" (une instance de

// \App\Model\Table\BookmarksTable) pour récupérer les bookmarks avec // ces tags

$bookmarks = $this->Bookmarks->find('tagged', [

'tags' => $tags ]);

// Passe les variables au template de vue (view). $this->set([

'bookmarks' => $bookmarks,

'tags' => $tags ]);

}

Pour accéder aux autres parties des données de la « request », référez-vous à la sectionServerRequest.

Créer la Méthode Finder

Dans CakePHP, nous aimons garder les actions de notre controller légères, et mettre la plupart de la lo- gique de notre application dans les models. Si vous visitez l’URL /bookmarks/tagged maintenant, vous ver- rez une erreur comme quoi la méthode findTagged() n’a pas été encore intégrée, donc faisons-le. Dans src/Model/Table/BookmarksTable.php ajoutez ce qui suit :

// L'argument $query est une instance de \Cake\ORM\Query.

// Le tableau $options contiendra les tags que nous avons passé à find('tagged') // dans l'action de notre Controller

public function findTagged(Query $query, array $options) {

$bookmarks = $this->find()

->select(['id', 'url', 'title', 'description']);

if (empty($options['tags'])) { $bookmarks

->leftJoinWith('Tags')

->where(['Tags.title IS' => null]);

} else {

$bookmarks

->innerJoinWith('Tags')

->where(['Tags.title IN ' => $options['tags']]); }

return $bookmarks->group(['Bookmarks.id']); }

Nous intégrons justedes finders personnalisés. C’est un concept très puissant dans CakePHP qui vous permet de faire un package réutilisable de vos requêtes. Les finders attendent toujours un objetQuery Builder et un tableau d’options en paramètre. Les finders peuvent manipuler les requêtes et ajouter n’importe quels conditions ou critères. Une fois qu’ils ont terminé, les finders doivent retourner l’objet Query modifié. Dans notre finder nous avons amené les méthodes innerJoinWith(), where() et group() qui nous permet de trouver les bookmarks distinct qui ont un tag correspondante. Lorsque aucune tag n’est fournie, nous utilisons un leftJoinWith() et modifions la condition “where”, en trouvant des bookmarks sans tags.

Créer la Vue

Maintenant si vous vous rendez à l’url /bookmarks/tagged, CakePHP va afficher une erreur vous disant que vous n’avez pas de fichier de vue. Construisons donc le fichier de vue pour notre action tags(). Dans src/Template/Bookmarks/tags.ctp mettez le contenu suivant :

<h1>

Bookmarks tagged with

<?= $this->Text->toList(h($tags)) ?> </h1>

<section>

<?php foreach ($bookmarks as $bookmark): ?> <article>

<!-- Utilise le HtmlHelper pour créer un lien -->

<h4><?= $this->Html->link($bookmark->title, $bookmark->url) ?></h4> <small><?= h($bookmark->url) ?></small>

<!-- Utilise le TextHelper pour formater le texte -->

<?= $this->Text->autoParagraph(h($bookmark->description)) ?> </article>

<?php endforeach; ?> </section>

Dans le code ci-dessus, nous utilisons leHelper HTMLet leHelper Textpour aider à la génération du contenu de notre vue. Nous utilisons également la fonctionhpour encoder la sortie en HTML. Vous devez vous rappeler de toujours utiliser h() lorsque vous affichez des données provenant des utilisateurs pour éviter les problèmes d’injection HTML. Le fichier tags.ctp que nous venons de créer suit la convention de nommage de CakePHP pour un ficher de template de vue. La convention d’avoir le nom de template en minuscule et en underscore du nom de l’action du controller. Vous avez peut-être remarqué que nous pouvions utiliser les variables $tags et $bookmarks dans notre vue. Quand nous utilisons la méthode set() dans notre controller, nous définissons les variables spécifiques à envoyer à la vue. La vue va rendre disponible toutes les variables passées dans les templates en variables locales.

Vous devriez maintenant pouvoir visiter l’URL /bookmarks/tagged/funny et voir tous les bookmarks taggés avec “funny”.

Ainsi nous avons créé une application basique pour gérer des bookmarks, des tags et des users. Cependant, tout le monde peut voir tous les tags de tout le monde. Dans le prochain chapitre, nous allons intégrer une authentification et restreindre la visibilité des bookmarks à ceux qui appartiennent à l’utilisateur courant.

Maintenant continuons avec Tutoriel de Bookmarker Part 2 pour construire votre application ou plongez dans la documentation pour en apprendre plus sur ce que CakePHP peut faire pour vous.