1 Mise en place des formulaires

A partir du projet construit dans la séance de TP précédent, nous allons ajouter une entité Location que nous allons gérer en utilisant les formulaires proposés par Symfony (N’oubliez pas de faire un commit/push de votre projet).

Symfony propose la création de formulaire en fonction des entités gérées par l’application. Pour ajouter la librairie utilisez la commande suivante :

Nous allons reprendre le travail effectué dans la séance de TP précédente et compléter notre système d’information avec une nouvelle entité. Nous allons ajouter la possibilité de louer les salles disponibles. Pour cela nous allons ajouter l’entité Location qui contiendra les propriétés suivantes :

  • nom complet du loueur (string, longueur 200 cars.)
  • le mail du loueur (email, longueur 200 cars.)
  • la date de début de location (date)
  • la durée en jours de la location (dateInterval)

L’entité Location sera en association ManyToOne avec l’entité Salle.

Créez l’entité Location.

Créez la table location dans la base de données.

Ajoutez des données valides dans la table location.

1.1 Création d’un contrôleur CRUD pour l’entité Location

Nous allons dans un premier temps crée un contrôleur pour gérer l’entité Location, puis générer les formulaires de saisie et de modification d’une location en utilisant la fabrique de formulaires proposée par Symfony.

Symfony crée automatiquement les vues et les formulaires. Nous allons modifier les formulaires pour les adapter plus précisément à nos besoins.

Créez un contrôleur CRUD pour l’entité Location.

Modifiez la vue qui affiche la liste des locations en donnant les colonnes

  • nom
  • mail
  • date location
  • durée
  • fin de location
  • le nom de la salle

en plus des actions show et edit.

Ajouter une page qui affiche la liste des locations pour une salle.

Pour ajouter une page, il faut

  • Ajouter dans le contrôleur SalleController une méthode qui à partir de l’url /salle/{id}/locations déclenche une méthode locations.
  • Créer une vue locations.html.twig qui est proche de la vue créée dans la question précédente.

1.2 Etude et modification d’un formulaire

Dans le listing qui suit, on retrouve la fonction new du contrôleur LocationController qui permet d’afficher un formulaire de création d’une nouvelle location.

  • L’instruction $form = $this->createForm(LocationType::class, $location); crée une instance de la classe Form à partir de la classe Location en utilisant comme données de départ l’instance de la classe Location $location.
  • L’instruction $form->handleRequest($request); permet de gérer le traitement de la saisie du formulaire. En effet sans autre précision, lorsque l’utilisateur valide la saisie du formulaire, une requête HTTP avec la commande POST est transmise avec la même url que celle qui à provoquer l’affichage du formulaire (ici /location/new). Le contenu de la requête est traitée et les données affectées aux propriétés de l’instance qui a été donnée en paramètre de l’instruction précédente (ici $location).
  • C’est l’instruction $form->isSubmitted() qui permet de savoir si le formulaire a été saisi et si de plus les règles de validations sont vérifiées ($form->isValid()) alors l’enregistrement sera ajouté à la base de données avant de rediriger la requête vers un affichage de la liste des locations.
  • L’instruction $this->render(...) permet d’afficher le formulaire.

Dans l’état, si on essaie de créer une nouvelle instance de la classe Location on obtient une erreur (Catchable Fatal Error: Object of class App\Entity\Salle could not be converted to string), il nous faut donc adapter ce formulaire.

Pour utiliser des règles de validation (voir la documentation ici) qui soient plus personnelles il faut ajouter une librairie avec la commande suivante :

Dès que la librairie aura été ajoutée, il vous sera possible d’ajouter des contraintes dans la classe modèle qui permettront de valider ou non plus finement que l’instance est correcte ou non (voir la documentation).

Par exemple voici une modification de la classe modèle Salle :

On aura noté l’ajout de l’annotation @Assert\NotBlank() qui vérifie que le champ n’est pas vide.

On peut aussi vérifier que les valeurs données sont correctes, par exemple si l’on veut vérifier que lors de la création d’une nouvelle location, la salle sélectionnée n’est pas déjà louée dans la même période, on utilise une classe contrainte.

Une classe contrainte permet de définir un nouveau type de contrainte (documentation), dans notre cas ContrainteSalleLibre. Cette classe peut être vu comme une étiquette qui va déclencher une classe qui va valider ou non la contrainte, dans notre cas ContrainteSalleLibreValidator. Il est possible d’utiliser un autre nom, mais dans ce cas, il faut indiquer son nom en ajoutant la fonction validatedBy dans la classe ContrainteSalleLibre :

La classe ContrainteSalleLibreValidator doit contenir une fonction validate($value, Constraint $constraint) qui vérifie que la contrainte est vérifiée ou produit une violation de contrainte :

Modifiez la vue qui liste les locations et ajouter le nom de la salle louée.

Modifiez la vue qui permet de saisir une nouvelle location.

Ajouter une nouvelle contrainte qui n’accepte que les locations de salles libres (on ne peut pas louer une salle qui est déjà louée).

 

IUT de Lens Département Informatique

2018