<< TP 5
TP 7 >>

6. Le Contrôleur Conducteur





6.1. Routes de base et constructeur des contrôleurs

Pour l'entité Conducteur (ainsi que les autres entités sur le même modèle) nous mettons en place les routes suivantes :

Dans l'exemple qui suit on utilise un Logger (journal d'évènements) qui permet de garder trace des opérations réalisées.

On utilise également l'EntityManagerInterface qui sera utilisée pour supprimer des enregistrements et récupérer le ConducteurRepository.

  1. <?php
  2. // Fichier: src/Controller/ConducteurController.php
  3.  
  4. namespace App\Controller;
  5.  
  6. use App\Entity\Conducteur;
  7.  
  8. use App\Repository\ConducteurRepository;
  9.  
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. use Doctrine\ORM\EntityManagerInterface;
  15.  
  16. // Utilisation d'un logger pour le débogage
  17. use Psr\Log\LoggerInterface;
  18.  
  19.  
  20. class ConducteurController extends AbstractController
  21. {
  22.     // Logger
  23.     private $logger;
  24.     private $entity_manager;
  25.     private $repository;
  26.  
  27.     /**
  28.      * Constructeur auquel on passe en paramètre un logger
  29.      */
  30.     public function __construct(LoggerInterface $logger, EntityManagerInterface $entity_manager)
  31.     {
  32.         $this->logger = $logger;
  33.         $this->entity_manager = $entity_manager;
  34.         // obtenir le Repository lié au conducteur depuis l'EntityManager
  35.         $this->repository = $entity_manager->getRepository(Conducteur::class);
  36.     }
  37.  
  38. }
  39.  
  40. ?>

6.2. Lister les conducteurs

Sur la page index.php (ou la route /), une fois que l'on aura cliqué sur la rubrique Conducteurs on sera redirigé vers une page qui affiche la liste des conducteurs.

Il nous faut pour cela ajouter une fonction ainsi que la route correspondante au Contrôleur précédent :

  1. <?php
  2. // ...
  3.  
  4. class ConducteurController {
  5.  
  6.     //...
  7.  
  8.     /**
  9.      * Afficher les conducteurs dans un tableau
  10.      */
  11.     #[Route('/conducteur/lister', name: 'conducteur_lister')]
  12.    public function lister(Request $request): Response
  13.     {
  14.         // obtenir la liste de tous les conducteurs triés par ordre alphabétique
  15.         // croissant
  16.         $liste_conducteurs = $this->repository->findAllOrderedByName();
  17.        
  18.         return $this->render("conducteur/lister.html.twig", [
  19.             'liste_conducteurs' => $liste_conducteurs
  20.         ]);
  21.     }
  22.  
  23. }
  24.  
  25. ?>

Le contrôleur récupère la liste des conducteurs triés par ordre alphabétique, puis se redirige vers un template TWIG pour afficher cette liste qui est passée en paramètre.

Cette page affiche un sous-menu lié aux conducteurs qui permet soit d'ajouter un nouveau conducteur, soit de supprimer tous les conducteurs.

Si le paramètre liste_conducteurs est vide alors on affiche un message indiquant qu' "Aucun conducteur n'a été trouvé", sinon on affiche la liste des conducteurs dans une table qui contient :

On réalise une énumération des conducteurs (bloucle for) avec la variable e (pour élément).

  1. {% extends 'base.html.twig' %}
  2.  
  3. {% block main %}
  4.     <section>
  5.  
  6.     <h2>Conducteurs</h2>
  7.  
  8.     <nav>
  9.         <ul>
  10.             <li><a href="/conducteur/ajouter">[+] Ajouter</a></li>
  11.             <li><a href="/conducteur/supprimer_tout">[x] Tout Supprimer</a></li>
  12.         </ul>
  13.     </nav>
  14.  
  15.     {% if liste_conducteurs is empty %}
  16.  
  17.         <p>Aucun conducteur trouvé.</p>
  18.  
  19.     {% else %}
  20.  
  21.     <table>
  22.         <tr>
  23.            
  24.             <th style="width: 50px">Id</th>
  25.             <th style="width: 250px">Nom</th>
  26.             <th style="width: 50px">Suppr.</th>
  27.             <th style="width: 50px">Mod.</th>
  28.  
  29.         </tr>
  30.         {% for e in liste_conducteurs %}
  31.             <tr>
  32.                
  33.                 <td class="center"> {{ e.CoId }} </td>
  34.                 <td> {{ e.CoNom }} </td>
  35.  
  36.                 <td class="center">
  37.                     <img src="{{ asset('images/delete.png') }}" alt="delete"
  38.                     onclick="return conducteur_supprimer({{ e.CoId }}, '{{ e.CoNom }}');" />
  39.                 </td>
  40.                 <td class="center">
  41.                     <img src="{{ asset('images/modify.png') }}" alt="modify"
  42.                     onclick="return conducteur_modifier({{ e.CoId }});" />
  43.                 </td>
  44.                
  45.             </tr>
  46.         {% endfor %}
  47.     </table>
  48.  
  49.     {% endif %}
  50.  
  51.     </section>
  52. {% endblock %}

La suppression ainsi que la modification d'un conducteur utilise du Javascript pour demander confirmation (suppresssion) ou rediriger l'utilisateur vers la page de modification.

Le code à ajouter au fichier public/js/javascript.js est le suivant :

  1. /**
  2.  * Fonction qui demande la suppression d'un conducteur sachant qu'on
  3.  * appelle cette fonction avec
  4.  * @param {int} co_id l'identifiant du conducteur
  5.  * @param {string} co_nom le nom du conducteur
  6.  * @returns false si l'utilisateur ne désire pas supprimer le conducteur, sinon
  7.  *   redirection vers la route de suppression
  8.  */
  9. function conducteur_supprimer(co_id, co_nom) {
  10.  
  11.     // demande la suppression du conducteur grâce à l'apparition
  12.     // d'une fenêtre pop-up
  13.     const user_answer = confirm('Voulez vous supprimer le conducteur ' + co_nom + ' ?');
  14.  
  15.     // Si on a répondu oui, on appelle la route conducteur/supprimer/{id}
  16.     // où {id} est remplacé par l'identifiant du conducteur
  17.     if (user_answer === true) {
  18.         // delete
  19.         window.location.replace('/conducteur/supprimer/'+co_id)
  20.  
  21.     }
  22.  
  23.     return false;
  24.  
  25. }
  26.  
  27. /**
  28.  * Fonction qui réalise l'appel pour la modification d'un conducteur par
  29.  * appel de la route /conducteur/modifier/{id}
  30.  * @param {int} co_id identifiant du conducteur
  31.  * @returns true
  32.  */
  33. function conducteur_modifier(co_id) {
  34.  
  35.     window.location.replace('/conducteur/modifier/'+co_id)
  36.  
  37.     return true;
  38.  
  39. }
  40.  





<< TP 5
TP 7 >>