Bonjour à tous.
J'utilise Symfony 2 et crée un formulaire via le FormBuilder.
Voici mes formulaires:
AmiAttrbType.php
ProduitAttrbType.php
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 <?php namespace Site\TestBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; class AmiAttrbType extends AbstractType { /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('email','text', array( 'required' => true, 'attr' => array( 'placeholder' => 'Adresse Mail' ))) ->add('produitsAttrb','collection', array( 'type' => new ProduitAttrbType() )); } /** * @param OptionsResolverInterface $resolver */ public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Site\TestBundle\Entity\Ami' )); } /** * @return string */ public function getName() { return 'site_testbundle_amiAttrb'; } }
controller.php
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 <?php namespace Site\TestBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; class ProduitAttrbType extends AbstractType { /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('nom', 'hidden') ->add('qte','integer', array( 'required' => true )); } /** * @param OptionsResolverInterface $resolver */ public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Site\TestBundle\Entity\ProduitAttrb' )); } /** * @return string */ public function getName() { return 'site_testbundle_produitAttrb'; } }
attrb.html.twig:
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 public function attrbAction(Event $commande) { $ami = new Ami; foreach($commande->getProduits() as $produit) { $ami->addProduitsAttrb(new ProduitAttrb($produit->getNom(),0)); } $form = $this->createForm(new AmiAttrbType(),$ami); $request = $this->get('request'); if( $this->get('request')->getMethod() == 'POST' ) { $form->bind($request); if ($form->isValid()) { $commande->addAmi($ami); $em = $this->getDoctrine()->getManager(); $em->merge($commande); $em->flush(); return $this->render('SiteTestBundle:Test:attrb.html.twig', array('commande' =>$commande, 'form' => $form->createView())); } } return $this->render('SiteTestBundle:Test:attrb.html.twig', array('commande' =>$commande, 'form' => $form->createView())); }
La je rencontre deux problèmes.
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 <tr> <td class="attrb-new"> <div class="row"> <div class="col-xs-12"> {{ form_widget(form.email) }} </div> </div> </td> {% for produit in form.produitsAttrb %} <td class="attrb-newQte"> {{ form_widget(produit.qte) }} </td> {% endfor %} {{ form_rest(form) }} </tr>
Le premier, lorsque je saisie l'adresse email dans l'input prévu à cet effet et que je valide. Cela ne fonctionne pas. En regardant dans le profiler, il est indiqué que j'ai deux erreurs: email et token sont null alors que j'ai bien saisie mon email et que le token devrait être renseigné par form_rest.
Mon deuxième soucis, et c'est plutôt une question, en fait j'aimerai tout simplement que le champs "nom" de mon ProduitAttrbType soit pré-rempli par le nom des produits. Chose que je pensais faire dans mon controller avec cette boucle
Mais cela ne semble pas fonctionner. Ou peut-etre que cela ne fonctionne pas parce que mon bind ou handleRequest ne fonctionne pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 foreach($commande->getProduits() as $produit) { $ami->addProduitsAttrb(new ProduitAttrb($produit->getNom(),0)); }
Je n'ai pas encore le moyen de le vérifier.
J'ai vu dans certain cas qu'il fallait utiliser
$form->handleRequest($request);
Si je me cela à la place de $form->bind($request) il ne se passe plus rien, plus de validation.
Ma requete renvoyé par le HandleRequest est vide. On dirait qu'il ne se passe rien. J'ai bien un "1" vert qui indique qu'il n'y a pas d'erreur, mais aucun enregistrement en BDD.
A contrario, si j'utilise bind, j'ai un "2" rouge qui indique que "Email" et "CSRF" sont invalide.
Chose bizarre, j'utilise bien une version supérieur à 2.3 mais bind à jusqu'à ce jour toujours fonctionné dans mes autres formulaires.
Le token apparait bien dans le code de ma page en regardant avec Firebug.
Alors, autre chose bizarre, si je remplace HandleRequest par bind et que je supprime cette partie dans twig.
L'enregistrement se fait bien en bdd.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 {% for produit in form.produitsAttrb %} <td class="attrb-newQte"> {{ form_widget(produit.qte) }} </td> {% endfor %}
il semblerait donc que ce soit cette partie qui pose probléme mais je n'arrive pas à comprendre quoi. J'ai utilisé comme exemple ce qui est décrit dans cette page
http://symfony.com/fr/doc/current/co...llections.html
Merci beaucoup pour votre aide.
Partager