IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

[Form] Liste de choix liée à une autre liste [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 206
    Points : 74
    Points
    74
    Par défaut [Form] Liste de choix liée à une autre liste
    Bonjour,

    ce sujet s'addresse à tous ceux qui sont confrontés à un porblème sur lequel j'ai cherché pendant un bon moment et pour lequel j'ai enfin trouvé la solution. Je veux parler ici d'une liste de choix dans un formulaire dont le contenu serait lié à une autre liste de choix. Par exemple, dans un formulaire on pourrait avoir deux listes : la liste des pays et la liste des villes. Selon le pays que l'on choisit la liste des villes serait remplit en conséquence. Dans ce forum j'ai posté beaucoup de sujets qui avaient comme point commun ce problème. Je vais donc donner la façon dont je m'y prends ici par souci de simplification. Je pense que le titre du sujet est assez évocateur pour que ceux qui cherchent à ce propos arrivent directement ici. Dans mon cas ce ne sont pas des pays et des villes mais des ufr et des diplômes. Un ufr est lié à plusieurs diplômes.

    La partie de mon entity Etudiant qui interesse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	 /**
         * @ORM\ManyToOne(targetEntity="Udc\DiplomeBundle\Entity\Ufr", inversedBy="diplomes")  
    	 * @ORM\JoinColumn(nullable=false)
         */
         private $ufr;
     
    	/**
         * @ORM\ManyToOne(targetEntity="Udc\DiplomeBundle\Entity\Diplome")  
    	 * @ORM\JoinColumn(nullable=false)
         */
         private $diplome;

    Dans mon controlleur Etudiant la partie qui me permet d'ajouter un étudiant :

    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
     
    public function ajouterAction() {
    		$mesDiplomes = array();		
    		$etudiant    = new Etudiant;	
    		$form        = $this->createForm(new EtudiantType(1), $etudiant);
     
    		// On récupère la requête.
    		$request = $this->get('request');
    		if($request->isXmlHttpRequest()) {	
    			$idUFR = $request->request->get('idUFR'); 			
    			//
    			// Ici ajax renvoit l'indice de l'ufr selectionné parce-que les ufrs sont affichés
    			// dans la liste sans être triés On récupère l'ufr pour l'index récupéré puis on
    			// récupère les diplomes pour cet ufr. On le met dans la variable $mesDiplomes.
    			//
    			$em = $this->getDoctrine()
    			  	       ->getEntityManager();     
     
    			$ufrChoisi = $em->getRepository('UdcDiplomeBundle:Ufr')
    							->find($idUFR);
    			$this->container->get('request')->getSession()->set('ufrSelected', $ufrChoisi->getId());				
    			$diplomesDeLufrChoisi = $ufrChoisi->getDiplomes();			
     
    			$html = "<select id=\"udc_diplomebundle_etudianttype_diplome\" name=\"udc_diplomebundle_etudianttype[diplome]\" required=\"required\" class=\"span4\">";
    			foreach ($diplomesDeLufrChoisi as $dip) {
    				$html = $html . "<option value=\"" . $dip->getId() . "\">" . $dip->getNomDiplome() . "</option>";
    			}			
    			$html = $html . "</select>";				
    			return new Response($html);
     
            }
     
    		// On vérifie qu'elle est de type « POST ».
    		if( $request->getMethod() == 'POST' ) {  
     
                // On fait le lien Requête <-> Formulaire.
                $form->bind($request);	
     
    			// On vérifie que les valeurs rentrées sont correctes.
                if( $form->isValid()) {
    				// On enregistre notre objet $etudiant dans la base de données.
     
    				$em = $this->getDoctrine()->getEntityManager();
    				$em->persist($etudiant);
    				$em->flush();
     
    				$this->get('session')->setFlash('info', 'Article bien enregistré');
    				// On redirige vers la page de visualisation de l'article nouvellement créé
    				return $this->redirect($this->generateUrl('UdcDiplomeBundle_etudiant'));
    			}                 
    		} 
     
    		//   À ce stade :
    		// - soit la requête est de type « GET », donc le visiteur vient d'arriver sur la page et veut voir le formulaire ;
    		// - soit la requête est de type « POST », mais le formulaire n'est pas valide, donc on l'affiche de nouveau.
    		return $this->render('UdcDiplomeBundle:Etudiant:ajouter.html.twig', array('form' => $form->createView()));
    	}


    Dans mon fichier ajouter.html.twig :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    {% extends "UdcDiplomeBundle::layoutEtudiant.html.twig" %}
     
    {% block title %}Ajouter un étudiant{% endblock %}
     
    {% block body %}
        <h2>Création d'un étudiant</h2>
          {% include "UdcDiplomeBundle:Etudiant:formulaireAjouter.html.twig" %}
    {% endblock %}
    dans formulaire.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
    48
    49
     
    <div class="row">
          <div class="span2">
            {{ form_label(form.ufr, "U.F.R.") }}
          </div>
            {{ form_errors(form.ufr) }}
          <div class="span7"  id="monUFR"> 
            {{ form_widget(form.ufr, {'attr' : {'class' : 'span4'}}) }}
          </div>
       </div>
     
       <div class="row">
          <div class="span2">
            {{ form_label (form.diplome, "Diplomes") }}
          </div>
          {{ form_errors(form.diplome) }}
          <div class="span7" id="mesDiplomes">
            {{ form_widget(form.diplome, {'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('jquery/jquery.min.js') }}" ></script>
       <script type="text/javascript">
     
    			$('#monUFR select').change(function() {  
                var idUFR = $('#monUFR select').val();  
                var ufrSelected = $('#monUFR select').text();  
                var diplomeSelected = '';
                $.ajax({
                    type: 'POST',
                    data: {'idUFR' : idUFR},           
                    url:  '{{ path('UdcDiplomeBundle_etudiant_ajouter') }}',       
                    success: function(response) {
                      $('#mesDiplomes select').html(response).show();
                   }
                });
              });	
     
     
       </script>

    la définition EtudiantType qui interesse :
    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
     
    private $idUfr;
     
    public function __construct($idd) {
     ...
     ...
     $this->idUfr = $idd;
    }
     
    ...
    ...
    ...
    ->add('ufr',
          'entity',
          array('query_builder'=> function(EntityRepository $er) { 
                   return $er->createQueryBuilder('u')->orderBy('u.nom', 'ASC');},
                'class'        =>'UdcDiplomeBundle:Ufr',
                'property'     =>'nom',                 
           ));
    $ufr = $this->idUfr;  
    $builder->add('diplome', 
      	      'entity', 	
    	       array('query_builder'=> function(EntityRepository $repository)use($ufr) {
                             return $repository->createQueryBuilder('diplome')  
                                               ->where('diplome.ufr=:ufr')
                                               ->setParameter('ufr', $ufr);
                           },
                          'class' =>'UdcDiplomeBundle:Diplome'                                         
                    ));
     
     
    $subscriber = new IsAdminFieldSubscriber($builder->getFormFactory());
    $builder->addEventSubscriber($subscriber);

    Et dans mon repertoire Form\EventListener le fichier IsAdminFieldSubscriber.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
     
    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;
            }
     
            $ufr = $data['ufr'];
     
            $form->add($this->factory->createNamed(
    				 'diplome', 
    				 'entity',  
    				 null, 
    				 array('query_builder'=> function(EntityRepository $repository)use($ufr){
                                                 return $repository->createQueryBuilder('diplome')  
                                                                   ->where('diplome.ufr=:ufr')
                                                                   ->setParameter('ufr', $ufr);
                                              },
                            'class' =>'UdcDiplomeBundle:Diplome'                                         
                            )
    		));
        }		  
    }
    Sans les événements de formulaire lorsque je changeais d'ufr et que je choisissais un diplôme sà la création d'un étudiant j'avais au moment de la validation un problème de donnée valide. Je ne pouvais valider mon formulaire que si je gardais l'ufr initial. J'espère que ceci servira à d'autres et encore un grand merci à tous ceux qui m'ont aidé !!!
    A+

  2. #2
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    merci pour l'info et de partager , bon travail

  3. #3
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 206
    Points : 74
    Points
    74
    Par défaut
    Si vous avez besoin de précisions faitesmoi un MP

  4. #4
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 47
    Points : 52
    Points
    52
    Par défaut
    Bonjour,

    dans ton exemple est-ce qu'un diplôme peut se retrouver dans plusieurs ufr ?

    si telle n'est pas le cas

    pourquoi avoir dans ton entity étudiant une liaison avec les 2 entité diplôme et ufr ?

    sachant qu'avec le diplôme on a l'ufr ? une liaison avec diplôme aurait suffit ?

    parce que en comparaison avec Pays/Ville, une ville n'apartien qu'a un seul pays...

    D'avance merci pour les précisions

    En passant pourrais-tu passer voir mon post avec lequel je n'ai toujours pas de réponse et je bloque grave la

    http://www.developpez.net/forums/d13...es-abstraites/

    D'avance merci

  5. #5
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 206
    Points : 74
    Points
    74
    Par défaut
    Salut,
    ça fait déjà un moment que j'ai travaillé sur ça Dans mon cas un ufr possède plusieurs diplomes mais un diplome n'appartient qu'a un ufr C'est l'entité Diplome qui est propriétaire de la relation Dans mon entité Etudiant je veux tout simplement (à partir du moment où les diplomes sont créés donc reliés à leurs ufrs respectifs) mettre un étudiant avec un ufr donc avec un des diplomes délivré par l'ufr Ala création d'un étudiant je ne voyais pas comment faire autrement que de le mettre en relation avec ufr et diplomes J'ai commencé symfony avec ce bundle Ce qui m'a posé le plus de pb c'est cette histoire de listes liées J'y ai passé un bon bout de temps avant de comprendre grace à l'aide des gens sur le forum et de blogs trouvés sur le net

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] liste de choix accedant à une autre liste de choix
    Par deamonRav dans le forum Conception
    Réponses: 0
    Dernier message: 21/06/2010, 16h45
  2. Réponses: 3
    Dernier message: 09/06/2010, 10h37
  3. Liste de choix liée à une autre table
    Par scrouet dans le forum IHM
    Réponses: 5
    Dernier message: 06/01/2010, 13h00
  4. Réponses: 2
    Dernier message: 08/07/2009, 10h27
  5. Réponses: 3
    Dernier message: 13/08/2008, 14h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo