Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour a tous. j'ai un probleme avec la soumission de mes formulaire.
La methode du formulaire est POST mais l'action de taritement reçoit toujours un GET.
Voici le code de mon formulaire:
[lang=php]<?php namespace Distribution\Form; use Zend\Form\Form; use Doctrine\Common\Persistence\ObjectManager; use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator; use Zend\Form\Annotation\AnnotationBuilder; use Application\Entity\TAgence; use Application\Entity\TAdresse; use Application\Entity\TTel; use Symfony\Component\Console\Input\InputAwareInterface; use Zend\InputFilter\InputFilterProviderInterface; class agenceForm extends Form implements InputFilterProviderInterface{ protected $objectManager; public function __construct(ObjectManager $objectManager){ $this->objectManager = $objectManager; parent::__construct('agence-form'); $this->setAttribute('method', 'post') ->setHydrator(new DoctrineHydrator($objectManager)); $agence = new TAgence(); $builder = new AnnotationBuilder($objectManager); $fieldsetAgence = $builder->createForm($agence); $fieldsetAgence ->setHydrator(new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($objectManager, 'Application\Model\Entity\TAgence')) ->setObject(new TAgence()); $adresse = new TAdresse(); $fieldsetAdresse = $builder->createForm($adresse); $fieldsetAdresse ->setHydrator(new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($objectManager, 'Application\Model\Entity\TAdresse')) ->setObject(new TAdresse()); $telephone = new TTel(); $fieldsetTel = $builder->createForm($telephone); $fieldsetTel ->setHydrator(new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($objectManager, 'Application\Model\Entity\TTel')) ->setObject(new TTel()); $this->add($fieldsetAgence); $this->add($fieldsetAdresse); //$this->add($fieldsetTel); $this->add(array( 'type' => 'Zend\Form\Element\Collection', 'name' => 'tel', 'options' => array( 'label' => 'Téléphone', 'count' => 2, 'should_create_template' => true, 'allow_add' => true, 'target_element' => $fieldsetTel, ), )); $this->add(array( 'type' => 'DoctrineModule\Form\Element\ObjectSelect', 'name' => 'ville', 'options' => array( 'label' => 'Sélectionner la ville:', 'object_manager' => $this->objectManager, 'target_class' => 'Application\Entity\Tville', 'property' => 'cVille', 'empty_option' => '--- Selectionner une ville ---' ) ) ); $this->add(array( 'name' => 'submit', 'attributes' => array( 'type' => 'submit', 'value' => 'Enregistrer', 'class' => 'btn btn-primary' ) )); $this->add(array( 'name' => 'Cancel', 'attributes' => array( 'type' => 'submit', 'value' => 'Annuler', 'class' => 'btn btn-danger' ) )); } public function getInputFilterSpecification() { return array( 'cNomagence' => array( 'filters' => array( array( 'name' => 'StringTrim' ) ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'min' => 2, 'max' => 20, ), ), ), ), ); } } ?>
Voici le code de l'action de traitement :
[lang=php]public function ajouterAction(){ if ($this->flashMessenger()->hasMessages()) { $message = $this->flashMessenger()->getMessages(); foreach ($message as $msg){ echo $msg; } } $objectManager = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default'); $formAgence = new agenceForm($objectManager); $agence = new TAgence(); $request = $this->getRequest(); var_dump($_SERVER['REQUEST_METHOD']); //Affiche toujours 'GET' if ($request->isPost()){ }
Hors ligne
Bonjour,
Dans ta page html, ton formulaire apparait bien avec la method="post"?
si oui,lorsque tu affiche un $_POST, il est bien vide?
Hors ligne
Salut, déjà un truc bateau, on ne met pas de balise fermante PHP à la fin du classe ça évite d'avoir des espaces blancs bizarres.
Ensuite un nom de classe commence TOUJOURS par une majuscule c'est les conventions .
Enfin sans voir ce que tu fais de ton formulaire dans la vue on peut pas t'aider . La création de ton formulaire est pas super clean (tu peux faire beaucoup plus propre) mais tu utilises les fieldsets donc c'est déjà ça . Tu n'as pas non plus besoin de préciser la méthode par défaut c'est post et ça rajouter le multipart lorsqu'il y a un composant de type file donc je pense que t'as oublié un truc côté vue si ça ne fonctionne pas.
Es-tu sûr que tu passes pas dans $request->isPost() ?? Parce que normalement tu n'as pas besoin d'utiliser les variables globale avec le ZF2, c'est justement l'intérêt elles sont cachées derrière des objets ! Après si le serveur te dit que c'est du GET ça ne devrait pas ...
Hors ligne
Merci Orkin de me rappeler les convention de base.
Vu que je trauvais pas la solution, j'ai tout reconstruit depuis le debut.
voici maintenant le code formulaire
[lang=php]<?php namespace Distribution\Form; use Zend\Form\Form; use Doctrine\Common\Persistence\ObjectManager; use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator; use Zend\Form\Annotation\AnnotationBuilder; use Application\Entity\TAgence; use Application\Entity\TAdresse; use Application\Entity\TTel; class AgenceForm extends Form{ protected $objectManager; public function __construct(ObjectManager $objectManager){ $this->objectManager = $objectManager; parent::__construct('agence-form'); $this->setAttribute('method', 'post') ->setHydrator(new DoctrineHydrator($objectManager)); $Agence = new TAgence(); $builder = new AnnotationBuilder($objectManager); $fieldsetAgence = $builder->createForm($Agence); $fieldsetAgence ->setHydrator(new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($objectManager, 'Application\Model\Entity\TAgence')) ->setObject(new TAgence()); $Adresse = new TAdresse(); $fieldsetAdresse = $builder->createForm($Adresse); $fieldsetAdresse ->setHydrator(new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($objectManager, 'Application\Model\Entity\TAdresse')) ->setObject(new TAdresse()); $Telephone = new TTel(); $fieldsetTel = $builder->createForm($Telephone); $fieldsetTel ->setHydrator(new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($objectManager, 'Application\Model\Entity\TTel')) ->setObject(new TTel()); $this->add($fieldsetAgence); $this->add($fieldsetAdresse); // $this->add($fieldsetTel); $this->add(array( 'type' => 'DoctrineModule\Form\Element\ObjectSelect', 'name' => 'ville', 'options' => array( 'label' => 'Selectionner la ville:', 'object_manager' => $this->objectManager, 'target_class' => 'Application\Entity\Tville', 'property' => 'cVille', 'empty_option' => '--- Selectionner une ville ---' ) ) ); $this->add(array( 'type' => 'Zend\Form\Element\Collection', 'name' => 'tel', 'options' => array( 'label' => 'Téléphone', 'count' => 2, 'should_create_template' => true, 'allow_add' => true, 'target_element' => $fieldsetTel, ), )); $this->add(array( 'name' => 'submit', 'attributes' => array( 'type' => 'submit', 'value' => 'Enregistrer', 'class' => 'btn btn-primary' ) )); $this->add(array( 'name' => 'Cancel', 'attributes' => array( 'type' => 'submit', 'value' => 'Annuler', 'class' => 'btn btn-danger' ) )); } }
Voici le code de la vue
[lang=php]<div class="row-fluid"> <?php $form = $this->formAgence; $form->setAttribute('action', $this->url( 'agence', array( 'action' => 'ajouter', ) )); ?> <?php $fieldsetAgence = $this->formAgence->get('agence'); $labelAttr = array('class' => 'control-label'); $fieldsetAgence = $this->formAgence->get('agence'); $fieldsetAgence->get('cNomagence')->setLabelAttributes($labelAttr); $fieldsetAdresse = $this->formAgence->get('adresse'); $fieldsetAdresse->get('cBp')->setLabelAttributes($labelAttr); $fieldsetAdresse->get('cEmail')->setLabelAttributes($labelAttr); $fieldsetAdresse->get('cEmplacement')->setLabelAttributes($labelAttr); $form->get('ville')->setLabelAttributes($labelAttr); ?> <?php echo '</hr>'?> <?php $form->setAttribute('class','form-horizontal'); echo $this->form()->openTag($form); ?> <div class="control-group"> <?php echo $this->formLabel($fieldsetAgence->get('cNomagence'));?> <div class="controls"> <?php echo $this->forminput($fieldsetAgence->get('cNomagence'));?> </div> </div> <div class="control-group"> <?php echo $this->formLabel($fieldsetAdresse->get('cBp'));?> <div class="controls"> <?php echo $this->forminput($fieldsetAdresse->get('cBp'));?> </div> </div> <div class="control-group"> <?php echo $this->formLabel($fieldsetAdresse->get('cEmail'));?> <div class="controls"> <?php echo $this->forminput($fieldsetAdresse->get('cEmail'));?> </div> </div> <div class="control-group"> <?php echo $this->formLabel($fieldsetAdresse->get('cEmplacement'));?> <div class="controls"> <?php echo $this->forminput($fieldsetAdresse->get('cEmplacement'));?> </div> </div> <div class="control-group"> <?php echo $this->formLabel($form->get('ville'));?> <div class="controls"> <?php echo $this->formSelect($form->get('ville'));?> </div> </div> <?php echo $this->formCollection($form->get('tel'));?> <div class="form-actions"> <?php echo $this->formSubmit($form->get('submit'));?> <?php echo $this->formSubmit($form->get('Cancel'));?> </div> <?php echo $this->form()->closeTag();?> </div>
J'aimerais maintenant recuperer tous les éléments de la collection.
Mis ceci me ramene null pour tous les champ
[lang=php]if ($formAgence->isValid()){ print_r($request->getPost()); foreach ($formAgence->get('tel')->getIterator() as $fieldset){ var_dump($fieldset->getValue()); }
Hors ligne
Tu peux aussi utiliser les balises code ... Il te manque le prepare() dans la vue donc c'est pas correct. Par contre ça serait bien de savoir ce qui ne marchait pas avant parce que là visiblement ça fonctionne. Ensuite même chose le method post sur un formulaire t'es pas obligé de le mettre c'est par défaut.
Normalement si ton formulaire est bien fait (j'ai pas tout vérifié) après avoir fait le isValid tu peux faire $monForm->getData() pour récupérer les données de tout le formulaire. Si c'est bien fait avec un hydrateur et tout tu vas récupérer un objet instancié avec toutes les valeurs de remplies (y compris les collections s'il y en a et que t'as rien loupé) sinon ça te retourne un tableau. Et surtout ne pas récupérer les données du post après les avoir validées sinon ça sert à rien. En plus de la validation les filtres sont exécutés sur les champs (genre tu veux retirer les espaces, mettre la première lettre en majuscule etc ...)
Hors ligne
Bonjour!!
Maintenant j'arrive a recupérer les données de la collection. J'aimerais y ajouter d'autres collection du meme type que le premier pour le fax et le telephone mobil. comment ajouter une id à mes collection pour pouvoir les differencier?
Dernière modification par kheops226 (27-02-2014 09:25:25)
Hors ligne
Salut, en changeant le name de ton input ??
Hors ligne
Voici le code du formulaire:
[lang=php]<?php namespace Distribution\Form; use Zend\Form\Form; use Doctrine\Common\Persistence\ObjectManager; use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator; use Zend\Form\Annotation\AnnotationBuilder; use Application\Entity\TAgence; use Application\Entity\TAdresse; use Application\Entity\TTel; class AgenceForm extends Form{ protected $objectManager; public function __construct(ObjectManager $objectManager){ $this->objectManager = $objectManager; parent::__construct('agence-form'); $this->setHydrator(new DoctrineHydrator($objectManager)); $Agence = new TAgence(); $builder = new AnnotationBuilder($objectManager); $fieldsetAgence = $builder->createForm($Agence); $fieldsetAgence ->setHydrator(new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($objectManager, 'Application\Model\Entity\TAgence')) ->setObject(new TAgence()); $Adresse = new TAdresse(); $fieldsetAdresse = $builder->createForm($Adresse); $fieldsetAdresse ->setHydrator(new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($objectManager, 'Application\Model\Entity\TAdresse')) ->setObject(new TAdresse()); $Telephone = new TTel(); $fieldsetTel = $builder->createForm($Telephone); $fieldsetTel ->setHydrator(new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($objectManager, 'Application\Model\Entity\TTel')) ->setObject(new TTel()); $fieldsetTelMob = $builder->createForm($Telephone); $fieldsetTelMob ->setHydrator(new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($objectManager, 'Application\Model\Entity\TTel')) ->setObject(new TTel()); $fieldsetTelMob->get('cNumero')->setLabel('Mobil :'); $fieldsetTelFax = $builder->createForm($Telephone); $fieldsetTelFax ->setHydrator(new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($objectManager, 'Application\Model\Entity\TTel')) ->setObject(new TTel()); $fieldsetTelFax->get('cNumero')->setLabel('Fax :'); $this->add($fieldsetAgence); $this->add($fieldsetAdresse); // $this->add($fieldsetTel); $this->add(array( 'type' => 'DoctrineModule\Form\Element\ObjectSelect', 'name' => 'ville', 'required' => true, 'options' => array( 'label' => 'Ville :', 'object_manager' => $this->objectManager, 'target_class' => 'Application\Entity\Tville', 'property' => 'cVille', 'empty_option' => '--- Selectionner une ville ---' ) ) ); $this->add(array( 'type' => 'Zend\Form\Element\Collection', 'name' => 'Fixe', 'options' => array( 'label' => 'Téléphone fixe', 'count' => 1, 'should_create_template' => true, 'allow_add' => true, 'target_element' => $fieldsetTel, ), )); $this->add(array( 'type' => 'Zend\Form\Element\Collection', 'name' => 'Mobil', 'options' => array( 'label' => 'Téléphone mobil', 'count' => 0, 'should_create_template' => true, 'allow_add' => true, 'target_element' => $fieldsetTelMob, ), )); $this->add(array( 'type' => 'Zend\Form\Element\Collection', 'name' => 'Fax', 'options' => array( 'label' => 'Fax', 'count' => 1, 'should_create_template' => true, 'allow_add' => true, 'target_element' => $fieldsetTelFax, ), )); $this->add(array( 'name' => 'submit', 'attributes' => array( 'type' => 'submit', 'value' => 'Enregistrer', 'class' => 'btn btn-primary' ) )); $this->add(array( 'name' => 'Cancel', 'attributes' => array( 'type' => 'submit', 'value' => 'Annuler', 'class' => 'btn btn-danger' ) )); } }
Voici le code de la vue
[lang=php]<div class="row-fluid"> <?php $form = $this->formAgence; $form->prepare(); $form->setAttribute('action', $this->url( 'agence', array( 'action' => 'ajouter', ) )); ?> <?php $fieldsetAgence = $this->formAgence->get('agence'); $labelAttr = array('class' => 'control-label'); $fieldsetAgence = $this->formAgence->get('agence'); $fieldsetAgence->get('cNomagence')->setLabelAttributes($labelAttr); $fieldsetAdresse = $this->formAgence->get('adresse'); $fieldsetAdresse->get('cBp')->setLabelAttributes($labelAttr); $fieldsetAdresse->get('cEmail')->setLabelAttributes($labelAttr); $fieldsetAdresse->get('cEmplacement')->setLabelAttributes($labelAttr); $form->get('ville')->setLabelAttributes($labelAttr); $listFieldsetMob = $form->get('Mobil')->getFieldsets(); foreach ($listFieldsetMob as $fieldsetMob){ } ?> <?php echo '</hr>'?> <?php $form->setAttribute('class','form-horizontal'); echo $this->form()->openTag($form); ?> <div class="control-group"> <?php echo $this->formLabel($fieldsetAgence->get('cNomagence'));?> <div class="controls"> <?php echo $this->forminput($fieldsetAgence->get('cNomagence'));?> </div> </div> <div class="control-group"> <?php echo $this->formLabel($fieldsetAdresse->get('cBp'));?> <div class="controls"> <?php echo $this->forminput($fieldsetAdresse->get('cBp'));?> </div> </div> <div class="control-group"> <?php echo $this->formLabel($fieldsetAdresse->get('cEmail'));?> <div class="controls"> <?php echo $this->forminput($fieldsetAdresse->get('cEmail'));?> </div> </div> <div class="control-group"> <?php echo $this->formLabel($fieldsetAdresse->get('cEmplacement'));?> <div class="controls"> <?php echo $this->forminput($fieldsetAdresse->get('cEmplacement'));?> </div> </div> <div class="control-group"> <?php echo $this->formLabel($form->get('ville'));?> <div class="controls"> <?php echo $this->formSelect($form->get('ville'));?> </div> </div> <div id='telFixe'> <?php echo $this->formCollection($form->get('Fixe'));?> <button class="btn icon32 icon-color icon-square-plus nouvElt" id="telFixe"></button> </div> <div id='telMobil'> <?php echo $this->formCollection($form->get('Mobil'));?> <button class="btn icon32 icon-color icon-square-plus nouvElt" id="telMobil"></button> </div> <div id='telFax'> <?php echo $this->formCollection($form->get('Fax'));?> <button class="btn icon32 icon-color icon-square-plus nouvElt" id="telFax"></button> </div> <div class="form-actions"> <?php echo $this->formSubmit($form->get('submit'));?> <?php echo $this->formSubmit($form->get('Cancel'));?> </div> <?php echo $this->form()->closeTag();?> </div>
Faute d'ajouter des id aux collections j'ai envelooppé les collection dans des div qui possede des id et ça marche pour les selection avec jquery.
Hors ligne