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

Zend_Form PHP Discussion :

Liste liées


Sujet :

Zend_Form PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 284
    Points : 62
    Points
    62
    Par défaut Liste liées
    Bonjour à tous,

    je souhaiterais charger un Zend_Form_Element_Select selon un autre Zend_Form_Element_Select, existe-t-ils une fonction zend_form pour ceci ?
    mon zend_form select:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $modele = new Zend_Form_Element_Select('idModele');
            $modele->setLabel('listes des modeles ')
                    ->setAttrib('id','select#marque')
                   ->addMultiOptions($modeleTab);
              // les resultats du deuxième zend form doit dependre du premier      
        $finition = new Zend_Form_Element_Select('idFinition');
            $finition->setLabel('listes des finition')
                     ->addMultiOptions($finitionTab);
    merci d'avance

  2. #2
    Membre éclairé Avatar de manuscle
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2004
    Messages : 488
    Points : 663
    Points
    663
    Par défaut
    Salut,

    Tu peux le faire en javascript (Voit du coté de Dojo et Json).
    Les idiots sont ceux qui ne posent jamais de question!

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 118
    Points : 184
    Points
    184
    Par défaut
    Bonjour,

    Personnellement, pour ce cas je passe par une requête AJAX (JQuery) coté client à chaque sélection de la première liste qui me renvoie une réponse Json depuis l'action du controller, avec la réponse je recrée la seconde liste.
    Si cela t'intéresse, je peux te fournir le code et les explications qui vont avec.
    Apprendre c'est se faciliter la vie !
    http://e-tuto.fr

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 284
    Points : 62
    Points
    62
    Par défaut
    Merci beaucoup de la réponse. Oui je veux bien voir le code avec les commentaire s'il te plait.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 118
    Points : 184
    Points
    184
    Par défaut
    Bonjour pour être bien clair, je vais définir le contexte.
    Les données (des listes déroulantes) sont issues de la DB, nous avons 3 tables :
    - 'continent' (id_continent, non_continent)
    - 'pays' (id_pays, nom_pays, continent_id (FK) )
    - 'ville' (id_ville, nom_ville, pays_id (FK) )

    Ses 3 listes déroulantes vont se renseigner avec cohérence d'elle même à chaque sélection de l'une d'elle.

    Voici les étapes :
    - Accès au table (Zend_Db_Table_Abstract)
    - Création d'un formulaire (Zend_Form)
    - Conception d'un Zend_Controller spécifique à AJAX
    - Le code Javascript coté client

    Mon modèle de la table 'continent' >> TContinents.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
    class TContinents extends Zend_Db_Table_Abstract  {
     
           /**
    	 * Nom de la table
    	 */
    	protected $_name = 'continent';
     
    	/**
    	 * Nom de la clé primaire
    	 */
    	protected $_primary = 'id_continent';
     
     
    	/**
    	 * 
    	 */
    	public function selectData () {
     
    		$select = $this->select();
    		return $this->fetchAll($select);
     
    	}//Eof:: selectData
     
    }//Eof:: class
    Mon modèle de la table 'pays' >> TPays.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
    class TPays extends Zend_Db_Table_Abstract  {
     
           /**
    	 * Nom de la table
    	 */
    	protected $_name = 'pays';
     
    	/**
    	 * Nom de la clé primaire
    	 */
    	protected $_primary = 'id_pays';
     
     
    	/**
    	 * 
    	 */
    	public function selectData () {
     
    		$select = $this->select();
    		return $this->fetchAll($select);
     
    	}//Eof:: selectData
     
    }//Eof:: class
    Mon modèle de la table 'ville' >> TVilles.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
    class TVilles extends Zend_Db_Table_Abstract  {
     
           /**
    	 * Nom de la table
    	 */
    	protected $_name = 'ville';
     
    	/**
    	 * Nom de la clé primaire
    	 */
    	protected $_primary = 'id_ville';
     
    	/**
    	 * 
    	 */
    	public function selectData () {
     
    		$select = $this->select();
    		return $this->fetchAll($select);
     
    	}//Eof:: selectData
     
    	/**
    	 *
    	 */
    	public function selectRecherche ($critere) {
     
    		$sql = "SELECT   `C`.id_continent
    					   , `C`.non_contienent
    					   , `P`.id_pays
    					   , `P`.nom_pays
    					   , `V`.id_ville
    					   , `V`.nom_ville
    				FROM ville AS `V`
    				LEFT JOIN pays AS `P`ON `V`.pays_id = `P`.id_pays
    				LEFT JOIN continent AS `C`ON `P`.continent_id = `C`.id_continent
    				WHERE 1
    				";
     
    		// Continent
    		if (!$critere['id_continent'] == "") {
    			$sql .= " AND `C`.id_continent = ".$critere['id_continent'];
    		}
     
    		// Pays
    		if (!$critere['id_pays'] == "") {
    			$sql .= " AND `P`.id_pays = ".$critere['id_pays'];
    		}
     
    		// Ville
    		if (!$critere['id_ville'] == "") {
    			$sql .= " AND `C`.id_ville = ".$critere['id_ville'];
    		}
     
     
    		return $this->getAdapter('db')->fetchAll($sql);        
     
    	}//Eof:: selectRecherche
     
    }//Eof:: class
    Pour le modèle de table 'ville', la fonction selectRecherche ($critere) permet d'extraire un résultat selon les choix effectués d'un continent, d'un pays ou d'une ville.

    Maintenant la création du formulaire sur le modèle Zend_Form
    >> FRecherche.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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    class FRecherche extends Zend_Form {
     
    	public function __construct($options = null) {
     
            parent::__construct($options);
     
                  /* Le Formulaire */
                  $this->addAttribs( array( 'id' => 'recherche')); 
     
                   /* Bouton Reset */
                  $reset = new Zend_Form_Element_Button('reset');
                  $reset ->setLabel('reset');        
     
     
    		// Liste des continents
    		$id_continent = new Zend_Form_Element_Select('id_contient');
    		$id_continent->setLabel ('Continent')
    					->addMultiOptions($this->listContinent())	
    					;
     
    		// Liste des pays
    		$id_pays = new Zend_Form_Element_Select('id_pays');
    		$id_pays->setLabel ('Pays')
    				->addMultiOptions($this->listPays())	
    				;
     
    		// Liste des villes
    		$id_ville = new Zend_Form_Element_Select('id_ville');
    		$id_ville->setLabel ('Ville')
    				->addMultiOptions($this->listVille())	
    				;
     
     
         	       /* Element bouton de validation */
    		$submit = new Zend_Form_Element_Submit('submit');
                    $submit ->setAttrib('id', 'submitbutton')
                               ->setLabel('Chercher')
                                 ;
     
     
         	$this->addElements(array(   $reset
         					  , $id_continent
         					  , $id_pays
         					  , $id_ville
                                   	          , $submit
                                      ));
     
        } //Eof:: __construct
     
     
     
        /**
         * Liste des continents
         */
        private function listContinent () {
     
            $TContinents = new TContinents();
            $Continents = $TContinents->selectData();
     
            $listContinent = array();
            $listContinent[""] = "-- Choisissez --"; 
            foreach ($Continents as $Continent) {
                   $listContinent[$Continent->id_continent] = $Continent->nom_continent;            
            }
     
            return $listContinent;
     
        }//Eof:: listContinent
     
     
        /**
         * Liste des Pays
         */
        private function listPays () {
     
            $TPays = new TPays();
            $Pays = $TPays->selectData();
     
            $listPays = array();
            $listPays[""] = "-- Choisissez --"; 
            foreach ($Pays as $pays) {
                   $listPays[$pays->id_pays] = $pays->nom_pays;            
            }
     
            return $listPays;
     
        }//Eof:: listPays
     
     
       /**
         * Liste des Villes
         */
        private function listVille () {
     
            $TVilles = new TVilles();
            $Villes = $TVilles->selectData();
     
            $listVille = array();
            $listVille[""] = "-- Choisissez --"; 
            foreach ($Villes as $Ville) {
                   $listVille[$Ville->id_ville] = $Ville->nom_ville;            
            }
     
            return $listVille;
     
        }//Eof:: listVille
     
    }//Eof:: Class
    Nous avons besoin d'un controller spécifique pour les requête AJAX

    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
     
    class AjaxController extends Zend_Controller_Action 
    {
     
    	/**
    	 * Initialiseur de ma classe
    	 *
    	 */
    	public function init () {
     
            //si requete ajax on désactive les layouts et la vue pour une réponse JSON
            if($this->_request->isXmlHttpRequest()){
    	       $this->_helper->layout->disableLayout();
                   $this->_helper->viewRenderer->setNoRender(true);
                   $this->_helper->viewRenderer->setNeverRender(true);
            }
    	}//Eof:: init
     
    	/**
    	 * 
    	 * @return un tableau d'élément au format JSON
    	 */
        public function remplirAction() 
        {
            	// Récupération des paramètres passés dans la requête
                $params = $this->_request->getParams();
     
                // Appel de mon modèle de table
                $TVilles = new TVilles();
                // Extraction selon les critère de recherche des différents paramètres
                $Rows = $TVilles->selectRecherche($params);
     
                 // Transforme mes données en tableau PHP 
                $list = array();
                foreach ($Rows as $row) {
                	$list ['continent'][$row->id_continent] = $row->nom_continent;
                    $list ['pays'][$row->id_pays]  = $row->nom_pays;
                    $list ['ville'][$row->id_ville] = $row->nom_ville;
                }
     
                // Je renvoie ce tableau à ma vue au format JSON
                $this->_helper->json($list
                                      , array(
                                        		'enableJsonExprFinder' => true
                                              ));
     
        }//Eof:: remplirAction
     
    }//Eof:: Class
    L'action 'remplir' va être appelé du coté client en javascript et renvoie un résultat au format JSON

    Maintenant la partie la plus délicate le code javascript, mais j'utilise JQUERY qui facile grandement la tâche

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    /**
     
    	fichier "public/js/jquery/custom/custom.js"
    	réalise des actions Javascript en s'appuyant sur le
    	Framework javascript JQUERY
     
    */
     
    //Remplir les select du formulaire en fonction de la réponse AJAX
    function remplirSelect (dataAjax) {
     
        // Envoi requête AJAX   	
        $.ajax({
             type: "POST"
           , url: "../ajax/remplir" // controller : ajax , action : remplir
           , data : dataAjax
           , dataType: "json"
           , success: function(reponse){
     
    	   // Sur Succès de la réponse AJAX
     
    	   // Duplique ma réponse	
       	   var optionData = reponse;
     
    	    // Suppression des éléments de mes listes déroulantes
    	   $("#id_continent > option").remove();
    	   $("#id_pays > option").remove();
    	   $("#id_ville> option").remove();
     
    	   // Ajoute les options pour chaque liste déroulante en fonction de la réponse
    	   // Mes Continents    
    	   i = 0;           
    	   for (key in reponse.continent) {	
    		$("#id_continent").append(  '<option label="' 
                        					  + optionData['continent'][key]
                                     			  + '"'
                                     			  + 'value="'
    							  + key
    							  + '">'
    							  + optionData['continent'][key]
    							  + '</option>');
    		i++;
    		if (i == 2) { 
    				$("#id_continent:first").prepend( '<option label="Choisissez" value="" >-- Choississez --</option>');
    				$("#id_continent option:first").attr ('selected', 'selected');
    				}
    		} //Eof:: for 'continent'
     
    	 	// Mes Pays    
    	 	i = 0;           
    		for (key in reponse.pays) {	
    			$("#id_pays").append(  '<option label="' 
                        					  + optionData['pays'][key]
                                     			  + '"'
                                     			  + 'value="'
    							  + key
    							  + '">'
    							  + optionData['pays'][key]
    							  + '</option>');
    			i++;
    			if (i == 2) { 
    					$("#id_pays:first").prepend( '<option label="Choisissez" value="" >-- Choississez --</option>');
    					$("#id_pays option:first").attr ('selected', 'selected');
    					}
    		} //Eof:: for 'pays'
     
    	 	// Mes Villes    
    	 	i = 0;           
    		for (key in reponse.ville) {	
     		  $("#id_ville").append(  '<option label="' 
                        					  + optionData['ville'][key]
                                     			  + '"'
                                     			  + 'value="'
    							  + key
    							  + '">'
    							  + optionData['ville'][key]
    							  + '</option>');
    		    i++;
    		    if (i == 2) { 
    				$("#id_ville:first").prepend( '<option abel="Choisissez" value="" >-- Choississez --</option>');
    				$("#id_ville option:first").attr ('selected', 'selected');
    					}
    		} //Eof:: for 'ville'
     
     
        	} //Eof:: success
        });  //Eof:: ajax 
     
    } //Eof:: fucntion remplirSelect
     
     
     
    //Sur fin du chargement du document
    $(document).ready( function() {
     
    	// Sur changement de l'un des 'select'
    	$("select").change(function(){
     
    		// Je recupère la valeur des sélections en cours
    	 	Vid_continent = $("select#id_continent").val();
    	 	Vid_pays = $("select#id_pays").val();
    	 	Vid_ville = $("select#id_ville").val();
     
    	 	// Données à passer à la requête AJAX
    	 	var dataAjax = {  id_continent:[Vid_continent]
    	 	                , id_pays:[Vid_pays]
    	 	                , id_ville:[Vid_ville]
     	         	    };
     
    		// Modification des 'select'
    		remplirSelect (dataAjax);
     
    	}); //Eof:: sur changement de l'un des 'select'
     
     
    	// Sur click bouton reset
    	$("#reset").click (function() {
     
    		// Aucun choix
    	 	Vid_continent = "";
    	 	Vid_pays = "";
    	 	Vid_ville = "";
     
    	 	// Données à passer à la requête AJAX
    	 	var dataAjax = {  id_continent:[Vid_continent]
    	 	                , id_pays:[Vid_pays]
    	 	                , id_ville:[Vid_ville]
     	         	    };
     
    		// Modification des 'select'
    		remplirSelect (dataAjax);
     
    	}); //Eof:: sur click btn 'reset'
     
     
    }); //Eof:: ready
    A Chaque changement de sélection sur l'une des listes déroulantes, je récupère la valeur de l'option sélection, que j'envoie à mon controller 'Ajax' action 'remplir', qui me retourne les nouvelles listes qui me permet de recréer par la modification du DOM

    il faut bien entendu appeler le modèle formulaire depuis ,par exemple, le controller 'index', action 'index' et le rendre à sa vue par défaut (echo $this->form)

    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
     
    class IndexController extends Zend_Controller_Action 
    {
    	/**
    	 * Action par défaut
    	 */
        public function indexAction() 
        {
     
        	// Appel de mon formulaire
        	$Form = new FRecherche();
     
        	// Assignation de mes éléments à ma vue
        	$this->view->form = $Form;
        }
     
    }//Eof:: class
    Après utilise Firebug et sa console pour voir les réponses AJAX, si soucis

    J'espère que cela te conviendra.
    Apprendre c'est se faciliter la vie !
    http://e-tuto.fr

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Février 2009
    Messages
    278
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 278
    Points : 284
    Points
    284
    Par défaut
    Superbe réponse

  7. #7
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    380
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 380
    Points : 66
    Points
    66
    Par défaut
    Effectivement, superbe réponse,

    Existe il un moyen de faire ceci mais avec en premier choix un textbox (qui s'auto rempli via Jquery (qui va chercher les informations dans la base) et qui par la suite rempli la list box en fonction de l'information selectionnée dans la textbox ??

    Je récapitule :
    1) l'utilisateur saisi une partie du nom d'un fournisseur
    => jquery lui propose des résultats en fonction de ce qu'il a tapé et de ce qui existe dans la base

    2) une fois le fournisseur choisi, charger la liste des articles qu'il propose dans la liste déroulante.

    merci d'avance !
    L'informatique, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 118
    Points : 184
    Points
    184
    Par défaut
    Cyrux,

    Il faut utiliser l'autocomplete dans le permier textbox
    puis AJAX pour récupérer tes informations
    et JQUERY pour alimenter le 2ème texte box

    Donc tous en javascript coupler à Zend pour les requêtes retourné au format JSON.

    SVP ouvrir une autre discussion sur le sujet.
    Apprendre c'est se faciliter la vie !
    http://e-tuto.fr

  9. #9
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 44
    Points : 22
    Points
    22
    Par défaut
    Bonjour, j'essaye ce que freeseb74 a mis comme code, seulement l'AJAX ne se fait pas il n'y a aucune sélection sur les listes.

    Il y a t'il une déclaration spéciale a faire pour le javascript ou autre?

    Merci de bien vouloir éclairer ma lanterne.

Discussions similaires

  1. Pb listes liées javascript/php
    Par boo64 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 06/06/2006, 12h35
  2. Deux listes lies et un lien
    Par arti2004 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 07/03/2006, 16h44
  3. [MySQL] 1 table et 2 listes liées
    Par Ekik dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 07/02/2006, 16h47
  4. XMLHTTPRequest et listes liées
    Par ben23 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 31/12/2005, 16h32
  5. Problème avec listes liées entre elles et bouton "précé
    Par Oluha dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/08/2005, 15h10

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