Je me permet de vous demander de l'aide à vous chers camarades !
En effet j'ai un soucis depuis quelques semaines je tourne en rond sur comment faire un système de listes déroulantes liées du type : Pays/Région
(Oui seulement avec 2 entités, une catégorie et une sous-catégorie donc !).
J'ai essayé plusieurs solutions trouvable sur le net :
http://symfony.com/doc/current/cookb...submitted-data
Ou encore la solution très détaillée de Cescu sur notre cher forum:
http://www.developpez.net/forums/d13...ix-liee-liste/
Mais rien n'y a fait je me suis cassé les dents sur les 2 méthodes !
Concrètement j'ai 2 entités concernant le formulaire: Secteur et Thematique (La sous-catégorie de Secteur donc)
AppelOffre étant la grosse entité tout en haut.
Tout mon formulaire s'affiche impeccable, mais ma liste Thematique reste vide en toutes circonstances ...
AppelOffre.php :
Dans mon controller maintenant la fonction AjouterAction():
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 /** ****** @ORM\ManyToOne(targetEntity="Af\SiteBundle\Entity\Secteur", inversedBy="thematiques") ****** @ORM\JoinColumn(nullable=false) ******/ ****private $secteur; * ****/** ****** @ORM\ManyToOne(targetEntity="Af\SiteBundle\Entity\Thematique") ****** @ORM\JoinColumn(nullable=false) ******/ ****private $thematique;
La partie ajouter.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
36
37
38
39
40
41
42
43
44
45
46
47 public function ajouterAction() ***{ ******$mesThematiques = array(); * *******$ao = new AppelOffre; *******$form = $this->createForm(new AppelOffreType(1), $ao); //ajout du 1 en parametre de 'new AppelOffreType(1)' * *******$request = $this->get('request'); * * *******if($request->isXmlHttpRequest()) { ***********$idSecteur = $request->request->get('idSecteur'); * ***********$em = $this->getDoctrine() ***************->getEntityManager(); * ***********$secteurChoisi = $em->getRepository('AfSiteBundle:Secteur') ***************->find($idSecteur); ***********$this->container->get('request')->getSession()->set('secteurSelected', $secteurChoisi->getId()); ***********$thematiquesDuSecteurChoisi = $secteurChoisi->getAvailableThematiques(); * ***********$html = "<select id=\"af_sitebundle_appeloffre_thematique\" name=\"af_sitebundle_appeloffre[thematique]\" required=\"required\" class=\"span4\">"; ***********foreach ($thematiquesDuSecteurChoisi as $them) { ***************$html = $html . "<option value=\"" . $them->getId() . "\">" . $them->getLibelleThematique() . "</option>"; ***********} ***********$html = $html . "</select>"; ***********return new Response($html); *******} * *******if ($request->getMethod() == 'POST') { ***********$form->bind($request); ***********if ($form->isValid()){ ***************$em = $this->getDoctrine()->getManager(); ***************$em->persist($ao); ***************$em->flush(); ***************// On définit un message flash ***************$this->get('session')->getFlashBag()->add('info', 'Appel d/offre publié'); * ***************return $this->redirect( $this->generateUrl('afsite_voir', array('id' => $ao->getId()))); * ***********} *******} *******// Si on n'est pas en POST, alors on affiche le formulaire *******return $this->render('AfSiteBundle:Site:ajouter.html.twig', array( ***********'form' => $form->createView(), *******)); ***}
La partie formulaireAjouter.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 {# src/Af/SiteBundle/Resources/views/Site/ajouter.html.twig #} * {% extends "AfSiteBundle::layout.html.twig" %} * {% block body %} * ****<p id="action"> Ajouter un Appel d'Offre</p> * ****{% include "AfSiteBundle:Site:formulaire.html.twig" %} * ****<p> ********Attention : cet Appel d'Offre sera ajouté directement ********sur le fil d'actualité de la page d'accueil après validation du formulaire. ****</p> ****{% include "AfSiteBundle:Site:formulaireAjouter.html.twig" %} {% endblock %}
Ma partie AppelOffreType.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
48
49
50 {# src/Af/SiteBundle/Resources/views/Site/formulaireAjouter.html.twig #} * <div class="row"> ****<div class="span2"> ********{{ form_label(form.secteur, "Secteur") }} ****</div> ****{{ form_errors(form.secteur) }} ****<div class="span7"* id="monSecteur"> ********{{ form_widget(form.secteur, {'attr' : {'class' : 'span4'}}) }} ****</div> </div> * <div class="row"> ****<div class="span2"> ********{{ form_label (form.thematique, "Thématiques") }} ****</div> ****{{ form_errors(form.thematique) }} ****<div class="span7" id="mesThematiques"> ********{{ form_widget(form.thematique, {'attr' : {'class' : 'span7'}}) }} ****</div> </div> * {{ form_rest(form) }} * <div class="row"> ****<div class="span6"> ********<button type="submit"* class="btn btn-primary">Enregistrer</button> ********<button type="reset"** class="btn btn-primary">Annuler</button> ****</div> </div> * <script src="{{ asset('js/jquery.min.js') }}"></script> <script type="text/javascript"> * ****$('#monSecteur select').change(function() { ********var idSecteur = $('#monSecteur select').val(); ********var secteurSelected = $('#monSecteur select').text(); ********var thematiqueSelected = ''; ********$.ajax({ ************type: 'POST', ************data: {'idSecteur' : idSecteur}, ************url:* '{{ path('afsite_ajouter') }}', ************success: function(response) { ****************$('#mesThematiques select').html(response).show(); ************} ********}); ****}); * * </script>
Et le IsAdminFieldSuscriber.php que j'ai du créer manuellement comme dans le 2ème lien :
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
60
61
62
63
64 class AppelOffreType extends AbstractType { ****private $idSecteur; * ****public function __construct($idd) { * ********$this->idSecteur = $idd; ****} * ****/** ****** @param FormBuilderInterface $builder ****** @param array $options ******/ ****public function buildForm(FormBuilderInterface $builder, array $options) ****{ ********$builder ************->add('libelle') ************->add('auteur') ************->add('entreprise') ************->add('annee','choice',array( ****************'choices'=>array( ********************'2007' => 2007, ********************'2008' => 2008, ********************'2009' => 2009, ********************'2010' => 2010, ********************'2011' => 2011, ********************'2012' => 2012, ********************'2013' => 2013, ********************'2014' => 2014, ********************'2015' => 2015, ********************'2016' => 2016, ********************'2017' => 2017, ********************'2018' => 2018, ********************'2019' => 2019, ********************'2020' => 2020), ****************'empty_value'=>'Choisir une année', ****************'multiple'=>false)) ************->add('file') ************->add('module', 'collection', array('type' => new ModuleType(), ****************'allow_add'*** => true, ****************'allow_delete' => true)) * ************->add('secteur', ************'entity', ************array('query_builder'=> function(EntityRepository $er) { ********************return $er->createQueryBuilder('u')->orderBy('u.libelleSecteur', 'ASC');}, ****************'class'******* =>'AfSiteBundle:Secteur', ****************'property'**** =>'libelleSecteur', ************)); ********$secteur = $this->idSecteur; ********$builder->add('thematique', ************'entity', ************array('query_builder'=> function(EntityRepository $repository)use($secteur) { ********************return $repository->createQueryBuilder('thematique') ************************->where('thematique.secteur=:secteur') ************************->setParameter('secteur', $secteur); ****************}, ****************'class' =>'AfSiteBundle:Thematique' ************)); * * ********$subscriber = new IsAdminFieldSubscriber($builder->getFormFactory()); ********$builder->addEventSubscriber($subscriber); ****}
Donc voilà, la case Secteur fonctionne correctement, mais la liste Thematique reste quant à elle vide ...
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 <?php * namespace Af\SiteBundle\Form\EventListener; * use Symfony\Component\Form\EventDataEvent; use Symfony\Component\Form\FormFactoryInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\Form\FormEvents; use Doctrine\ORM\EntityRepository; * class IsAdminFieldSubscriber implements EventSubscriberInterface { * ****private $factory; * ****public function __construct(FormFactoryInterface $factory) ****{ ********$this->factory = $factory; ****} * ****public static function getSubscribedEvents() ****{ ****return array( ****FormEvents::PRE_BIND => 'preBind', ****); ****} * ****public function preBind(DataEvent $event) ****{ ********$data = $event->getData(); ********$form = $event->getForm(); * ********if (null === $data) { *************return; ********} * ********$secteur = $data['secteur']; * ********$form->add($this->factory->createNamed( ************'thematique', ************'entity', ************null, ************array('query_builder'=> function(EntityRepository $repository)use($secteur){ ************return $repository->createQueryBuilder('thematique') ************->where('thematique.secteur=:secteur') ************->setParameter('secteur', $secteur); ********}, **********'class' =>'AfSiteBundle:Thematique' ********) ********)); ****} }
Partager