Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 16-10-2014 11:38:38

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

[Résolu] Problème avec la validation d'un formulaire

Bonjour,

J'ai une structure similaire à la page suivante : http://framework.zend.com/manual/2.0/en … tions.html

J'ai donc un formulaire (Je sais que par la suite je devrai passer par un fieldset), j'ai un problème avec la validation de celui-ci. Je n'entre jamais dans mon if ($form->isValid()) {} alors que le formulaire n'affiche aucune erreur de validation.

Voici mon modèle Order.php

Code:

[lang=php]
<?php
namespace Application\Model;

use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilter;

class Order implements InputFilterAwareInterface
{
    public $order_date_passage;
    public $order_time_start_passage;
    public $order_time_end_passage;
    public $order_ask_price;
    protected $inputFilter;

    public function exchangeArray($data)
    {
        $this->order_date_passage = (isset($data['order_date_passage'])) ? $data['order_date_passage'] : null;
        $this->order_time_start_passage = (isset($data['order_time_start_passage'])) ? $data['order_time_start_passage'] : null;
        $this->order_time_end_passage = (isset($data['order_time_end_passage'])) ? $data['order_time_end_passage'] : null;
        $this->order_ask_price  = (isset($data['order_ask_price'])) ? $data['order_ask_price'] : null;
    }
    
    public function setInputFilter(\Zend\InputFilter\InputFilterInterface $inputFilter)
    {
        throw new \Exception("Not used");
    }
    
    public function getInputFilter()
    {
        if (!$this->inputFilter) {
            $inputFilter = new InputFilter();
    
            $inputFilter->add(
                array(
                    'name'     => 'order_date_passage',               
                    'required' => true,                 
                    'filters'  => array(               
                        array('name' => 'StripTags'),  
                        array('name' => 'StringTrim'), 
                    ),
                    'validators' => array(
                        array(
                            'name' => 'Regex',
                            'options' => array(
                                'pattern' => '/^[a-zA-Z]+ [0-9]{2} [\p{L}\s]+ [0-9]{4}$/u',
                            ),
                        ),
                    ),
                )
            );
            
            $inputFilter->add(
                array(
                    'name'     => 'order_time_start_passage',
                    'required' => true,
                    'filters'  => array(
                        array('name' => 'StripTags'),
                        array('name' => 'StringTrim'),
                    ),
                    'validators' => array(
                        array(
                            'name' => 'Regex',
                            'options' => array(
                                'pattern' => '/^[0-9]{1,2}$/i',
                                'message' => 'L\'heure de debut doit etre un numerique de longueur 2.'
                            ),
                        ),
                    ),
                )
            );    

            $inputFilter->add(
                array(
                    'name'     => 'order_time_end_passage',
                    'required' => true,
                    'filters'  => array(
                        array('name' => 'StripTags'),
                        array('name' => 'StringTrim'),
                    ),
                    'validators' => array(
                        array(
                            'name' => 'Regex',
                            'options' => array(
                                'pattern' => '/^[0-9]{1,2}$/i',
                                'message' => 'L\'heure de fin doit etre un numerique de longueur 2.'
                            ),
                        ),
                    ),
                )
            );
    
            $inputFilter->add(
                array(
                    'name'     => 'order_ask_price',
                    'required' => false,
                    'filters'  => array(
                        array('name' => 'StripTags'),
                        array('name' => 'StringTrim'),
                    ),
                    'validators' => array(
                        array(
                            'name'    => 'StringLength',
                            'options' => array(
                                'encoding' => 'UTF-8',
                                'min'      => 1,
                                'max'      => 1,
                            ),
                        ),
                        array(
                            'name' => 'Regex',
                            'options' => array(
                                'pattern' => '/^[0-9]{1}$/i',
                                'message' => 'Les valeurs doivent etre uniquement oui ou non'
                            ),
                        ),
                    ),
                )
            );
    
            $this->inputFilter = $inputFilter;
        }
    
        return $this->inputFilter;
    }
}

Voici mon formulaire OrderForm.php

Code:

[lang=php]
<?php
namespace Application\Form;

use Zend\Form\Element;
use Zend\Form\Form;
use Zend\Captcha;

