Bonjour,
J'ai utilisé cet excellent tutoriel afin d'implémenter Ajax sur un de mes formulaires :
L'objectif est de sélectionner un médicament dans une liste après l'avoir recherché dans un champ texte. La saisie de caractères déclenche un événement ajax qui alimente le select (liste de médicaments correspondant à la recherche). Les options du select ressemblent à ceci (vérifié avec un alert) :
Cette partie fonctionne parfaitement en revanche, je rencontre des difficultés au moment de récupérer les infos du select.
Code : Sélectionner tout - Visualiser dans une fenêtre à part <option value="13">Le médoc 13</option>
En effet, pour que Symfony sache que je lui passe un médicament (et non un simple integer) et conformément au tutoriel, j'ai créé un listener sur l'événement POST_SUBMIT. Dans cet événement, je rajoute un champ entity dont le query_builder me retourne l'objet médicament(13).
Seulement voilà, impossible de récupérer cette valeur 13 (ou autre, 13 est un exemple) !!!
Après de multiples tests (et digressions vis-à-vis du tutoriel de départ), voici la situation :
- un champ texte non mappé où l'utilisateur tape sa recherche
- un champ choice vide au départ et non mappé également qui se remplit avec ajax en fonction de la saisie de la recherche (et qui sélectionne un champ par défaut histoire de ne pas submit sans rien envoyer)
- un champ entity qui est créé par le listener POST_SUBMIT afin de créer le champ qui permet d'envoyer l'objet au "format" Symfony
Dans mon listener :
- si je fais un $event->getForm()->get('champ_texte')->getData(), il me retourne bien la chaine que l'utilisateur a saisie.
- si je fais un $event->getForm()->get('champ_choice')->getData(), il me retourne systématiquement NULL même après avoir sélectionné un objet de ma liste.
Sans cet identifiant, impossible pour moi de créer l'entité correspondante au choix de l'utilisateur dans champ_choice.
Ci-dessous, le code de mon Type :
Merci d'avance pour l'aide que vous pourrez m'apporter.
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
48
49
50
51
52
53
54
55
56
57
58
59 <?php namespace Medic\PrescriptionBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; use Symfony\Component\Form\FormInterface; use Medic\PrescriptionBundle\Model\Repository\MedicamentRepository; class AddPrescriptionType extends AbstractType { private $em; public function __construct($em) { $this->em = $em; } public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('fkVoie', 'entity', array('label' => 'Voie d\'administration', 'class' => 'MedicPrescriptionBundle:TypeForme', 'choice_label' => 'libelle', 'attr' => array('class' => 'fkVoie'))) ->add('champ_texte', null, array('mapped' => false, 'required' => false, 'label' => 'Médicament', 'attr' => array('class' => 'medic_prescription_type_medicamentsearchbyselecttype_maRecherche'))) ->add('champ_choice', 'choice', array('mapped' => false, 'attr' => array('class' => 'medic_prescription_type_medicamentsearchbyselecttype_nom'))) ... ; $medicamentFunction = function(FormInterface $form, $medicamentId) { $form->add('champ_entity', 'entity', array('class' => 'MedicPrescriptionBundle:Medicament', 'choice_label' => 'libelle', 'query_builder' => function(MedicamentRepository $repo) use ($medicamentId) { return $repo->findOneById($medicamentId); })); }; $builder->addEventListener(FormEvents::POST_SUBMIT, function(FormEvent $event) use ($medicamentFunction) { var_dump($event->getForm()->get('champ_texte')->getData()); // Affiche bien ce qu'à saisie l'utilisateur var_dump($event->getForm()->get('champ_choice')->getData()); // Affiche toujours NULL quoiqu'il arrive die(); $medicamentFunction($event->getForm(), $event->getForm()->getData()); }); } public function getName() { return 'medic_prescription_type_prescription'; } }
Partager