Détails du sujet

Symfony 3 [Quiz 3] [Pile 2]

Formulaires et Validation dans le FrameWork Symfony 3

Toutes les cartes

Formulaires

Quelle ligne de code permet de créer dans un contrôleur un $formBuilder à partir du service 'form.factory' et de l'entité $advert?

$formBuilder = $this->get('form.factory')->createBuilder(FormType::class, $advert)


Formulaires

Dans un contrôleur, quelle méthode du formulaire doit-on passer à la vue pour qu'elle puisse afficher seule le formulaire?

La méthode createView()

Formulaires

Un formulaire est-il obligé d'hydrater tous les attributs d'un objet?

Non


Quelle est l'utilité de la méthode add() du form builder?

Elle permet d'ajouter les différents types de champs du formulaire correspondant aux attributs de l'objet.


Formulaires. Que représente DateType::class?

Représente le nom de la classe DateType du composant Form.


Formulaires

Quelle est la manière la plus courte d'afficher un formulaire dans un template?

Grâce à la fonction form() de Twig
  1. {{ form(form) }} Si la clef 'form' est passée au template
  2. {{ form(form2) }} Si la clef 'form2' est passée au template

etc...


Peut-on définir le boutton submit ailleurs que dans le form builder?

Oui

Si on supprime la ligne add('save', SubmitType::class)

on definira alors le boutton submit à la main dans le template

<input type=''submit'' value=''save''>


Formulaires

Quels sont les 3 arguments possibles pour la méthode add() du form Builder?

  1. Le nom du champ du formulaire
  2. Le type de champ du formulaire
  3. Les options du champ sous forme de tableau

Formulaires

Est-il important de faire correspondre le type de champ du formulaire avec le type de l'attribut de l'objet?

Oui, c'est valable pour tous nos attributs.

Içi le type de champ du formulaire CheckboxType::class renvoit un boolean. Ce qui correspond au type de l'attribut 'published' de l'objet qui est un boolean.


Formulaires

Quelles sont les étapes classiques pour gérer la soumission d'un formulaire dans un contrôleur?

  • 1-On crée l'objet qui va recevoir le contenu du formulaire
  • 2-Si le formulaire est reçu en POST (le client a cliqué sur submit) et que le remplissage du formulaire par ce que contient la requête est valide
  • Alors on sauve en bdd notre entité puis on affiche un message flash de succès et on redirige vers l'affichage de cet objet nouvellement créé (par exemple).
  • 3-Si on arrive en GET ou que le formulaire est invalide
  • Alors on affiche le formulaire vide.

Formulaires

Dans un contrôleur, quelle méthode de l'objet formulaire $form, permet d'hydrater l'objet par le contenu des champs du formulaire rempli par le client?

la méthode handelRequest($request)

$form->handleRequest($request)


Formulaires

Quel est le code classique pour gérer la soumission d'un formulaire dans un contrôleur?


Formulaires - Les deux lignes suivantes sont-elles identiques?
  1. $a  = $this->get('form.factory')->createBuilder(FormType::class, $advert)
  2. $a = $this->createForm(AdvertType::class, $advert)

 

Non

  • La ligne 1 produit un formBuilder auquel on doit ajouter les champs avec la méthode add()
  • La ligne 2 produit un formulaire

Formulaires

Avec Symfony tous les champs d'un formulaire doivent-ils être par défaut remplis par le client?

Oui


Formulaires

Comment rendre un champs de formulaire facultatif?

Dans la méthode add() du form builder

En ajoutant 'required' => false au tableau d'options du champ


Formulaires

Comment faire pour qu'un formulaire se remplisse avec les valeurs par défaut de certains attributs de l'objet?

