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 :
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;
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
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 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
{# 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 %}
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
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>
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
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);
****}
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
<?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'
********)
********));
****}
}
Donc voilà, la case Secteur fonctionne correctement, mais la liste Thematique reste quant à elle vide ...