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] Validation de formulaire imbriqué [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut [Form] Validation de formulaire imbriqué
    bonjour,

    j'utilise un formulaire imbriqué seulement le formulaire de 2eme niveau je n'arrive pas à personnaliser les validations.

    1er niveau : produit.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            ->add('sousDomaine', 'text', array( 'attr'=>array('class'=>'span2')) )
            ->add('place', new PlaceType())
    2ème niveau : PlaceType()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            ->add('adresse1', 'text', array( 'attr'=>array('class'=>'input-large')) )   
            ->add('adresse2', 'text', array( 'attr'=>array('class'=>'input-large',)), array('required'=>false,) )
    pour la validation HTML5, "adresse2" garde toujours required="required"
    alors que j'ai précisé: array('required'=>false,)

    ai-je zappé un truc ?



    pourtant dans l'entité produit.php, j'ai bien ajouté : * @Assert\Valid()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        /**
         * @var \Place
         *
         * @ORM\ManyToOne(targetEntity="Place", cascade={"persist"})
         * @ORM\JoinColumns({
         *   @ORM\JoinColumn(name="place_id", referencedColumnName="id")
         * })
         * @Assert\Valid()
         */
        private $place;

  2. #2
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2006
    Messages : 45
    Points : 46
    Points
    46
    Par défaut
    Salut,

    Déjà, pour info, le fait d'ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array('required'=>false,)
    va déclarer ton champ comme obligatoire ! En effet, dans le champ html, il n'est pas nécessaire d'écrire quelque chose à côté du required, c'est optionnel. Soit il est écrit "required" dans les attributs de ton champ input, et le champ est obligatoire, soit il n'y a rien d'écrit et il ne l'est pas. Donc un required='false' veut bien dire, c'est obligatoire ! (comme required='required', ou required='true' ou required='toto'...).

    Déjà essaie simplement en enlevant cette option.

    Ensuite, pour éviter que Symfony l'ajoute tout seul, vérifie que dans ta base de donnée ta colonne peut être nulle. Si ce n'est pas le cas, c'est qu'il a considéré lors de la génération que ton champs est obligatoire.

    Tu peux ajouter un nullable=false, ça devrait donner un truc comme ça (à tester...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     /**
         * @var \Place
         *
         * @ORM\ManyToOne(targetEntity="Place", cascade={"persist"})
         * @ORM\JoinColumns({
         *   @ORM\JoinColumn(name="place_id", referencedColumnName="id")
         *   @ORM\JoinColumn(nullable=false)
         * })
         * @Assert\Valid()
         */
        private $place;
    A+!

  3. #3
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    merci pour la précision à propos de "required".
    malheureusement ça fonctionne toujours pas j'ai toujours mon required="required" dans mon champs INPUT

    voici un récapitulatif de ce que j'ai :
    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
     
    1er niveau : produit.php
            ->add('sousDomaine', 'text', array( 'attr'=>array('class'=>'span2')) )
            ->add('place', new PlaceType())
     
    2ème niveau : PlaceType()
            ->add('adresse1', 'text', array( 'attr'=>array('class'=>'input-large')) )   
            ->add('adresse2', 'text', array( 'attr'=>array('class'=>'input-large',)) )
     
     
    entité produit :
        /**
         * @var string
         * @ORM\Column(name="adresse1", type="string", length=99, nullable=true)
         */
        private $adresse1;
     
        /**
         * @var string
         * @ORM\Column(name="adresse2", type="string", length=99, nullable=false)
         */
        private $adresse2;

  4. #4
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    salut,

    perso dans mes FormType, j'ai rajouté un required= false, mais pas en temps qu'attribut de balise, lorsque je ne voulais pas de champ obligatoire.

    En prenant ton exemple, je fais comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ->add('adresse2', 'text', array( 'attr'=>array('class'=>'input-large'), 
                                     'required' = false,
                                     'label'=>'Mon label' ))
    Douter de tout, toujours, et surtout de soi-même...

  5. #5
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    et non fadetoblack de mon coté ça change rien.

    c'est navrant d'être bloqué sur un truc , j'en suis sure ça doit être tout con

  6. #6
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    Salut Dukoid,

    Vinsse2001 a raison, le fait d'ajouter "required" dans le tableau des attributs suivi ou non d'une valeur, quelle qu'elle soit rendra ton champ obligatoire.

    C'est pourquoi j'ai rajouté le required=false non pas dans le tableau des attributs, mais dans les propriétés du champ dans le FormType.

    Je ne comprends pas pourquoi il rend ton champ obligatoire ? ON dirait que symfony ne tient pas compte de ta demande.

    Et ta page source renvoie toujours un "required" dans ton input ?
    Douter de tout, toujours, et surtout de soi-même...

  7. #7
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Points : 677
    Points
    677
    Par défaut
    Bonjour,

    De toute façon de prendre en compte les validations coté client c'est mal

    html5 ou js même combat.

    Afin de désactiver toute validation html5, ajouter dans la balise form

  8. #8
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    stephen78, je suis ok mais une validation client avec un premier filtre javascript c'est plus rapide et allège le serveur.

    En procédant de la manière suivante ça fonctionne et grâce à vos indications

    1er niveau : ProduitType.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ->add('sousDomaine', 'text', array( 'attr'=>array('class'=>'span2')) )
    ->add('place', new PlaceType(), array('required' => false,))
    2ème niveau : PlaceType()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ->add('adresse1', 'text', array( 'attr'=>array('class'=>'input-large', )) )   
    ->add('adresse2', 'text', array( 'attr'=>array('class'=>'input-large', 'required' => true,)) )
    dans le 1er niveau j'indique : array('required' => false,)
    ce qui fait qu'il ne m'ajoute pas les required=required dans tous les champs du 2ème niveau.

    et dans le 2eme niveau , aux champs que je souhaite avoir une validation je mets dans attr( 'required' => true
    "true" ou n'importe quoi ça marche.

    et donc maintenant j'ai le comportement que je voulais.

  9. #9
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Points : 677
    Points
    677
    Par défaut
    Oui certes, mais il faut que tu puisses tester ta validation coté serveur.

    De plus, ta validation coté serveur sera toujours la.
    Juste pour savoir, parce-que j'ai la flemme de vérifier, quand tes champs ne sont pas nullable=true, ils passent obligatoirement en required. Non ?

  10. #10
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    j'ai testé, j'ai mis les nullables à false et j'ai toujours les required='required'

  11. #11
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Points : 677
    Points
    677
    Par défaut
    Qu'est ce qui est indiqué en bdd sur les champs à required même avec nullable à false ?

    Si tu changes le nullable de false à true ou l'inverse, il faut mettre à jour la bdd.

  12. #12
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    avec null ou pas en base ça ne change rien.

    voilà

  13. #13
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Points : 677
    Points
    677
    Par défaut
    Pas de soucis bonne soirée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2.x] [Form] Validation de formulaires imbriqués non fonctionnelle
    Par Sokaru dans le forum Symfony
    Réponses: 2
    Dernier message: 17/03/2013, 20h10
  2. Réponses: 7
    Dernier message: 11/03/2013, 22h34
  3. [2.x] [Form] Validation de plusieurs formulaire d'un coup
    Par Ducky93 dans le forum Symfony
    Réponses: 8
    Dernier message: 28/08/2012, 11h39
  4. Réponses: 1
    Dernier message: 23/05/2008, 23h19
  5. Valider un formulaire via LWP et HTML::Form
    Par altecad dans le forum Web
    Réponses: 2
    Dernier message: 19/04/2007, 16h32

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