On appel l'objet qui a certains attributs remplis par défaut grâce à son constructeur (ou manuellement) et ensuite seulement on remplit le formulaire avec le contenu de l'objet

  • $advert = new Advert();
  • $advert->setTitle('Vive MemoFlash');
  • $form = $this->createForm('AdvertType::class, $advert)

Formulaires - Que fait-on si on ajoute ces lignes au fichier config.yml?

On ajoute un thème adapté au framework CSS Bootstrap 3 afin de présenter élégamment un formulaire.

  • bootstrap_3_layout.html.twig enveloppe chaque champ dans un <div> avec la classe CSS appropriée pour appliquer le style par défaut du framework CSS Bootstrap 3 (Le label est au dessus du widget)
  • bootstrap_3_horizontal_layout.html.twig permet d'avoir le label et le widget sur la même ligne.

Formulaires

Peut-on remplacer dans un template, {{ form(form) }} par:

Oui
  1. form_start(form) restitue le tag de début du formulaire en y incluant le enctype correcte pour l'upload de fichier
  2. form_widget(form) restitue tous les champs du formulaires en y incluant le contenu du champs ainsi que son label et les messages d'erreur de validation 
  3. form_end(form) restitue le tag de fin du formulaire et tous les autres champs pas encore restitués dans le cas on on restitue chaque champs individuellement. Trés utile pour restituer les champs cachés et profiter de la protection automatique contre la faille CSRF

Formulaires

Peut-on remplacer {{form(form) }} par:

oui
  • form_label() affiche le label HTML du champ donné en argument. Le deuxième argument est le contenu du label
  • form_errors() affiche les erreurs attachées au champ donné en argument
  • form_widget() affiche le champ HTML lui-même (que ce soit<input>,<select>, etc.)

Formulaires - Quel est le rôle de {{ form_rest(form) }}

form_rest() affiche tous les champs manquants du formulaire ainsi que le champ CSRF


Formulaires
  • Aprés la commande suivante, que faudra-t-il préciser dans la classe ClientType?

>php bin/console doctrine:generate:form CoreBundle:Client

Il faudra préciser les types de champs car ils sont par défaut devinés par le composant Form à partir des annotations Doctrine écrites dans la classe Client.


Formulaires

Peut-on créer nos propres champs de formulaire?

Oui


Formulaires

Ces deux lignes sont-elles équivalentes?

  1. $form = $this->get('form.factory')->create(AdvertType::class, $advert)
  2. $form = $this->createForm(AdvertType::class, $advert)

Oui


Formulaires

Quel est l'avantage de l'imbrication de formulaires?

Cela permet dans un même formulaire de renseigner le contenu de plusieurs objets liés entre eux, sans avoir à le faire sur plusieurs formulaires différents.


Formulaires

Quels sont les deux types d'imbrication de formulaires?

  1. L'imbrication d'un formulaire réalisée une seule fois, pour une relation simple entre deux objets (OneToOne ou ManyToOne)
  2. L'Imbrication d'un formulaire réalisée plusieurs fois, pour une relation multiple entre deux objets (OneToMany ou ManyToMany)

Imbrication d'un seul même formulaire

Que passer comme argument à la méthode add() du form builder d'une entité A, pour imbriquer le formuaire de l'entité image?

->add('image', ImageType::class)


Imbrication d'un même formulaire plusieurs fois

Soit l'entité A liée à l'entité image par une relation OneToMany.

Que passer comme argument à la méthode add() du form builder de l'entité A, pour imbriquer le formulaire de l'entité image plusieurs fois?


Formulaires

Quelle est l'utilité de la classe EntityType que l'on peut utiliser comme argument dans la méthode add() du form builder suivant?

Elle nous permet de sélectionner une ou plusieurs catégories.

  • L'option class définit quel est le type d'entité à sélectionner
  • L'option choice_label indique que l'on souhaite afficher les entités par nom dans le select du formulaire
  • L'option multiple indique qu'on parle ici d'une liste de catégories, et non d'une catégorie unique.

Formulaires - Quelle est l'utilité de l'option ''query_builder''?
  • Elle permet d'exécuter le répository getLikeQueryBuilder de l'entité Category, qui retourne un query builder.
  • Ce query builder retourne un array d'objet category qui ont été choisi en fonction du pattern passé en argument
  • Ce champ de formulaire nous permetra donc de choisir uniquement parmi les catégories retournées

Fomulaires

Quel est l'avantage de l'héritage de formulaire?

Cela permet de construire des formulaires différents à partir d'un formulaire de base.

On limite la réécriture de code.


Formulaires

Quelles sont les étapes pour hériter d'un formulaire TotoType?

  • Copier-coller le fichier TotoType.php et le renommer en Toto2Type.php
  • Modifier le nom de la classe en Toto2Type
  • Ajouter la méthode getParent qui retourne la classe du formulaire parent TotoType::class
  • Remplacer les méthodes ->add() par un ->remove('nomDuChamp') ou un ->add('NomDuNouveauChamp) selon le champ que l'on souhaite supprimer ou ajouter
  • Supprimer les méthodes configureOptions() et getBackPrefix()

Formulaires

Que peut-on utiliser pour afficher certains champs d'un formulaire en fonction de la valeur d'un champ?

On peut utiliser l'évènement de formulaire PRE_SET_DATA qui est déclenché juste avant que les champs ne soient remplis avec les valeurs de l'objet.

Ainsi on vérifie la valeur du champs souhaité pour afficher ou non certains champs.


Formulaires - Commentez ce code situé dans un form buidler
Affichage ou non du champs ''published'' en fonction de sa valeur
  • On définit comme premier argument l'événement PRE_SET_DATA qui nous intéresse
  • On définit comme deuxième argument la closure que l'on souhaite exécuter quand l'événement sera déclenché
  • On récupère l'objet Advert afin de pouvoir lire la valeur de l'attribut $published
  • On ne fait rien si l'Advert est null
  • Si l'attribut $published est faux on ajoute un champs ''published''
  • Si l'Advert est nouveau c'est à dire avec un id null on ajoute un champs ''published''
  • Si l'attribut $published est vrai on supprime le champs ''published''

Formulaires

Quelle classe type utilise-t-on comme argument dans la méthode add() d'un form builder afin de pouvoir uploader un fichier?

FileType::class

->add('file', FileType::class)


Formulaires

Est-il vrai que l'on peut à la suite d'un événement de formulaire exécuter une closure mais aussi un service?

Vrai


Formulaires

Pour l'upload de fichier dans un formulaire vaut-il mieux utiliser les évènements de formulaire ou les événements Doctrine pour automatiser la gestion du fichier uploadé?

Les événements Doctrine


Validation

Quel composant de Symfony permet de valider les objets?

Le composant Validator


Validation

Que peut-on faire avec le service Validator de Symfony?

On peut valider les objets sans avoir besoin de formulaire.

Les entités sont des objets.

On peut dont aussi valider les entités hydratées par le contenu des formulaires.


Quel adage doit-on suivre lorsque que vient le moment de récupérer les données de formulaires?

''Never Trust User Input''

Ne jamais faire confiance aux données envoyées par le client.


Quelles sont les 3 étapes générales de la validation?

  1. Définir les règles de validation que l'on souhaite appliquer à une classe.
  2. Appel d'un service qui va lire l'instance de cette classe (objet) avec ses règles de validation.
  3. Définir si oui ou non l'objet respecte les règles?

Validation

Peut-on imposer des règles de validation sur n'importe quel objet?

Oui


Validation

Le composant Validator de Symfony accepte différentes manières pour définir les contraintes d'une classe?

Quelles sont-elles?

  1. Définition des contraintes dans les annotations des attributs de classe
  2. Définition des contraintes dans les annotations des getters du genre: getNomAttribut et isNomAttribut
  3. Par les callbacks
  4. Par les services

Validation

Quand on parle de validation parle-t-on uniquement de la validation des données de formulaire?

Non
  • On parle de la validation des objets en général.
  • Les entités utilisées par les formulaires sont des objets (instances de classe) et la validation peut donc également s'appliquer à elles.

Validation

Quel synonyme utilise-t-on pour parler des régles de validations?

On parle également des contraintes de validation


Validation

Quel est le FQCN (Fully Qualified Class Name) et l'alias que l'on doit utiliser dans une classe pour que l'on puisse y ajouter nos contraintes de validation.

use Symfony\Component\Validator\Constraints as Assert;


Validation

Quelles sont les deux manières de définir les règles de validation (contraintes) d'une classe?

  1. Par des annotations DocBlocks situées dans la classe
  2. Dans un fichier externe à la classe de type xml, yml ou php

 


Validation

Dans une classe, quelle annotation DockBlock doit-on ajouter à l'attribut $date pour contraindre sa valeur à être de type ''DateTime''?

@Assert\DateTime()


Validation

Dans une classe, quelle annotation DockBlock doit-on ajouter à l'attribut $title pour contraindre sa valeur à être d'une longueur d'au moins 10 caratères?

@Assert\Length(min=10)


Validation

Dans une classe, quelle annotation DockBlock doit-on ajouter à l'attribut $content pour contraindre sa valeur à ne pas être vide?

@Assert\NotBlank()


Humour
L'oiseau du côté B car il possède le WIFI