<< TP 6
TP 8 >>

7. Ajouter, Supprimer, Modifier un Conducteur





7.1. Supprimer

Pour supprimer un conducteur il faut ajouter la fonction adéquate au niveau du contrôleur :

  1. <?php
  2. // ...
  3.  
  4. class ConducteurController {
  5.  
  6.     //...
  7.  
  8.    
  9.     /**
  10.      * Supprimer un conducteur étant donné son id
  11.      */
  12.     #[Route('/conducteur/supprimer/{id}', name: 'conducteur_supprimer')]
  13.    public function supprimer( $id ): Response
  14.     {
  15.         // à partir du Repository, obtenir le conducteur grâce à son identifiant
  16.         $conducteur = $this->repository->find($id);
  17.        
  18.         // dans le cas où le conducteur n'aurait pas été trouvé, générer une exception
  19.         if (!$conducteur) {
  20.             throw $this->createNotFoundException('Acucun conducteur d\'identifiant ' . $id . ' n\'a été trouvé');
  21.         }
  22.        
  23.         // Suppression du conducteur
  24.         $this->entity_manager->remove($conducteur);
  25.         $this->entity_manager->flush();
  26.  
  27.         // se rediriger vers l'affichage de la liste des conducteurs
  28.         // Attention on utilise le nom de la route 'conducteur_lister'
  29.         // et non 'conducteur/lister'
  30.         return $this->redirectToRoute('conducteur_lister');
  31.  
  32.     }
  33.  
  34. }
  35.  
  36. ?>

7.2. Ajouter

L'ajout d'un conducteur n'est pas chose aisée car il faut gérer les erreurs éventuelles. On utilise pour cela une variable locale à la fonction appelée \$message_erreur.

On commence par créer une instance de la classe Conducteur puis on génère un formulaire dont les champs seront remplis par l'instance créée.

  1. <?php
  2. // ...
  3. use App\Form\ConducteurType;
  4.  
  5. class ConducteurController {
  6.  
  7.     //...
  8.  
  9.    /**
  10.      * Créer un nouveau conducteur en affichant un formulaire
  11.      * de saisie des informations
  12.      */
  13.     #[Route('/conducteur/ajouter', name: 'conducteur_creer')]
  14.    public function ajouter(Request $request): Response
  15.     {
  16.  
  17.         $this->logger->info( 'Ajouter un conducteur' );                
  18.        
  19.         $message_erreur = "";
  20.  
  21.         // créer un conducteur dont les champs sont vides
  22.         $conducteur = new Conducteur();
  23.  
  24.         // créer un formulaire qui prend en compte les données du conducteur
  25.         $form = $this->createForm(ConducteurType::class, $conducteur);
  26.  
  27.         // récupération des données de la requête, notamment des
  28.         // informations liées à la saisie d'un conducteur
  29.         $form->handleRequest($request);
  30.        
  31.         // Si on vient de soumettre le formulaire et que les données
  32.         // sont valides
  33.         if ($form->isSubmitted() && $form->isValid()) {
  34.  
  35.             // Check if a driver with the same name already exists
  36.             $conducteur_existant = $this->repository->findOneBy(['co_nom' => $conducteur->getCoNom()]);
  37.            
  38.             if ($conducteur_existant) {
  39.        
  40.                 $message_erreur = 'Il existe déjà un conducteur de même nom';
  41.        
  42.             } else {
  43.                
  44.                 // alors sauvegarder le conducteur (persist, flush)
  45.                 $this->repository->save($conducteur, true);
  46.  
  47.                 // se rediriger vers l'affichage de la liste des conducteurs
  48.                 // Attnetion on utilise le nom de la route 'conducteur_lister'
  49.                 // et non 'conducteur/lister'
  50.                 return $this->redirectToRoute('conducteur_lister');
  51.             }
  52.         }
  53.  
  54.             // sinon afficher la page contenant le formulaire d'ajout
  55.         if (!empty($message_erreur)) $this->addFlash('error', $message_erreur);
  56.            
  57.         return $this->render('conducteur/ajouter.html.twig', [
  58.             'form' => $form->createView(),
  59.             'message_erreur' => $message_erreur
  60.         ]);
  61.     }
  62.    
  63.  
  64. }
  65.  
  66. ?>

Le formulaire lié à la création d'un conducteur doit être créé dans le sous-répertoire src/Form.

