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 :

Validation de formulaire ignorée


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 36
    Points : 20
    Points
    20
    Par défaut Validation de formulaire ignorée
    bonjour,

    j'ai créé une entité INDIVIDU avec une contrainte :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    <?php
     
    namespace adminTools\AnnuaireBundle\Entity;
     
    use Symfony\Component\Validator\Constraints as Assert;
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * adminTools\AnnuaireBundle\Entity\Individu
     *
     * @ORM\Table(name="individu")
     * @ORM\Entity(repositoryClass="adminTools\AnnuaireBundle\Entity\IndividuRepository")
     */
    class Individu
    {
        /**
         * @var integer $id
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var string $login
         *
         * @ORM\Column(name="login", type="string", length=15, nullable=true)
         */
        private $login;
     
        /**
         * @var string $nom
         *
         * @ORM\Column(name="nom", type="string", length=255, nullable=true)
         */
        private $nom;
     
        /**
         * @var string $mail
         *
         * @ORM\Column(name="mail", type="email", length=255, nullable=true)
         * @Assert\Email(
         *     message = "The email '{{ value }}' is not a valid email.",
         *     checkMX = true
         * )
         */
        private $mail;
     
       ////////
    un FORMULAIRE :
    Handler :
    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
    41
    42
    <?php
     
    namespace adminTools\AnnuaireBundle\Form;
     
    use Symfony\Component\Form\Form;
    use Symfony\Component\HttpFoundation\Request;
    use Doctrine\ORM\EntityManager;
    use adminTools\AnnuaireBundle\Entity\Individu;
    use adminTools\AnnuaireBundle\Form\IndividuType;
    use Symfony\Component\Validator\Constraints;
     
    class IndividuHandler {
     
    protected $form;
    protected $request;
    protected $em;
     
        public function __construct(Form $form, Request $request, EntityManager $em) {
     
            $this->form = $form;
            $this->request  = $request;
            $this->em   = $em;
       }
     
       public function process() {
     
           if ($this->request->getMethod() == 'POST' ) {
     
               $this->form->bindRequest($this->request);
     
               if ($this->form->isValid()) {
     
               return true;
               }
           }
           return false;
       }
     
     
    }
     
    ?>
    Type :
    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
    <?php
     
    namespace adminTools\AnnuaireBundle\Form;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilder;
     
    class IndividuType extends AbstractType {
     
        public function buildForm (FormBuilder $builder, array $options) {
     
            $builder
            ->add ('login','text')
            ->add ('nom', 'text')
            ->add ('mail', 'text')   
            ->add ('numEtu', 'integer')
            ;
        }
     
        public function getName() {
     
            return 'IndForm';
        }
     
        public function getDefaultOptions (array $options) {
     
            return array (
     
                'data_class'    => 'adminTools\AnnuaireBundle\Entity\Individu',
            );
        }
    }
     
     
    ?>
    appelé par mon controller :
    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
     public function rechercheIndAction() {
     
            $individu = new Individu;
     
            //création du formulaire
            $form = $this->createForm(new IndividuType, $individu);
     
            //création du gestionnaire de formulaire associé
            $formHandler = new IndividuHandler($form, $this->get('request'), $this->getDoctrine()->getEntityManager());
     
            // si pas en POST ou pas valide, on reaffiche le formulaire
            if (!$formHandler->process()) {
            return $this->render('adminToolsAnnuaireBundle:Annuaire:rechercheInd.html.twig', array('form'=>$form->createView()));
            }
     
        }
    tout s'affiche bien, le bind se fait, mais la validation est totalement ignorée :
    je peux rentrer "sdlkfjqs" ou encore "1234" dans le champs mail, ca ne lève rien du tout, ca passe nikel....
    j
    j'ai testé avec un fichier validation.yml mais idem :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    adminTools\AnnuaireBundle\Entity\Individu: 
        properties:
            mail:
                - Email:
                    message: The email "{{ value }}" is not a valid email.
                    checkMX: true

  2. #2
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Salut,

    Plusieurs point à voir : dans un premier temps il existe un text field "email".
    Tu pourrais commencer par remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->add ('mail', 'email')
    Ensuite dans ton formType il ne s'agirait pas plutôt de la méthode setDefaultOptions au lieu de getDefaultOptions ?

    Ensuite si ça ne suffit pas, toujours dans le setDefaultOptions voilà ce que devrait contenir ta méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'adminTools\AnnuaireBundle\Entity\Individu',
            'validation_groups' => array('nom_de_ton_groupe_de_validation'),
        ));
    }
    puis ton annotation @Assert\Email

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /**
     * @var string $mail
     *
     * @ORM\Column(name="mail", type="email", length=255, nullable=true)
     * @Assert\Email(
     *     message = "The email '{{ value }}' is not a valid email.",
     *     checkMX = true
     *     groups={"nom_de_ton_groupe_de_validation"},
     * )
     */
    ++

  3. #3
    Membre habitué
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Mai 2011
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef d'entreprise
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2011
    Messages : 122
    Points : 169
    Points
    169
    Par défaut
    Bonjour,

    As-tu activé la validation par annotations dans ton fichier config ?


    Ensuite dans ton formType il ne s'agirait pas plutôt de la méthode setDefaultOptions au lieu de getDefaultOptions ?
    Les deux fonctionnent, getDefaultOptions est déprécié depuis la v2.1 et sera retiré dans la v2.3. En revanche, setDefaultOptions n'existe pas avant la v2.1, tout dépend donc de la version qu'il utilise.

  4. #4
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par Nico_F Voir le message
    Salut,

    Plusieurs point à voir : dans un premier temps il existe un text field "email".
    Tu pourrais commencer par remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->add ('mail', 'email')
    j'ai tenté ça, mais la validation ne se fait que coté client il me semble.
    Mon formulaire passe quand meme puisque j'ai désactivé cette fonction dans mon formulaire :
    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
    <form method="POST" action="{{ path('rechercheLdap') }}" {{ form_enctype(form) }}  >
     
               {{ form_errors(form) }}
       <div class="control-group">
     
               {{ form_label(form.login) }}  
    <div class="controls">
                {{ form_widget(form.login) }}
           </div>
        </div>
        <div class="control-group">   
               {{ form_label(form.nom) }}   
    <div class="controls">
                {{ form_widget(form.nom) }}
            </div>
        </div>
        <div class="control-group">   
            {{ form_errors(form.mail) }}
               {{ form_label(form.mail, "Email") }}   
    <div class="controls">
                {{ form_widget(form.mail) }}
            </div>
        </div>
        <div class="control-group">   
               {{ form_label(form.numEtu, "Numéro d'Etudiant") }}   
    <div class="controls">
                {{ form_widget(form.numEtu) }}
            </div>
        </div>
     
        <div class="controls">
            <input type="submit"  formnovalidate name="go" value="Rechercher"/>
     </div>
    </form>
    As-tu activé la validation par annotations dans ton fichier config ?
    oui, c'est fait

    Ensuite dans ton formType il ne s'agirait pas plutôt de la méthode setDefaultOptions au lieu de getDefaultOptions ?
    Les deux fonctionnent, getDefaultOptions est déprécié depuis la v2.1 et sera retiré dans la v2.3. En revanche, setDefaultOptions n'existe pas avant la v2.1, tout dépend donc de la version qu'il utilise.
    J'utilise la version 2.0.18

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Si tu n'affiches pas les erreurs pour chaque champ de formulaire, effectivement tu n'auras aucun retour quand à la validation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <form method="POST" action="{{ path('rechercheLdap') }}" {{ form_enctype(form) }}  >
     
               {{ form_errors(form) }}
       <div class="control-group">
     
               {{ form_label(form.login) }}  
    <div class="controls">
                {{ form_widget(form.login) }}
    {{form_errors(form.login)}}
           </div>
    .....

  6. #6
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    mais c'est censé les afficher ces erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     <div class="control-group">   
            {{ form_errors(form.mail) }}
               {{ form_label(form.mail, "Email") }}   
    <div class="controls">
                {{ form_widget(form.mail) }}
            </div>
    (il n'y a que mon champs mail qui a une contrainte)

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    mais c'est censé les afficher ces erreurs :
    Oups, désolé j'ai lu trop vite.

    Tu pourrais tester en utilisant la librairie de validation (qui est utilisé en interne par la librairie du formulaire, mais bon ça permettrai d'identifier ou ça coince)
    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
     
    public function rechercheIndAction() {
     
            $individu = new Individu; 
            $form = $this->createForm(new IndividuType, $individu); 
            $request=$this->get('request');
     
            if($request->getMethod()=='POST'){
                $form->bindRequest($request);
     
                $errors=$this->get('validator')->validate($individu);
                if(count($errors)){
                    echo 'individu invalide <pre>',print_r($errors);exit;
                }
            }
     
           ....
        }

  8. #8
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    ca n'affiche aucune erreur, ca passe directement à la méthode suivante, celle appelée par le formulaire : rechercheLdapAction();

  9. #9
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    c'est normal que ta route rechercheLdap soit mappé à une action appelé rechercheInd ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <form method="POST" action="{{ path('rechercheLdap') }}" {{ form_enctype(form) }}  >
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public function rechercheIndAction() {

  10. #10
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    voila la fonction modifiée :

    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
    public function rechercheIndAction() {
            
            $individu = new Individu; 
            $form = $this->createForm(new IndividuType, $individu); 
            
            //test developpez.net :
            $request=$this->get('request');
    
            if($request->getMethod()=='POST'){
                $form->bindRequest($request);
     
                $errors=$this->get('validator')->validate($individu);
                if(count($errors)){
                    //echo 'individu invalide <pre>',print_r($errors);exit;
                    //return $this->render('adminToolsAnnuaireBundle:Annuaire:rechercheInd.html.twig', array('form'=>$form->createView()));
                return new Response(print_r($errors, true));
                    
                }
                else {return new Response("tout va bien");}
            }
            else {return new Response("tout va mal");}
    s'affiche : tout va mal.......
    et je pige pas
    ca semblerait vouloir dire que c'est pas en POST ? mais alors dans ce cas, pourquoi ca marche avec mon handler ? perdue, de chez perdue..

  11. #11
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    autant pour moi, j'ai bien sur modifié la derniere ligne (le premier appel est en GET, donc c'est normal)
    par contre, ca continue de passer à la suite, aucune erreur n'est affichée, pas de "tout va bien" non plus...

  12. #12
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Au risque de me répéter, as-tu essayé de passer par les groupes de validation dans la configuration de ton form type + annotation dans ton entité ?
    (cf. mon premier post)

  13. #13
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    j'ai fait exactement ce que tu as dit, ajouté les groupes de validation dans l'entité et dans le handler, j'ai tenté avec getDefault.... et setDefault....

    rien à faire, ca passe, pas de validation

Discussions similaires

  1. [2.x] Formulaire : validation et persistance ignorées
    Par manue87 dans le forum Symfony
    Réponses: 4
    Dernier message: 05/12/2012, 16h44
  2. Réponses: 5
    Dernier message: 24/05/2005, 11h21
  3. Valider un formulaire contenu dans une iframe
    Par snoopy5.0 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/04/2005, 11h14
  4. Valider un formulaire par une image
    Par Fleep dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 31/10/2004, 01h50
  5. [Struts]Validation de formulaire
    Par djoukit dans le forum Struts 1
    Réponses: 4
    Dernier message: 12/03/2004, 09h12

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