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 :
- /conducteur/ajouter qui permet d'ajouter un nouveau conducteur
- /conducteur/modifier/{id} qui permet de modifier un conducteur en fonction de son identifiant
- /conducteur/supprimer/{id} qui permet de supprimer un conducteur en fonction de son identifiant
- /conducteur/supprimer_tout qui permet de supprimer tous les conducteurs (debug/test)
- /conducteur/lister qui permet de retourner la liste de tous les conducteurs
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.
<?php
// Fichier: src/Controller/ConducteurController.php
namespace App\Controller;
use App\Entity\Conducteur;
use App\Repository\ConducteurRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\ORM\EntityManagerInterface;
// Utilisation d'un logger pour le débogage
use Psr\
Log\LoggerInterface
;
class ConducteurController extends AbstractController
{
// Logger
private $logger;
private $entity_manager;
private $repository;
/**
* Constructeur auquel on passe en paramètre un logger
*/
public function __construct(LoggerInterface $logger, EntityManagerInterface $entity_manager)
{
$this->logger = $logger;
$this->entity_manager = $entity_manager;
// obtenir le Repository lié au conducteur depuis l'EntityManager
$this->repository = $entity_manager->getRepository(Conducteur::class);
}
}
?>
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 :
<?php
// ...
class ConducteurController {
//...
/**
* Afficher les conducteurs dans un tableau
*/
#[Route('/conducteur/lister', name: 'conducteur_lister')]
public function lister(Request $request): Response
{
// obtenir la liste de tous les conducteurs triés par ordre alphabétique
// croissant
$liste_conducteurs = $this->repository->findAllOrderedByName();
return $this->render("conducteur/lister.html.twig", [
'liste_conducteurs' => $liste_conducteurs
]);
}
}
?>
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 :
- l'identifiant du conducteur
- son nom
- un bouton pour supprimer le conducteur
- un bouton pour modifier le conducteur
On réalise une énumération des conducteurs (bloucle for) avec la variable e (pour élément).
<section>
<h2>Conducteurs</h2>
<nav>
<ul>
<li><a href="/conducteur/ajouter">[+] Ajouter</a></li>
<li><a href="/conducteur/supprimer_tout">[x] Tout Supprimer</a></li>
</ul>
</nav>
{%
if liste_conducteurs is empty %
}
<p>Aucun conducteur trouvé.</p>
<table>
<tr>
<th style="width: 50px">Id</th>
<th style="width: 250px">Nom</th>
<th style="width: 50px">Suppr.</th>
<th style="width: 50px">Mod.</th>
</tr>
{%
for e in liste_conducteurs %
}
<tr>
<td class="center"> {{ e.CoId }} </td>
<td> {{ e.CoNom }} </td>
<td class="center">
<img src="{{ asset('images/delete.png') }}" alt="delete"
onclick="return conducteur_supprimer({{ e.CoId }}, '{{ e.CoNom }}');" />
</td>
<td class="center">
<img src="{{ asset('images/modify.png') }}" alt="modify"
onclick="return conducteur_modifier({{ e.CoId }});" />
</td>
</tr>
</table>
</section>
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 :
/**
* Fonction qui demande la suppression d'un conducteur sachant qu'on
* appelle cette fonction avec
* @param {int} co_id l'identifiant du conducteur
* @param {string} co_nom le nom du conducteur
* @returns false si l'utilisateur ne désire pas supprimer le conducteur, sinon
* redirection vers la route de suppression
*/
function conducteur_supprimer(co_id, co_nom) {
// demande la suppression du conducteur grâce à l'apparition
// d'une fenêtre pop-up
const user_answer = confirm('Voulez vous supprimer le conducteur ' + co_nom + ' ?');
// Si on a répondu oui, on appelle la route conducteur/supprimer/{id}
// où {id} est remplacé par l'identifiant du conducteur
if (user_answer === true) {
// delete
window.location.replace('/conducteur/supprimer/'+co_id)
}
return false;
}
/**
* Fonction qui réalise l'appel pour la modification d'un conducteur par
* appel de la route /conducteur/modifier/{id}
* @param {int} co_id identifiant du conducteur
* @returns true
*/
function conducteur_modifier(co_id) {
window.location.replace('/conducteur/modifier/'+co_id)
return true;
}