Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
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
[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
[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
[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
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.
Hors ligne
Oui oui il est bien affiché dans ma vue.
[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
Hello
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
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
problème résolu merci
Hors ligne
Ca aurait pu être sympa d'indiquer d'où venait le problème .
Hors ligne