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

Ext JS / Sencha Discussion :

ExtJs - Formulaire avec 2 combobox dynamiques liées


Sujet :

Ext JS / Sencha

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2011
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 152
    Points : 119
    Points
    119
    Par défaut ExtJs - Formulaire avec 2 combobox dynamiques liées
    Bonjour,

    je travaille actuellement sur un formulaire en ExtJs qui contient deux champs de type 'combo'.

    Mon combo 1 est construit à partir de données Json et s'affiche correctement dans mon formulaire.
    Mon combo 2 est par défaut vide, et son contenu dépend de la valeur sélectionnée dans le combo 1, et est également construit à partir de données Json.

    Ci-dessous mon code:
    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
     
    // source de données Pays
    var dataPays= new Ext.data.Store({
    		proxy: new Ext.data.ScriptTagProxy({
    	        url: 'pays.php'
    	    }),
    		// Définition du lecteur (format Json)
    	    reader: new Ext.data.JsonReader({
    	        root: 'pays',
    	        totalProperty: 'nb',
    	        id: 'id_pays'
    	    }, [
    	        {name: 'id_pays', mapping: 'id_pays'},
    	        {name: 'nom_pays', mapping: 'nom_pays'}
    	    ])
    	});
    	dataPays.load();
    	// Template (format d'affichage dans la liste comboBox)
    	var tplPays = new Ext.XTemplate(
    	    '<tpl for="."><div class="search-item">',
    	        '<span><b>{nom_pays}</b>',
    	    '</div></tpl>'
    	);
     
    // mon formulaire
    var myFormPanel = new Ext.FormPanel({
    		id: 'myFormPanel',
    //		url:
    		frame: true,
    		autoWidth: true,	//largeur de la fenêtre
    		autoHeight: true,	//hauteur de la fenêtre
    		labelAlign: 'right',	//les labels s'aligneront a droite     
    		bodyCfg: {tag:'center', cls:'x-panel-body'},	//on aligne tous les champs au milieu de la fenêtre
    		bodyStyle: 'padding:5p;margin:0px; ',
    		items: [{
    				xtype: 'combo',
    				fieldLabel: 'Pays',
    				id: 'combo_pays',
    				name: 'combo_pays',
    				allowBlank: false,
    				loadingText: 'Chargement en cours', 
    				pageSize:20, 
    				minChars:0, 
    				style:'width:90%', 
    				typeAhead: false, 
    				hideTrigger:false, 
    				itemSelector: 'div.search-item', 
    				store: dataPays, 
    				tpl: tplPays, 
    				onSelect: function(record){ 
    				 this.setValue(record.data.id_pays); 
    				 this.collapse();
    				 getVilles(this.value);}
    			}, {
    				xtype: 'combo',
    				fieldLabel: 'Ville',
    				id: 'combo_ville',
    				name: 'combo_ville',
    				allowBlank: false,
    				store: []
    		}]
    	});
     
    // ma fonction qui permet de mettre à jour ma combo 2 pour la liste des villes
    function getVilles(arg) {
    	alert(arg);
    	var dataVille = new Ext.data.Store({
    		proxy: new Ext.data.ScriptTagProxy({
    	        url: 'ville.php?pays='+arg
    	    }),
    	    reader: new Ext.data.JsonReader({
    	        root: 'villes',
    	        totalProperty: 'nb',
    	        id: 'id_ville'
    	    }, [
    	        {name: 'id_ville', mapping: 'id_ville'},
    	        {name: 'nom_ville', mapping: 'nom_ville'}
    	    ])
    	});
    	dataVille.load();
    	Ext.getCmp('combo_ville').store.loadData(dataVille);
    }
    je ne comprends pas pourquoi ma combo 2 ne se met pas à jour, pourtant mes résultats s'affichent bien en Json.

    Merci d'avance pour votre aide...

  2. #2
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    je ne comprend pas pourquoi tu fait
    pourquoi ne pas afecter directement le datastore correspondant ?


    tu a une discu sur le site de sencha
    http://www.sencha.com/forum/showthre...mbobox-(remote)

    A+ JYT

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2011
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 152
    Points : 119
    Points
    119
    Par défaut
    Merci pour sa réponse ...

    J'ai apporté une modification à mon code en affectant le datastore directement à ma combo 2 et lors d'un select dans mon combo 1, je reload cette datastore en passant comme paramètre la valeur du combo 1.

    Voici mon code pour mieux comprendre:
    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
     
     
    // source de données Pays
    var dataPays= new Ext.data.Store({
    		proxy: new Ext.data.ScriptTagProxy({
    	        url: 'pays.php'
    	    }),
    		// Définition du lecteur (format Json)
    	    reader: new Ext.data.JsonReader({
    	        root: 'pays',
    	        totalProperty: 'nb',
    	        id: 'id_pays'
    	    }, [
    	        {name: 'id_pays', mapping: 'id_pays'},
    	        {name: 'nom_pays', mapping: 'nom_pays'}
    	    ])
    	});
    	dataPays.load();
    	// Template (format d'affichage dans la liste comboBox)
    	var tplPays = new Ext.XTemplate(
    	    '<tpl for="."><div class="search-item">',
    	        '<span><b>{nom_pays}</b>',
    	    '</div></tpl>'
    	);
    var dataVille= new Ext.data.Store({
    		proxy: new Ext.data.ScriptTagProxy({
    	        url: 'ville.php'
    	    }),
    		// Définition du lecteur (format Json)
    	    reader: new Ext.data.JsonReader({
    	        root: 'villes',
    	        totalProperty: 'nb',
    	        id: 'id_ville'
    	    }, [
    	        {name: 'id_ville', mapping: 'id_ville'},
    	        {name: 'nom_ville', mapping: 'nom_ville'}
    	    ]),
                autoLoad: true
    	});
    	// Template (format d'affichage dans la liste comboBox)
    	var tplVille = new Ext.XTemplate(
    	    '<tpl for="."><div class="search-item">',
    	        '<span><b>{nom_ville}</b>',
    	    '</div></tpl>'
    	);
     
    // mon formulaire
    var myFormPanel = new Ext.FormPanel({
    		id: 'myFormPanel',
    //		url:
    		frame: true,
    		autoWidth: true,	//largeur de la fenêtre
    		autoHeight: true,	//hauteur de la fenêtre
    		labelAlign: 'right',	//les labels s'aligneront a droite     
    		bodyCfg: {tag:'center', cls:'x-panel-body'},	//on aligne tous les champs au milieu de la fenêtre
    		bodyStyle: 'padding:5p;margin:0px; ',
    		items: [{
    				xtype: 'combo',
    				fieldLabel: 'Pays',
    				id: 'combo_pays',
    				name: 'combo_pays',
    				allowBlank: false,
    				loadingText: 'Chargement en cours', 
    				pageSize:20, 
    				minChars:0, 
    				style:'width:90%', 
    				typeAhead: false, 
    				hideTrigger:false, 
    				itemSelector: 'div.search-item', 
    				store: dataPays, 
    				tpl: tplPays, 
                                   triggerAction:'all', 
                                   queryMode:'local',
    				 listeners:{select:{fn:function(combo, value) {
                                          var modelCmp = Ext.getCmp('combo_ville');
                                          modelCmp.setValue('');
                                          modelCmp.setDisabled(false);
                                          modelCmp.store.removeAll();
                                          modelCmp.store.reload({
                                          params: { pays: combo.getValue() }
                                                });
                                 }}}
    			}, {
    				xtype: 'combo',
    				fieldLabel: 'Ville',
    				id: 'combo_ville',
    				name: 'combo_ville',
    				allowBlank: false,
     
    				loadingText: 'Chargement en cours', 
    				pageSize:20, 
    				minChars:0, 
    				disabled: true,
    				store: dataVille,
    				tpl: tplVille,
                                    triggerAction:'all',
                                    queryMode:'local',
                                    lastQuery:'',
                                   allowBlank: false,
                                   typeAhead: true,
    				itemSelector: 'div.search-item',
                                    autoHeight: true
    		}]
    	});
    Mais le problème persiste toujours... Il semble que les données sont bien "re-loadés" car j'ai dans la pagination de ma combo 2 le nombre de page qui évolue en fonction de la valeur sélectionnée dans ma combo1, mais rien ne s'affiche...

    D'où peux venir mon problème???

    Merci d'avance pour vos retours...

  4. #4
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    le sujet à déjà été abordé
    http://www.developpez.net/forums/d10...valeurs-combo/
    /!\ ext3:
    http://www.sk-typo3.de/ExtJS-Dynamis...xen.337.0.html
    http://java.dzone.com/articles/tutor...ascading-extjs

    il y a pas mal de doc sur le net pour expliquer comment faire


    A+JYT

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2011
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 152
    Points : 119
    Points
    119
    Par défaut
    Merci pour ces liens...

    le souci n'est pas comment dois je faire, car j'ai compris le principe ...

    Mon souci c'est que je ne vois pas ce qui n'est pas bon dans mon code. Pourquoi ma liste ne s'affiche pas dans ma combo 2 alors qu'elle est bien "re-loadé" ..

    Je vais quand même voir à partir des liens que tu m'as donné si je n'aurais pas zappé quelque chose...

    Encore merci.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2011
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 152
    Points : 119
    Points
    119
    Par défaut
    Désolé pour tous ces messages,

    je viens de me rendre compte qu'il y avait un problème côté serveur dans ma requête permettant d'obtenir la liste des valeurs pour mon combo 2..
    D'où le problème d'affichage, j'ai bien des résultats mais je n'affichais pas les bonnes colonnes...

    Encore merci à sekaijin

    Problème résolu

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

Discussions similaires

  1. Datagridview avec des combobox dynamique
    Par gnomathibus dans le forum Windows Forms
    Réponses: 8
    Dernier message: 21/07/2010, 09h19
  2. Comment filtrer un sous formulaire avec un combobox ?
    Par niamo dans le forum VBA Access
    Réponses: 2
    Dernier message: 21/05/2010, 14h35
  3. Formulaire avec double listes déroulantes liées
    Par glesker dans le forum Langage
    Réponses: 46
    Dernier message: 25/08/2008, 10h55
  4. [AJAX] Formulaire avec deux listes dynamiques liées
    Par gotcha5832 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 26/03/2007, 10h40
  5. Formulaire avec un tableau dynamique
    Par Laspi dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 21/11/2006, 15h03

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