IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

[Form] Rendre optionnel un formulaire imbriqué


Sujet :

Symfony PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2019
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [Form] Rendre optionnel un formulaire imbriqué
    Bonjour

    Je suis en train de tester le composant Form de Symfony mais j'ai du mal à comprendre comment rendre optionnel un formulaire imbriqué (embedded form)

    Voici mes deux entités :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    <?php
    
    /**
     * @ORM\Entity
     */
    class Patient {
      /**
       * @ORM\Id
       * @ORM\GeneratedValue
       * @ORM\Column(type="integer")
       */
      protected $id;
    
      /**
       * @ORM\OneToOne(targetEntity="Address")
       * @ORM\JoinColumn(name="address_id", referencedColumnName="id", nullable=true)
       * @Assert\Valid
       */
      protected $address = null;
    }
    
    /**
     * @ORM\Entity
     */
    class Address {
      /**
       * @ORM\Id
       * @ORM\GeneratedValue
       * @ORM\Column(type="integer")
       */
      protected $id;
    
      /**
       * @ORM\Column(name="country", type="string", length=255)
       * @Assert\NotBlank
       * @Assert\Length(max=255)
       */
      protected $country;
    }
    Et mes deux formulaires :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    <?php
     
    class PatientType extends AbstractType
    {
      public function buildForm($builder)
      {
        $builder->add('address', AddressType::class, ['required' => false]);
      }
      public function configureOptions($resolver)
      {
        $resolver->setDefaults([
          'data_class' => Patient::class
        ]);
      }
    }
     
    class AddressType extends AbstractType
    {
      public function buildForm($builder)
      {
        $builder->add('country', TextType::class);
      }
      public function configureOptions($resolver)
      {
        $resolver->setDefaults([
          'data_class' => Address::class
        ]);
      }
    }
    Ce que je souhaite c'est que mon entité Address soit validée uniquement une adresse est envoyée. Or actuellement, j'ai toujours l'erreur
    address.country: This value should not be blank.
    quand je n'envoi pas d'adresse.

    J'ai vu qu'on pouvait utiliser des groupes de validations donc peut être faut il passer par là mais je préfère demander si y a pas un moyen simple de faire ça

    Pour résumé :

    $form->handleRequest([]) : pas de validation de l'adresse
    $form->handleRequest(["address" => null]) : pas de validation de l'adresse
    $form->handleRequest(["address" => ["country" => null]) : validation de l'adresse

    Merci

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Points : 582
    Points
    582
    Par défaut
    Salut,

    Effectivement tu peux utilises les groupes de validation pour définir des contraintes de validation qui varient selon le contexte (typiquement le champ password d'un Utilisateur qui sera obligatoire à la création mais facultatif à la modification). À noter que la documentation précise ceci pour les contraintes comme Length :
    null and empty strings are not handled by this constraint. You need to also add the NotBlank or NotNull constraints to validate against these.
    Concrètement si tu mets uniquement NotBlank dans un groupe de validation, les contraintes comme Length s'exécuteront "que" lorsque la valeur du champ n'est pas null ou une chaîne vide.

    Tu peux sinon utiliser la contrainte de type Callback pour créer ta règle de validation personnalisée : https://symfony.com/doc/current/refe.../Callback.html
    Et comme indiqué sur la doc de Callback, si ce n'est pas suffisant (par exemple si tu as besoin d'un service pour valider les données) tu peux carrément créer une contrainte de validation personnalisée : https://symfony.com/doc/current/vali...onstraint.html

Discussions similaires

  1. [2.x] [Form] Formulaire imbriqué
    Par minouchaimen dans le forum Symfony
    Réponses: 3
    Dernier message: 19/05/2013, 21h55
  2. [2.x] [Form] Validation de formulaire imbriqué
    Par dukoid dans le forum Symfony
    Réponses: 12
    Dernier message: 02/04/2013, 22h36
  3. [2.x] [Form] Formulaire imbriqué avec des uploads
    Par prims dans le forum Symfony
    Réponses: 4
    Dernier message: 14/03/2013, 16h12
  4. Réponses: 7
    Dernier message: 11/03/2013, 22h34
  5. [2.x] Comment rendre un formulaire imbriqué optionnel ?
    Par hsii04 dans le forum Symfony
    Réponses: 6
    Dernier message: 06/01/2012, 11h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo