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] Évènement de formulaire


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 206
    Par défaut [Form] Évènement de formulaire
    Bonjour,
    depuis un bon moment je cherche à faire un formulaire qui contient deux listes. Avec une liste qui affiche son contenu en fonction du choix fait dans l'autre. Ca je sais faire mais le problème survient au moment de la validation. Voici un peu de code avec ce que je faisais mais qui n'est pas bon :

    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
     
    ->add('ufr','entity',array('query_builder'=> function(EntityRepository $er) { return $er->createQueryBuilder('u')->orderBy('u.nom', 'ASC');},
    									   'class'        =>'UdcDiplomeBundle:Ufr',
    									   'property'     =>'nom',				  
    				  ))
     
    			->add('diplome','entity', array(
    						'class'        =>'UdcDiplomeBundle:Diplome',
    						'property'     =>'nomDiplome',
    						'query_builder'=> function(EntityRepository $er)  { 
    							return $er->createQueryBuilder('diplome')    
    									  ->join('diplome.ufr','ufr')
    									  ->where('ufr.id = :id')
    							          ->setParameter('id', $this->idUfr);
    						}
    				  ));
    avec ce code si je ne change pas l'ufr de départ et que je choisis le diplome que je veux je peux valider sans problème. Si je change l'ufr mes données sont invalides et je ne peux pas valider.

    On m'a conseillé d'utiliser les évènements de formulaire. Je le fais de cette façon mais je n'y arrive pas quand même :
    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
     
        ->add('ufr','entity',array('query_builder'=> function(EntityRepository $er) { return $er->createQueryBuilder('u')->orderBy('u.nom', 'ASC');},
                    'class'        =>'UdcDiplomeBundle:Ufr',
                    'property'     =>'nom',                 
              ));
     
        $factory = $builder->getFormFactory();
     
        $builder->addEventListener(
    	   FormEvents::PRE_SET_DATA,
    	   function (FormEvent $event) use ($factory) {
    		$data = $event->getData();
     
    		if(null === $data) {
    			return; 
    		}
    		else {
    			$event->getForm()->add(
    				$factory->createNamed(						
    				'diplome', 
    				'entity', 
    				null,
    				array( 
    					'query_builder'=> function(EntityRepository $repository) {
    					$qb = $repository->createQueryBuilder('diplome')    
                                         ->join('diplome.ufr','ufr')
                                         ->where('ufr.id = :id')
                                         ->setParameter('id', 4);
    					return $qb;},
    					'class'        =>'UdcDiplomeBundle:Diplome'
    				)
    			)
    			);	
    		}
    		}
    		);
    je pense que c'est à ce niveau que je dois récupérer l'id de l'ufr changer pour

    le mettre dans ->setParameter('id', 4); à la place du 4. Pouvez-vous m'aider?
    Merci

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Bonjour,

    Tu peux faire ainsi:
    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
    $factory = $builder->getFormFactory();
    $builder->addEventListener(
    		FormEvents::PRE_SET_DATA,
    		function (FormEvent $event) use ($factory) {
    			  	$data = $event->getData(); 
    			  	if(null === $data) {
    					return; 
    			  	}
    				 $ufr=$data->getUfr();
    				if(!$ufr){
    					//cas ou aucun ufr n'est rempli (en création par exemple)
    				}
    				$fieldDiplome=$factory->createNamed('diplome', 'entity', 	null,array(
    						'query_builder'=> function(EntityRepository $repository)use($ufr){
    								return $repository->createQueryBuilder('diplome')
    												 ->where('diplome.ufr=:ufr')
    												->setParameter('ufr', $ufr);
    								//on peut passer directement des objets en paramètres, sans utiliser systèmatiquement les clés primaires
    						},
    						'class'        =>'UdcDiplomeBundle:Diplome'
    				));
    				$event->getForm()->add($fieldDiplome);
    });
    si la relation ufr <-> diplomes est configuré en bi-directionnel on pourrait aussi faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $fieldDiplome=$factory->createNamed('diplome', 'entity', 	null,array(
                                                   'choices'=> $ufr->getDiplomes(),
                                                    'class'        =>'UdcDiplomeBundle:Diplome'                                         
                                            ));
    !! je ne suis pas sur que l'évenement PRE_SET_DATA soit bien adapté, puisque comme son nom l'indique il est appelé avant que l'on ne mette la valeur dans le form
    https://github.com/symfony/Form/blob...FormEvents.php
    peut-être faudrait-il plutôt utiliser l'evenement POST_BIND sur le champ ufr.

  3. #3
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 206
    Par défaut
    Arnooo999 merci beaucoup pour cette réponse car je me sens tres seul face à ce probleme qui me semble insurmentable. J'ai testé ton code mais j'ai l'impression que $ufr=$data->getUfr() est toujours à null puisque lorsque le formulaire s'affiche il n'y a aucun diplome alors que justement dans ma BDD il y a au moins un diplome pour chaque ufr. Que vois tu comme pb?

    J'ai tenu compte de ce que tu as écrit et que je n'ai pas vu de suite : je suis passé en FormEvents:OST_SET_DATA, POST_BIND mais ça ne marche pas.
    Pour le premier j'ai
    Diplomes ; This value is not valid.
    Pour le deuxieme ;
    Method "diplome" for object "Symfony\Component\Form\FormView" does not exist in UdcDiplomeBundle:Etudiant:formulaireAjouter.html.twig
    Cad que le champ diplome n'est pas créé. A+

  4. #4
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 206
    Par défaut
    Arnooo999,

    dans le code que tu me donnes tu dis :
    on peut passer directement des objets en paramètres, sans utiliser systèmatiquement les clés primaires
    est-ce que tu parles de $ufr que tu passes à : ->setParameter('ufr', $ufr) ?

    Dans ce parametre c'est l'id de l'ufr que j'attends. L'ufr qui est dans la liste de choix et qui est issu d'une requete sql Donc je devrais toujours avoir un ufr dans cette liste. Hors dans $ufr=$data->getUfr() est toujours null. Mon probleme est de récupèrer la valeur de l'ufr qui se trouve dans la liste de choix définie comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ->add('ufr','entity',array('query_builder'=> function(EntityRepository $er) { return $er->createQueryBuilder('u')->orderBy('u.nom', 'ASC');},
        'class'    =>'UdcDiplomeBundle:Ufr',
        'property' =>'nom',                 
    ));
    j'ai même déplacer $factory = $builder->getFormFactory(); au dessus de 'ufr' mais c'est le même problème. Voilà si quelqu'un a une idée. A+

  5. #5
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 206
    Par défaut
    j'ai essayé tous les FormEvent possibles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    const PRE_BIND = 'form.pre_bind';
    const POST_BIND = 'form.post_bind';
    const PRE_SET_DATA = 'form.pre_set_data';
    const POST_SET_DATA = 'form.post_set_data';
    const BIND_CLIENT_DATA = 'form.bind_client_data';
    const BIND_NORM_DATA = 'form.bind_norm_data';
    const SET_DATA = 'form.set_data';
    et j'ai toujours null dans $ufr = $data->getUfr() avec $data = $event->getData() -
    Help please !!!

Discussions similaires

  1. Réponses: 7
    Dernier message: 11/03/2013, 22h34
  2. Post d'un Form; récupérer infos formulaire de combobox
    Par cortex024 dans le forum Langage
    Réponses: 4
    Dernier message: 05/05/2006, 13h50
  3. Désactiver évènement sur formulaire
    Par zut94 dans le forum Access
    Réponses: 4
    Dernier message: 18/04/2006, 18h35
  4. Dessiner des formes dans un formulaire
    Par karimspace dans le forum Access
    Réponses: 3
    Dernier message: 30/12/2005, 14h24
  5. [PEAR][HTML_QuickForm] Mise en forme d'un formulaire
    Par Norabfr dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 30/12/2005, 13h41

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