class OrderForm extends Form
{        
    public function __construct($name = null)
    {        
        // we want to ignore the name passed
        parent::__construct('order');
        
        // On définit la méthode d'envoie du formulaire en POST
        $this->setAttribute('method', 'post');
        
        $this->add(array(
            'name' => 'order_date_passage',
            'options' => array(
                'label' => 'Date de passage',
            ),
            'attributes' => array(
                'type' => 'text',
                'class' => 'form-control',
                'id' => 'datepicker',
                'required' => true,
            ),
        ));
                
        $this->add(array(
            'name' => 'order_time_start_passage',
            'type' => 'Zend\Form\Element\Number',
            'options' => array(
                'label' => 'Entre',
            ),
            'attributes' => array(
                'class' => 'form-control',
                'id' => 'inputTimeStart3',
                'required' => true,
                'step' => '1',
            ),
        ));
        
        $this->add(array(
            'name' => 'order_time_end_passage',
            'type' => 'Zend\Form\Element\Number',
            'options' => array(
                'label' => 'heures et',
            ),
            'attributes' => array(
                'class' => 'form-control',
                'id' => 'inputTimeEnd3',
                'required' => true,
                'step' => '1'
            ),
        ));
        
        $this->add(array(
            'name' => 'order_ask_price',
            'type' => 'Zend\Form\Element\Checkbox',
            'options' => array(
                'label' => 'Recevoir le prix par e-mail',
            ),
            'attributes' => array(
                'class' => 'form-control',
                'id' => 'inputAskPrice3',
                //'checked_value' => 'oui',
                //'unchecked_value' => 'non',
                'value' => 1,
            ),
        ));
        
        $this->add(array(
            'type' => 'Zend\Form\Element\Captcha',
            'name' => 'captcha',
            'options' => array(
                'label' => 'Captcha',
                'captcha' => array(
                    'class' => 'figlet',
                    'wordLen' => 6,
                    'timeout' => 300,
                ),                      
            ),
            'attributes' => array(
                 'class' => 'form-control',
                 'id' => 'inputCaptcha3',
                'required' => true,
                 'placeholder' => 'Recopiez le texte ci-dessus',
            ),
        ));

        $this->add(array(
            'name' => 'csrf',
            'type' => 'Csrf',
            'options' => array(
                 'csrf_options' => array(
                     'timeout' => 600
                  )
             )
        ));
        
        $this->add(array(
            'name' => 'submit',        
            'type' => 'Submit',        
            'attributes' => array(    
                'value' => 'Terminer ma commande', 
                'id' => 'submit', 
                'class' => 'btn btn-default btn-lg validerCommande'    
            ),
        ));
    }
}

Voic le code dans l'action de mon controlleur qui va s'occupée du traitement du formulaire

Code:

[lang=php]
    public function commandeAction()
    {
        $form = new OrderForm();        
        $request = $this->getRequest();

        if ($request->isPost()) {
            $order = new Order();
            $form->setInputFilter($order->getInputFilter());
            $form->setData($request->getPost());

            if ($form->isValid()) {
                echo "toto"; 
                        exit();

                $order->exchangeArray($form->getData());
            }
        }

        return new ViewModel(array(
            'form' => $form
        ));
    }

Mon echo "toto"; ne s'affiche jamais.

Lorsque j'envoi le formulaire avec une erreur de validation, le formulaire est affiché ainsi que le message d'erreur de validation, généré par le validator. ----> OK

Lorsque j'envoi le formulaire sans erreurs de validation, le formulaire se ré-affiche. Il n'entre pas dans le if($form->isValid()), donc il considère que celui-ci n'est pas valide.

Mais je n'arrive pas à savoir pourquoi.

Merci

Dernière modification par romsVLM (16-10-2014 18:14:27)

Hors ligne

 

#2 16-10-2014 11:44:14

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

Re: [Résolu] Problème avec la validation d'un formulaire

Bonjour,
A priori je ne vois rien de faux dans ton formulaire, affiche tu dans ta vue, ton champ csrf ? Si tu valide ton formulaire complètement mais qu'il ne le valide pas le champ caché csrf peut être une piste.


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#3 16-10-2014 11:48:19

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

Re: [Résolu] Problème avec la validation d'un formulaire

Oui oui il est bien affiché dans ma vue.

Code:

[lang=php]
echo $this->formHidden($form->get('csrf'));

J'ai même essayé en supprimant le champs csrf du formulaire et j'ai toujours pareil.

Ce problème est vraiment bizarre, car j'ai d'autre formulaire sur mon site qui ont la même structure, et je n'ai pas eu ce problème.

Hors ligne

 

#4 16-10-2014 12:07:22

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: [Résolu] Problème avec la validation d'un formulaire

Hello smile

Pourrais tu nous montrer avec quelles valeurs tu remplis les champs de ton formulaire? ^^

Dernière modification par flobrflo (16-10-2014 12:07:33)

Hors ligne

 

#5 16-10-2014 12:14:36

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

Re: [Résolu] Problème avec la validation d'un formulaire

salut flobrflo.

Le champ order_date_passage est un champs texte avec un datepicker jquery avec un format: "DD dd MM yyyy",
donc quand je choisi une date le champs prend la valeur  : Mardi 21 Octobre 2014

Les champs order_time_start_passage et order_time_end_passage sont de type Number. Ils prennent pour valeur "14" et "19" par exemple.

Le champ order_ask_price est de type Checkbox, il a pour valeur "1". S'il est coché la valeur est 1, s'il n'est pas coché il n'a pas de valeur

Hors ligne

 

#6 16-10-2014 18:14:43

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

Re: [Résolu] Problème avec la validation d'un formulaire

problème résolu merci

Hors ligne

 

#7 16-10-2014 19:06:18

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Résolu] Problème avec la validation d'un formulaire

Ca aurait pu être sympa d'indiquer d'où venait le problème smile.

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages