Contents
Chapitre 8: Générer les modules Genre et Plateforme
Pour les genres et les plateformes, l’utilisateur ne peut faire que deux actions: voir la liste et voir la liste des jeux par genre/plateformes. Donc, à la place de générer un module Doctrine, nous allons générer un module vide, dans lequel nous coderons soit avec des copier/coller des codes précédents tout en les adaptant, soit en réécrivant tout à la main pour s’amuser à mieux connaître le framework.
Initialisation du module Genre et routing
Tout d’abord, initialisons notre module genre grâce à generate:module frontend genre. Nous allons d’abord nous occuper du routing. A votre avis, qu’est-ce que vous devez écrire?
Premièrement, nous n’avons pas besoin de créer une collection de routes. En effet, l’utilisateur ne peut pas éditer les genres ni les supprimer, cela sera réservé aux administrateurs. Donc, la plupart des routes générées par la collection nous seront inutiles.
genre: url: /genre param: {module: genre, action: index}
Bien entendu, comme executeIndex() vous envoie sur un module par défaut, vous ne verrez rien. Mais nous modifierons le code après avoir établi la route pour voir un genre en particulier.
En fait, il n’y a rien de bien nouveau: inspirez-vous de game_show_game.
genre_show_genre: url: /genre/:id/:name_genre_slug class: sfDoctrineRoute options: model: genre type: object param:genre action: show requirements: id: \d+ sf_method: [get]
Evidemment, comme l’action executeShow() n’est pas définie votre fichier actions.class.php, la route aboutira à une erreur. De plus, le slug n’a pas encore été défini, donc, faisons-le dans lib/model/doctrine/Genre.class.php:
public function getNameGenreSlug(){ return Videogames::slugify($this->getNameGenre()); }
actions.class.php
A présent, nous allons coder nos actions: executeIndex() et executeShow().
Nous devons afficher la liste de tous les genres, donc, nous allons simplement utiliser la méthode findAll() pour cela:
public function executeIndex(sfWebRequest $request) { $this->genres = Doctrine_Core::getTable('genre')->findAll(); }
Vous pouvez également personnaliser votre requête si vous voulez afficher les genres par ordre alphabétique. Dès lors, vous aurez cette fonction dans GenreTable.class.php (avec un nom différent que findAll()):
public static function findAllByNameAsc(){ $q = Doctrine_Query::create() ->select ('genre.*') ->from ('genre') ->orderby('genre.name_genre'); return $q->execute(); }
Dès lors, dans executeIndex(), vous aurez:
public function executeIndex(sfWebRequest $request) { $this->genres = Doctrine_Core::getTable('genre')->findAllByNameAsc(); }
A présent, je vous décris ce que nous allons trouver sous chaque fiche de genre: une liste des jeux avec le développeur, l’éditeur et la date de sortie. Donc, nous avons besoin de récupérer la liste des jeux qui appartiennent à ce genre.
Comme nous passons un paramètre id, il suffit de le récupérer pour l’utiliser pour l’objet « genre ». Ensuite, nous allons adopter une syntaxe similaire que pour les jeux: utiliser une méthode déjà existante qui renverra une collection d’objets « game »:
public function executeShow(sfWebRequest $request) { $id_genre = $request->getParameter('id'); $this->genre = Doctrine_Core::getTable('genre')->find(array($id_genre)); $this->games = $this->genre->getGames(); }
A présent, il reste à coder les templates.
indexSuccess.php et showSuccess.php
La template de l’index servira à lister les genres, donc, il s’agit d’une boucle foreach pour l’ensemble du tableau. N’oubliez pas le slot(‘title’) et de mettre dans les balises h1 le nom du genre:
<?php slot('title')?> <?php echo 'LLG: Genres' ?> <?php end_slot();?> <h1>Genres</h1> <span class="little">Choose a genre for listing all the games belonging to it.</span> <table> <tbody> <?php foreach ($genres as $genre): ?> <tr> <td><a href="<?php echo url_for('genre_show_genre',$genre) ?>"><?php echo $genre->getNameGenre() ?></a></td> </tr> <?php endforeach; ?> </tbody> </table> <a href="<?php echo url_for('@homepage') ?>">Games</a>
Quant à la fiche du genre, elle se présentera de cette manière:
<?php slot('title') ?> <?php echo sprintf('%s','LLG: '.$genre->getNameGenre()) ?> <?php end_slot(); ?> <h1><?php echo $genre->getNameGenre() ?></h1> <?php if(sizeof($games)>0): ?> <table> <tbody> <tr> <th>Game</th> <th>Developer</th> <th>Publisher</th> <th>Release Date</th> <?php foreach($games as $game): ?> <tr> <td><a href="<?php echo url_for('game_show_game',$game) ?>"><?php echo $game->getNameGame()?></a></td> <td><?php echo $game->getDeveloper() ?></td> <td><?php echo $game->getPublisher() ?></td> <td><?php echo $game->getReleaseDate() ?></td> </tr> <?php endforeach; ?> </tbody> </table> <?php else:?> <span>There are no games currently listed under this genre.<br>Return to:</span> <?php endif;?> <hr /> <a href="<?php echo url_for('@genre')?>">Genres</a> <a href="<?php echo url_for('@homepage')?>">Games</a>
Comme nous le remarquons, nous avons bien entendu mis un lien vers la fiche du jeu mais nous avons également mis un petit menu de navigation pour revenir vers la page d’accueil ou vers la liste des genres.
Notez également que le code contient une condition: s’il n’y a pas de jeux listés pour le genre (autrement dit, si le tableau d’objets « game » est nul), nous affichons un petit message d’erreur.
Liens vers les genres depuis la fiche du jeu
Nous pouvons également ajouter les liens vers les genres depuis la fiche du jeu (showSuccess.php dans le module game) pour les afficher:
<tr> <th>Genre:</th> <td> <?php foreach ($genres as $genre){ echo '<a href="'.url_for('genre_show_genre',$genre).'">'.$genre.'</a><br/>';} ?></td> </tr>
Nous pouvons également ajouter un lien vers la liste des genres:
<a href="<?php echo url_for('game/edit?id='.$game->getId()) ?>">Edit</a> <a href="<?php echo url_for('@homepage') ?>">List</a> <a href="<?php echo url_for('@genre') ?>">Genres</a>
A vous de jouer avec le module Plateforme!
Je vous laisse à présent faire le module plateforme! Rendez-vous à l’annexe 1 pour la solution.
Quelques spécificités
- L’acronyme doit être entre parenthèses à côté du nom de la plateforme dans l’index
- Lien vers l’index des plateformes si possible dans la fiche du jeu et liens vers les plateformes pour chacune d’entre elles
- Ce qui doit être affiché dans la fiche d’une plateforme est le même flux d’informations que pour le genre.
- Si vous estimez que vous devez ajouter des liens vers l’index dans la liste des jeux ou depuis les genres, allez-y, de toute manière, cela est abordé dans le chapitre suivant.