Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 26-02-2014 11:25:44

kheops226
Nouveau membre
Date d'inscription: 23-01-2014
Messages: 9

Formulaire post

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:

Code:

[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 :

Code:

[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

 

#2 26-02-2014 12:02:04

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

Re: Formulaire post

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

 

#3 26-02-2014 12:05:26

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

Re: Formulaire post

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 wink.

Enfin sans voir ce que tu fais de ton formulaire dans la vue on peut pas t'aider wink. 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 big_smile. 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 wink ! Après si le serveur te dit que c'est du GET ça ne devrait pas ...

Hors ligne

 

#4 26-02-2014 13:23:33

kheops226
Nouveau membre
Date d'inscription: 23-01-2014
Messages: 9

Re: Formulaire post

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

Code:

[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

Code:

[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


Code:

[lang=php]if ($formAgence->isValid()){ 
                 print_r($request->getPost());
                 foreach ($formAgence->get('tel')->getIterator() as $fieldset){
                     var_dump($fieldset->getValue());
                 }

Hors ligne

 

#5 26-02-2014 14:29:23

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

Re: Formulaire post

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

 

#6 27-02-2014 09:24:41

kheops226
Nouveau membre
Date d'inscription: 23-01-2014
Messages: 9

Re: Formulaire post

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

 

#7 27-02-2014 10:10:21

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

Re: Formulaire post

Salut, en changeant le name de ton input ??

Hors ligne

 

#8 27-02-2014 12:21:00

kheops226
Nouveau membre
Date d'inscription: 23-01-2014
Messages: 9

Re: Formulaire post

Voici le code du formulaire:


Code:

[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

Code:

[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

 

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