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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 Expert 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 : 37
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    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 averti
    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
    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

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    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>
    .....

  5. #5
    Membre averti
    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
    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)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    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;
                }
            }
     
           ....
        }

  7. #7
    Membre éprouvé
    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
    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.

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