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] Formulaire compliqué


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] Formulaire compliqué
    Bonjour,
    j'aurais besoin d'un conseil pour faire une chose que je trouve compliquée.
    J'aimerais à partir d'un ufr choisi afficher les diplomes dans diplome qui sont liés à cet ufr.

    Tout d'abord j'explique ce que j'arrive à faire :
    dans mon fichierType :

    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
     
    ->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',
    						'empty_value' => '***',
    						'query_builder'=> function(EntityRepository $er)  { 
    							return $er->createQueryBuilder('diplome')    
    									  ->join('diplome.ufr','ufr')
    									  ->where('ufr.id = :id')
    							          ->setParameter('id', 3);
    						}
    				  ));
    Ici j'ai fixé les diplomes liés à l'ufr dont l'id = 3.

    Ce que j'aimerais c'est paramétrer l'id en fonction d'une variable id_ufr de l'ufr choisi. J'ai essayé beaucoup de solutions mais je n'y arrive pas.

    Merci

  2. #2
    Membre habitué Avatar de anta_res
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 93
    Points : 173
    Points
    173
    Par défaut
    Il va falloir que tu passe par de l'ajax pour recharger juste le champ qui t’intéresse lors du changement de la valeur de ton champ "ufr"

  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
    merci pour ta réponse mais je voudrais deja qu'au premier affichage là où j'ai :

    ->setParameter('id', 3); je puisse paramétrer le 3. Puis apres chaque changement d'ufr utiliser ajax. Tu peux m'aider sur ce point? Merci

  4. #4
    Membre habitué Avatar de anta_res
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 93
    Points : 173
    Points
    173
    Par défaut
    Bin pour ça il te suffit d'instancier ton formulaire sur un objet dont le champ diplôme est à 3.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $objet = new Objet();
    $objet->setDiplome(3);
    et tu passe $objet a ton formType

  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
    je comprends que je puisse initialiser ma liste avec une certaine valeur puisque je l'ai fait et je te remercie :

    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
     
    private $idUfr;
     
    ...
     
    public function __construct() {
    	 ...
    	...
                ...
    		$this->idUfr = 1;
    	}
     
     
    ->add('diplome','entity', array(
    						'class'        =>'UdcDiplomeBundle:Diplome',
    						'property'     =>'nomDiplome',
    						'empty_value' => '***',
    						'query_builder'=> function(EntityRepository $er)  { 
    							return $er->createQueryBuilder('diplome')    
    									  ->join('diplome.ufr','ufr')
    									  ->where('ufr.id = :id')
    							          ->setParameter('id', $this->idUfr);
    						}
    				  ));
    mais ce que je ne comprends pas c'est qu'une fois l'initialisation du formulaire faite et une fois que je selectionne mon ufr comment je fais dans mon controlleur juste apres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if($request->isXmlHttpRequest()) {
    je sais que là je dois retourner quelque chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $response = new Response(json_encode(
    qu'ajax devra traiter.

    Admettons que je passe le numéro d'ufr. Mais peux tu m'expliquer comment j'affecte ma nouvelle valeur dans ->setParameter('id', $this->idUfr) et surtout comment je réaffiche diplome.
    N'y a t'il pas un moyen pour faire ça dans le fichierType?

    Merci encore !!!

  6. #6
    Membre habitué Avatar de anta_res
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 93
    Points : 173
    Points
    173
    Par défaut
    Non je ne crois pas que cela puisse ce faire dans le fichier FormType car celui ci fonctionne uniquement en mode synchrone.

    La seule chose que tu puisse faire c'est modifier l'affichage de ton formulaire en fonction de certains paramètres lors de son chargement en utilisant des Form Events http://symfony.com/doc/current/cookb...ification.html

    Mais si tu veut le faire au changement d'un de tes champs tu es obligé de passer par de l'ajax. Il faut que ta méthode Ajax retourne le code correspondant à ton champ "diplôme" mis à jour avec la nouvelle valeur.

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2009
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2009
    Messages : 126
    Points : 183
    Points
    183
    Par défaut
    Salut !

    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
     
    private $idUfr;
     
    public function __construct() {
    		$this->idUfr = 1;
    	}
     
    ->add('diplome','entity', array(
    						'class'        =>'UdcDiplomeBundle:Diplome',
    						'property'     =>'nomDiplome',
    						'empty_value' => '***',
    						'query_builder'=> function(EntityRepository $er)  { 
    							return $er->createQueryBuilder('diplome')    
    									  ->join('diplome.ufr','ufr')
    									  ->where('ufr.id = :id')
    							          ->setParameter('id', $this->idUfr);
    						}
    				  ));

    Ca fonctionne ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ->setParameter('id', $this->idUfr);
    Perso je passerai les idUfr dans le constructeur de fichierType

    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
     
     
    class fichierType{
     
    private $idUfr;
     
    public function __construct($idUfr = null) {
    	 if($idUfr !== null) $this->idUfr = $idUfr;
    	}
    }
     
        public function buildForm(FormBuilder $builder, array $options)
        {
    $idUFr = $this->$idUfr;
            $builder->add('diplome','entity', array(
    						'class'        =>'UdcDiplomeBundle:Diplome',
    						'property'     =>'nomDiplome',
    						'empty_value' => '***',
    						'query_builder'=> function(EntityRepository $er) use ($idUfr)   { 
    							return $er->createQueryBuilder('diplome')    
    									  ->join('diplome.ufr','ufr')
    									  ->where('ufr.id = :$idUser')
    							          ->setParameter('id', $idUFr);
    						}
    				  ));
    Citation Envoyé par cescu Voir le message
    Admettons que je passe le numéro d'ufr. Mais peux tu m'expliquer comment j'affecte ma nouvelle valeur dans ->setParameter('id', $this->idUfr) et surtout comment je réaffiche diplome.
    et dans le controlleur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Controlleur {
     
    public function monactionAction(){
    ...
     
     if($request->isXmlHttpRequest()) {
        $return = new fichierType($idUfr)
        $response = new Response(json_encode($return))
     }
    }
    Dans la vue tu recharge le conteneur du formulaire avec la reponse json

  8. #8
    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
    Je viens de tester ce que tu m'as dit mais j'ai quelques problèmes de compréhension:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if($request->isXmlHttpRequest()) {	
       $idUFR = $request->request->get('idUFR');				
       $return = new EtudiantType($idUFR);
       $response = new Response(json_encode($return));
      return $response;
    }
    dans mon formulaire :
    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
     
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"></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},   
                    dataType: 'json',                  
                    url:  '{{ path('UdcDiplomeBundle_etudiant_ajouter') }}',       
                    success: function(response) {
                      alert(response);
                   }
                });
                return false;
              });
    j'ai fait un alert parce que tu me dis :
    Dans la vue tu recharge le conteneur du formulaire avec la reponse json
    et je ne sais pas vraiment quoi traiter. Avec cet alert j'ai : [object Object]

    Merci

  9. #9
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2009
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2009
    Messages : 126
    Points : 183
    Points
    183
    Par défaut
    Re,

    j'ai ptet mal saisi ta demande...Peux-tu donner ton arbo rapide du bundle (mvc et formType), là je suis un peu perdu..
    Sur le 1er post tu annonce un fichierType et la c'est un etudiantType.

    a+

  10. #10
    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
    oui parce qu'en fait fichier c'était pour rester
    pour rester général. Mais fait c'est EtudiantType Donc aucun probleme

  11. #11
    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
    je vais t'expliquer ce que j'ai fait et qui marche en partie.

    Dans mon EtudiantController :

    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
     
    if($request->isXmlHttpRequest()) {	
       $idUFR = $request->request->get('idUFR');
       $em = $this->getDoctrine()
                       ->getEntityManager();     
       $ufrChoisi = $em->getRepository('UdcDiplomeBundle:Ufr')
                             ->find($idUFR);
       $diplomesDeLufrChoisi = $ufrChoisi->getDiplomes();
       $i = 0;
       foreach ($diplomesDeLufrChoisi as $dip) {
          $mesDiplomes[$i] = $dip->getNomDiplome();
          $i = $i + 1;
        }	
       $response = new Response(json_encode($mesDiplomes));
       $response->headers->set('Content-Type', 'application/json');
       return $response;
    avec EtudiantType :
    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
     
    ->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',
    						'empty_value' => '***',
    						'query_builder'=> function(EntityRepository $er)  { 
    							return $er->createQueryBuilder('diplome')    
    									  ->join('diplome.ufr','ufr')
    									  ->where('ufr.id = :id')
    							          ->setParameter('id', $this->idUfr);
    						}
    				  ));
    et mon formulaire :

    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
     
     <div id="monUFR"  class="fomForm select" >
            {{ form_label(form.ufr, "U.F.R.") }}
            {{ form_errors(form.ufr) }}
            {{ form_widget(form.ufr) }}
          </div>
     
          <div id="mesDiplomes">
            {{ form_label (form.diplome, "Diplomes") }}
            {{ form_errors(form.diplome) }}
            {{ form_widget(form.diplome) }}    
          </div>     
     
          {{ form_rest(form) }}  
       <p>
          <button type="submit"  class="btn btn-primary">Enregistrer</button> 
          <button type="reset"   class="btn btn-primary">Annuler</button>  
       </p>
     
       <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"></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},   
                    dataType: 'json',                  
                    url:  '{{ path('UdcDiplomeBundle_etudiant_ajouter') }}',       
                    success: function(response) {
                      $('#mesDiplomes select').find("option").remove();
                      $.each(response, function(i, item) {
                        $('#mesDiplomes select').append(new Option(item, i));
                      });
                   }
                });
                return false;
              });
    Alors quelques explications. la $response est bien reçue dans la partie ajax de mon formulaire. La liste diplome est bien alimentée des diplomes attendus en focntion de l'ufr selectionné. Mais lorsque je valide mon formulaire dans ma table etudiant j'ai quelque chose que je n'attends pas et qui fait je me trouve dans une voie sans issue.

    Dans mon entité Ufr :

    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
     
    class Etudiant
    {
        /**
         * @var integer $id
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
    ...
    ...
    ...
    /**
         * @ORM\ManyToOne(targetEntity="Udc\DiplomeBundle\Entity\Diplome")  
    	 * @ORM\JoinColumn(nullable=false)
         */
         private $diplome;
     
    	 /**
         * @ORM\ManyToOne(targetEntity="Udc\DiplomeBundle\Entity\Ufr", inversedBy="diplomes")  
    	 * @ORM\JoinColumn(nullable=false)
         */
         private $ufr;
    (je sais qu'avec Doctrine on ne doit pas parler de table mais pour bien expliquer ce qui me bloque je dois le faire) le champ diplome_id qui est géré par doctrine et qui fait le lien avec $diplome ne récupère pas l'id du diplome selectionné mais l'indice du select. Je m'explique : j'ai dans ma table diplome 10 diplomes. Apres avoir choisi un ufr les diplomes relié à cet ufr sont au nombre de 3. J'en choisi un le dernier. Et bien après validation de mon formulaire le champ diplome_id va prendre la valeur 2 et non pas l'id du diplome. PAr contre si dans ->where('ufr.id = :id') à l'initialisation du formulaire je passe l'id de l'ufr j'ai la meme liste de diplome. PAr contre a la validation j'ai le bon id de diplome dans diplome_id.
    J'en viens a penser que dans le controlleur dans $response je dois impérativement passer un objet !!!
    dans la boucle du controlleur j'ai meme fait un array

    foreach ($diplomesDeLufrChoisi as $dip) {

    $mesDiplomes[$i][1] = $dip->getNomDiplome();
    $i = $i + 1;
    }

  12. #12
    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
    je vais t'expliquer ce que j'ai fait et qui marche en partie.

    Dans mon EtudiantController :

    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
     
    if($request->isXmlHttpRequest()) {	
       $idUFR = $request->request->get('idUFR');
       $em = $this->getDoctrine()
                       ->getEntityManager();     
       $ufrChoisi = $em->getRepository('UdcDiplomeBundle:Ufr')
                             ->find($idUFR);
       $diplomesDeLufrChoisi = $ufrChoisi->getDiplomes();
       $i = 0;
       foreach ($diplomesDeLufrChoisi as $dip) {
          $mesDiplomes[$i] = $dip->getNomDiplome();
          $i = $i + 1;
        }	
       $response = new Response(json_encode($mesDiplomes));
       $response->headers->set('Content-Type', 'application/json');
       return $response;
    avec EtudiantType :
    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
     
    ->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',
    						'empty_value' => '***',
    						'query_builder'=> function(EntityRepository $er)  { 
    							return $er->createQueryBuilder('diplome')    
    									  ->join('diplome.ufr','ufr')
    									  ->where('ufr.id = :id')
    							          ->setParameter('id', $this->idUfr);
    						}
    				  ));
    et mon formulaire :

    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
     
     <div id="monUFR"  class="fomForm select" >
            {{ form_label(form.ufr, "U.F.R.") }}
            {{ form_errors(form.ufr) }}
            {{ form_widget(form.ufr) }}
          </div>
     
          <div id="mesDiplomes">
            {{ form_label (form.diplome, "Diplomes") }}
            {{ form_errors(form.diplome) }}
            {{ form_widget(form.diplome) }}    
          </div>     
     
          {{ form_rest(form) }}  
       <p>
          <button type="submit"  class="btn btn-primary">Enregistrer</button> 
          <button type="reset"   class="btn btn-primary">Annuler</button>  
       </p>
     
       <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"></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},   
                    dataType: 'json',                  
                    url:  '{{ path('UdcDiplomeBundle_etudiant_ajouter') }}',       
                    success: function(response) {
                      $('#mesDiplomes select').find("option").remove();
                      $.each(response, function(i, item) {
                        $('#mesDiplomes select').append(new Option(item, i));
                      });
                   }
                });
                return false;
              });
    Alors quelques explications. la $response est bien reçue dans la partie ajax de mon formulaire. La liste diplome est bien alimentée des diplomes attendus en focntion de l'ufr selectionné. Mais lorsque je valide mon formulaire dans ma table etudiant j'ai quelque chose que je n'attends pas et qui fait je me trouve dans une voie sans issue.

    Dans mon entité Ufr :

    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
     
    class Etudiant
    {
        /**
         * @var integer $id
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
    ...
    ...
    ...
    /**
         * @ORM\ManyToOne(targetEntity="Udc\DiplomeBundle\Entity\Diplome")  
    	 * @ORM\JoinColumn(nullable=false)
         */
         private $diplome;
     
    	 /**
         * @ORM\ManyToOne(targetEntity="Udc\DiplomeBundle\Entity\Ufr", inversedBy="diplomes")  
    	 * @ORM\JoinColumn(nullable=false)
         */
         private $ufr;
    (je sais qu'avec Doctrine on ne doit pas parler de table mais pour bien expliquer ce qui me bloque je dois le faire) le champ diplome_id qui est géré par doctrine et qui fait le lien avec $diplome ne récupère pas l'id du diplome selectionné mais l'indice du select. Je m'explique : j'ai dans ma table diplome 10 diplomes. Apres avoir choisi un ufr les diplomes relié à cet ufr sont au nombre de 3. J'en choisi un le dernier. Et bien après validation de mon formulaire le champ diplome_id va prendre la valeur 2 et non pas l'id du diplome. PAr contre si dans ->where('ufr.id = :id') à l'initialisation du formulaire je passe l'id de l'ufr j'ai la meme liste de diplome. PAr contre a la validation j'ai le bon id de diplome dans diplome_id.
    J'en viens a penser que dans le controlleur dans $response je dois impérativement passer un objet !!!
    dans la boucle du controlleur j'ai meme fait un array

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach ($diplomesDeLufrChoisi as $dip) {
       $mesDiplomes[$i][0] = $dip->getId();
      $mesDiplomes[$i][1] = $dip->getNomDiplome();
      $i = $i + 1; 
    }
    pour envoyer le bon id mais ça ne marche pas non plus.
    Voila si tu peux encore m'aider ...
    A+

  13. #13
    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
    ici j'ai essayé d'une autre façon :

    dans le controlleur :

    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
     
    $request = $this->get('request');
    		if($request->isXmlHttpRequest()) {	
    			$idUFR = $request->request->get('idUFR');
     
    			$em = $this->getDoctrine()
    			  	       ->getEntityManager();     
     
    			$ufrChoisi = $em->getRepository('UdcDiplomeBundle:Ufr')
    							->find($idUFR);
     
    			$diplomesDeLufrChoisi = $ufrChoisi->getDiplomes();			
     
    			$html = '';
    			foreach ($diplomesDeLufrChoisi as $dip) {
    				$html = $html . sprintf("<option value=\"%d\">%s</option>",$dip->getId(), $dip->getNomDiplome());
    			}			
    			return new Response($html);			
            }
    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
     
    <div id="monUFR"  class="fomForm select" >
            {{ form_label(form.ufr, "U.F.R.") }}
            {{ form_errors(form.ufr) }}
            {{ form_widget(form.ufr) }}
          </div>
     
          <div >
            {{ form_label (form.diplome, "Diplomes") }}
            {{ form_errors(form.diplome) }}
            <select id="mesDiplomes"> {{ form_widget(form.diplome) }} </select>
          </div>        
     
          {{ form_rest(form) }}  
       <p>
          <button type="submit"  class="btn btn-primary">Enregistrer</button> 
          <button type="reset"   class="btn btn-primary">Annuler</button>  
       </p>
     
       <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"></script>
       <script type="text/javascript">
     
    			$('#monUFR select').change(function() {  
                var idUFR = $('#monUFR select').val();    
                $.ajax({
                    type: 'POST',
                    data: {'idUFR' : idUFR},           
                    url:  '{{ path('UdcDiplomeBundle_etudiant_ajouter') }}',       
                    success: function(response) {
                      $('#mesDiplomes').html(response).show();
                   }
                });
                return false;
              });	
     
     
       </script>
    quand je change d'ufr j'ai bien dans diplome les diplomes attendus. Par contre à la validation j'ai le message :
    SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'diplome_id' cannot be null

    Ici je n'ai pas comme dans l'exemple précédent le remplacement de diplome_id par le selectId mais diplome_id = null alors qu'il me semblait lui avoir passé le
    id du diplome avec $html = $html . sprintf("<option value=\"%d\">%s</option>",$dip->getId(), $dip->getNomDiplome());

    A+

  14. #14
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2009
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2009
    Messages : 126
    Points : 183
    Points
    183
    Par défaut
    Merci pour les explications

    Essaye comme je t'ai dit plus haut de passer les idUfr dans le constructeur du fichierType (ou celui concerné) et les utiliser dans le query_builder comme parametre via use($idUfr)

    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
     
     
    class fichierType{
     
    private $idUfr;
     
    public function __construct($idUfr = null) {
    	 if($idUfr !== null) $this->idUfr = $idUfr;
    	}
    }
     
        public function buildForm(FormBuilder $builder, array $options)
        {
    $idUFr = $this->$idUfr;
            $builder->add('diplome','entity', array(
    						'class'        =>'UdcDiplomeBundle:Diplome',
    						'property'     =>'nomDiplome',
    						'empty_value' => '***',
    						'query_builder'=> function(EntityRepository $er) use ($idUfr)   { 
    							return $er->createQueryBuilder('diplome')    
    									  ->join('diplome.ufr','ufr')
    									  ->where('ufr.id = :$idUser')
    							          ->setParameter('id', $idUFr);
    						}
    				  ));
    }

  15. #15
    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 Matlow,

    ce que tu dis je l'ai fait et ca marche llorsque je charge mon formulaire la premiere fois parce que dans le fichierType il y a un requete qui est faite et l'objet resultat de la query est passee directement au formulaire. Par contre lorsque je choisis un ufr et je veux renvoyer le resultat de la requete a mon fichier twig je n'ai pas de moyen d'envoyer un objet et pas de moyen de l'interpreter avec jquery. A+++

Discussions similaires

  1. Mise en forme formulaire
    Par Mulai dans le forum IHM
    Réponses: 5
    Dernier message: 21/08/2007, 14h44
  2. gestion d'un formulaire compliqué
    Par khilik dans le forum Struts 1
    Réponses: 4
    Dernier message: 30/07/2007, 15h03
  3. [Mise en forme] formulaire fond d application
    Par J_Yohan dans le forum IHM
    Réponses: 12
    Dernier message: 02/05/2007, 15h45
  4. [Forms]Formulaire et son sous formulaire avec FORMS 9 i
    Par samba2005kanoute dans le forum Forms
    Réponses: 2
    Dernier message: 07/03/2007, 18h11
  5. Mise en forme formulaire
    Par sophieric dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 05/09/2006, 15h56

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