On crée alors le fichier src/Form/ConducteurType.php

  1. <?php
  2. namespace App\Form;
  3.  
  4. use Symfony\Component\Form\AbstractType;
  5. use Symfony\Component\Form\FormBuilderInterface;
  6. use Symfony\Component\OptionsResolver\OptionsResolver;
  7. use Symfony\Component\Form\Extension\Core\Type\TextType;
  8. use Symfony\Component\Form\FormEvent;
  9. use Symfony\Component\Form\FormEvents;
  10.  
  11. // inclure la classe Conducteur
  12. use App\Entity\Conducteur;
  13.  
  14. class ConducteurType extends AbstractType
  15. {
  16.     /**
  17.      * Création d'un formulaire de saisie
  18.      */
  19.     public function buildForm(FormBuilderInterface $builder, array $options)
  20.     {
  21.         // le conducteur ne contient qu'un champ nom de type string
  22.         $builder
  23.             ->add('co_nom', TextType::class, [
  24.                 'label' => 'Nom',
  25.                 'required' => true,
  26.             ]);
  27.            
  28.             // ajout d'un gestionnaire d'évènement afin de modifier le nom du conducteur
  29.             $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
  30.                 $data = $event->getData();
  31.                 $form = $event->getForm();
  32.    
  33.                 // Si le nom existe alors mettre la première lettre en majuscule
  34.                 // et les autres lettres en minuscules
  35.                 if (isset($data['co_nom'])) {
  36.                     $data['co_nom'] = ucfirst(strtolower($data['co_nom']));
  37.                 }
  38.    
  39.                 // modifier l'évènement avec les nouvelles données
  40.                 $event->setData($data);
  41.             });
  42.     }
  43.  
  44.     public function configureOptions(OptionsResolver $resolver)
  45.     {
  46.         $resolver->setDefaults([
  47.             'data_class' => Conducteur::class
  48.         ]);
  49.     }
  50. }
  51. ?>

La fonction buildForm permet de créer les champs du formulaire.

On peut également ajouter un gestionnaire d'évènement (méthode addEventListener) dont le but est de modifier les champs une fois saisis. Ici, par exemple, on modifie le nom du conducteur afin que les noms aient tous le même format : première lettre en majuscule, les lettres suivantes en minuscules.

7.3. Modifier

La modification fonctionne sur le même modèle que l'ajout avec comme différence le chargement des données du conducteur avant affichage du formulaire de saisie.

  1. <?php
  2. // ...
  3. use App\Form\ConducteurType;
  4.  
  5.  
  6. class ConducteurController {
  7.  
  8.     //...
  9.    /**
  10.      * Modifier un conducteur étant donné son id
  11.      */
  12.     #[Route('/conducteur/modifier/{id}', name: 'conducteur_modifier')]
  13.    public function modifier(Request $request, EntityManagerInterface $entityManager, int $id): Response
  14.     {
  15.  
  16.         // à partir du Repository, obtenir le conducteur grâce à son identifiant
  17.         $conducteur = $this->repository->find($id);
  18.        
  19.         // dans le cas où le conducteur n'aurait pas été trouvé, générer une exception
  20.         if (!$conducteur) {
  21.             throw $this->createNotFoundException('Acucun conducteur d\'identifiant ' . $id . ' n\'a été trouvé');
  22.         }
  23.  
  24.         // créer le formulaire lié au conducteur
  25.         $form = $this->createForm(ConducteurType::class, $conducteur);
  26.  
  27.         // récupération des données de la requête, notamment des
  28.         // informations liées à la saisie d'un conducteur
  29.         $form->handleRequest($request);
  30.  
  31.         // Si on vient de soumettre le formulaire et que les données
  32.         // sont valies
  33.         if ($form->isSubmitted() && $form->isValid()) {
  34.  
  35.             // alors sauvegarder le conducteur (persist, flush)
  36.             $this->repository->save($conducteur, true);
  37.  
  38.             // se rediriger vers l'affichage de la liste des conducteurs
  39.             // Attnetion on utilise le nom de la route 'conducteur_lister'
  40.             // et non 'conducteur/lister'
  41.             return $this->redirectToRoute('conducteur_lister');
  42.         }
  43.  
  44.         // sinon afficher la page contenant le formulaire de modification
  45.         return $this->render('conducteur/modifier.html.twig', [
  46.             'form' => $form->createView(),
  47.         ]);
  48.  
  49.     }
  50.  
  51.  
  52. }
  53.  
  54. ?>

La page TWIG concernant la modification est la suivante :

  1. {# templates/conducteur/new.html.twig #}
  2.  
  3. {% extends 'base.html.twig' %}
  4.  
  5. {% block main %}
  6.     <section>
  7.  
  8.     <h2>Modification d'un conducteur</h2>
  9.  
  10.     {{ form_start(form) }}
  11.         {{ form_row(form.co_nom) }}
  12.         <button type="submit">Mettre à jour</button>
  13.     {{ form_end(form) }}
  14.  
  15. {% endblock %}





<< TP 6
TP 8 >>