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

Bibliothèques & Frameworks Discussion :

Inter-Liaison de plusieurs dijit.form.FilteringSelect [Dojo]


Sujet :

Bibliothèques & Frameworks

  1. #1
    Membre régulier
    Homme Profil pro
    Apprenti Informatique
    Inscrit en
    Avril 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti Informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2009
    Messages : 83
    Points : 91
    Points
    91
    Par défaut Inter-Liaison de plusieurs dijit.form.FilteringSelect
    Bonjour à tous et merci encore une fois de me lire et de m'aider.

    Aujourd'hui je bute sur un problème assez con (comme d'hab ^^).

    J'ai 4 tables MySQL d'un équipementier automobile qui sont :

    Client / Véhicule / Projet / Type_Piece.

    Elles sont organisées comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    client
     
    Colonne	Type	Null	Défaut	Commentaires	MIME
    CLIENT_ID	int(5)	Non			
    CLIENT_LIB	varchar(30)	Non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    projet
     
    Colonne	Type	Null	Défaut	Relié à	Commentaires	MIME
    PROJET_ID	int(5)	Non				
    PROJET_LIB	varchar(50)	Oui	NULL			
    PROJET_CODE	varchar(15)	Non				
    PROJET_DATE_CREATION	timestamp	Non	CURRENT_TIMESTAMP			
    PROJET_REF	varchar(40)	Oui	NULL			
    PROJET_VEHICULE	int(5)	Oui	NULL	vehicule -> VEHICULE_ID		
    PROJET_CDC	int(5)	Oui	NULL	cdc -> CDC_ID		
    PROJET_PIECE_TYPE	int(4)	Non		type_piece -> TP_ID
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    type_piece
     
    Colonne	Type	Null	Défaut	Commentaires	MIME
    TP_ID	int(4)	Non			
    TP_LIB	varchar(35)	Non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    vehicule
     
    Colonne	Type	Null	Défaut	Relié à	Commentaires	MIME
    VEHICULE_ID	int(5)	Non				
    VEHICULE_CLIENT	int(5)	Non		client -> CLIENT_ID		
    VEHICULE_LIB	varchar(20)	Non				
    VEHICULE_DESC	varchar(40)	Oui	NULL
    Bon vous me direz ça me fait une belle jambe ! En fait OUI

    Le truc c'est que j'essaie d'avoir un FilteringSelect pour chaque table mais comme ces données sont liées je voudrais que les FilteringSelect le soient aussi (logique). Un truc de ce genre j'aime bien : http://jmolline.free.fr/regions/index3.php

    Le problème avec cet exemple comme ceux qui sont dans la FAQ, en plus de ne pas utiliser Dojo et la puissance de ses stores, c'est que l'utilisateur final ne peux pas, s'il connait d'avance le code projet sur lequel il veut travailler, l'indiquer directement et que les autres FilteringSelect se remplissent automatiquement. Comme si je mettais directement Doubs dans le deuxième champs de l'exemple (parmis une liste complète mais toujours pratique grâce à l'auto-complétion Dojo) et que le premier champs devienne tout seul Franche-Comté !

    Vous me suivez ?

    Voilà alors actuellement, j'ai un formulaire créé onfly en JS qui ressemble à ça :

    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
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    var openNewTestRequest = function() {
    	var cpTestRequest = new dijit.layout.ContentPane({});
    	addTabPane(dijit.byId("tcCenter"), "New Test Request", cpTestRequest);
    	var cmptCDC = 0;
    	var cmptCR = 0;
    	var cmptDerog = 0;
    	var innerRequest = ""+
    	"<div><form id='frmNewTestRequest'>"+
    		"<table width='450px'>"+
    			"<tr>"+
    				"<td width='25%'>"+
    					"Customer"+
    				"</td>"+
    				"<td width='75%' colspan='2'>"+
    					"<div data-dojo-type='dojo.data.ItemFileWriteStore' id='customerStore' data-dojo-id='customerStore'>"+
    					"</div>"+
    					"<input data-dojo-type='dijit.form.FilteringSelect' data-dojo-props='store:customerStore,searchAttr:\"CLIENT_LIB\"' name='customer' data-dojo-id='customerInput' id='customerInput'/>"+
    				"</td>"+
    			"</tr>"+
    			"<tr>"+
    				"<td>"+
    					"Car"+
    				"</td>"+
    				"<td colspan='2'>"+
    					"<div data-dojo-type='dojo.data.ItemFileWriteStore' id='carStore' data-dojo-id='carStore'>"+
    					"</div>"+
    					"<input data-dojo-type='dijit.form.FilteringSelect' data-dojo-props='store:carStore,searchAttr:\"VEHICULE_LIB\"' name='car' data-dojo-id='carInput' id='carInput'/>"+
    				"</td>"+
    			"</tr>"+
    			"<tr>"+
    				"<td>"+
    					"Product Type"+
    				"</td>"+
    				"<td colspan='2'>"+
    					"<div data-dojo-type='dojo.data.ItemFileWriteStore' id='typeStore' data-dojo-id='typeStore'>"+
    					"</div>"+
    					"<input data-dojo-type='dijit.form.FilteringSelect' data-dojo-props='store:typeStore,searchAttr:\"TP_LIB\"' name='type' data-dojo-id='typeInput' id='typeInput'/>"+
    				"</td>"+
    			"</tr>"+
    			"<tr>"+
    				"<td>"+
    					"Project"+
    				"</td>"+
    				"<td colspan='2'>"+
    					"<div data-dojo-type='dojo.data.ItemFileWriteStore' id='projectStore' data-dojo-id='projectStore'>"+
    					"</div>"+
    					"<input data-dojo-type='dijit.form.FilteringSelect' data-dojo-props='store:projectStore,searchAttr:\"PROJET_CODE\"' name='project' data-dojo-id='projectInput' id='projectInput'/>"+
    				"</td>"+
    			"</tr>"+
    			"<tr>"+
    				"<td>"+
    					"Test Stage"+
    				"</td>"+
    				"<td colspan='2'>"+
    					"à définir !"+
    				"</td>"+
    			"</tr>"+
    			"<tr>"+
    				"<td>"+
    					"Product + revision // Sample"+
    				"</td>"+
    				"<td colspan='2'>"+
    					"à définir"+
    				"</td>"+
    			"</tr>"+
    			"<tr>"+
    				"<td>"+
    					"Wished Time-Frame"+
    				"</td>"+
    				"<td colspan='2'>"+
    					"<div data-dojo-type='dijit.Calendar' data-dojo-props='onChange:function(){dojo.byId(\"formatted\").innerHTML=dojo.date.locale.format(arguments[0], {formatLength: \"full\", selector:\"date\"})}'>"+
    					"</div>"+
    					"<p id='formatted'>"+
    					"</p>"+
    				"</td>"+
    			"</tr>"+
    			"<tr>"+
    				"<td>"+
    					"Goal"+
    				"</td>"+
    				"<td colspan='2'>"+
    					"<div data-dojo-type='dijit.Editor'"+
    			             "data-dojo-props='height:175, styleSheets:\"js/dojo/dijit/themes/claro/document.css\"'>"+
    			        "</div>"+
    				"</td>"+
    			"</tr>"+
    			"<tr>"+
    				"<td>"+
    					"Product's Destination"+
    				"</td>"+
    				"<td colspan='2'>"+
    				    "<input type='radio' name='destination' id='radioDestTestEditor' value='destEditor' "+
    				    	"data-dojo-type='dijit.form.RadioButton' data-dojo-id='radioDestTestEditor' "+
    				    	"data-dojo-props='name:\"destination\", value:\"testEditor\"' />"+
    				    "<label for='radioDestTestEditor'>"+
    				        "Test Editor"+
    				    "</label>"+
    				    "<br/>"+
    				    "<input type='radio' name='destination' id='radioDestRecycling' value='destRecycler' "+
    				    	"data-dojo-type='dijit.form.RadioButton' data-dojo-id='radioDestRecycling' "+
    				    	"data-dojo-props='name:\"destination\", value:\"destRecycler\"' />"+
    				    "<label for='radioDestRecycling'>"+
    				        "Recycling"+
    				    "</label>"+
    				"</td>"+
    			"</tr>"+
    			"<tr>"+
    				"<td>"+
    					"Specifications"+
    				"</td>"+
    				"<td colspan='2'></td>"+
    			"</tr>"+
    			"<tr>"+
    				"<td></td>"+
    				"<td>"+
    					"<input id='upSpec' data-dojo-id='upSpec' data-dojo-type='dojox.form.Uploader' "+
    					"data-dojo-props='label:\"Upload\",name:\"upSpec\", multiple:\"true\", type:\"file\", name:\"upSpec\", url:\"modules/de/retrieveSpec.php\", uploadOnSelect:true' />"+
    				"</td>"+
    				"<td>"+
    					"<button data-dojo-props='label:\"Clear\"'onClick='dijit.byId(\"upSpec\").reset();' data-dojo-type='dijit.form.Button'></button>"+
    				"</td>"+
    			"</tr>"+
    			"<tr>"+
    				"<td></td>"+
    				"<td colspan='2'>"+
    					"<div id='filesSpec' data-dojo-id='filesSpec' data-dojo-type='dojox.form.uploader.FileList' "+
    					"data-dojo-props='uploaderId:\"upSpec\"'></div><div id='cancelSpecZone'></div>"+
    				"</td>"+
    			"</tr>"+
    			"<tr>"+
    				"<td>"+
    					"Product Tracking File"+
    				"</td>"+
    				"<td colspan='2'></td>"+
    			"</tr>"+
    			"<tr>"+	
    				"<td></td>"+
    				"<td>"+
    					"<input id='upTF' data-dojo-id='upTF' data-dojo-type='dojox.form.Uploader' "+
    					"data-dojo-props='label:\"Upload\",name:\"upTF\", multiple:\"true\", type:\"file\", url:\"modules/de/retrieveTF.php\", uploadOnSelect:true' />"+
    				"</td>"+
    				"<td>"+
    					"<button data-dojo-props='label:\"Clear\"' onClick='dijit.byId(\"upTF\").reset();' data-dojo-type='dijit.form.Button'></button>"+
    				"</td>"+
    			"</tr>"+
    			"<tr>"+
    				"<td></td>"+
    				"<td colspan='2'>"+
    					"<div id='trackFiles' data-dojo-id='trackFiles' data-dojo-type='dojox.form.uploader.FileList' "+
    					"data-dojo-props='uploaderId:\"upTF\"'></div><div id='cancelTFZone'></div>"+		
    				"</td>"+
    			"</tr>"+
    		"</table>"+
    	"</form></div>";
    	cpTestRequest.set('content',innerRequest);
    	dojo.connect(dijit.byId('upSpec'),'onBegin',null, function() {
    		dojo.byId('cancelSpecZone').innerHTML=""+
    		"<button data-dojo-type='dijit.form.Button' "+
    		"data-dojo-props='label:\"Stop\"' "+
    		"data-dojo-id='btnStopUpSpec'>"+
    		"<script type='dojo/event' data-dojo-event='onClick'>"+
    		"alert('stop à mettre en place');"+
    		"</script>"+
    		"</button>";
    		dojo.parser.parse('cancelSpecZone');
    	});
    	dojo.connect(dijit.byId('upSpec'),'onBegin',null, function() {
    		dojo.byId('cancelTFZone').innerHTML=""+
    		"<button data-dojo-type='dijit.form.Button' "+
    		"data-dojo-props='label:\"Stop\"' "+
    		"data-dojo-id='btnStopUpTF'>"+
    		"<script type='dojo/event' data-dojo-event='onClick'>"+
    		"alert('stop à mettre en place');"+
    		"</script>"+
    		"</button>";
    		dojo.parser.parse('cancelTFZone');
    	});
     
    	/* C'est ICI que ça se corse ! On va surement se servir des ItemFileWriteStore créés plus haut mais je ne vois pas comment !*/
    	dojo.xhrPost({
    		url:"modules/vehicule/getAll.php",
    		load: function(response) {
    			// ??
    		},
    		error: function(error) {
    			alert(error);
    		}
    	});
    };
    et une requête éxécutée en PHP grâce à pdo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT CLIENT_LIB, VEHICULE_LIB, TP_LIB, PROJET_CODE
    FROM PROJET
    INNER JOIN VEHICULE ON PROJET_VEHICULE = VEHICULE_ID
    INNER JOIN CLIENT ON VEHICULE_CLIENT = CLIENT_ID
    INNER JOIN TYPE_PIECE ON PROJET_PIECE_TYPE = TP_ID
    Voilà les amis, peut être que vous avez déjà fait ça et que c'est tout con mais en regardant la FAQ je ne trouve pas mon bonheur :
    http://javascript.developpez.com/faq...js#listesLiees
    http://javascript.developpez.com/faq...js#SelectListe

    Deux exemples qui vont dans le sens d'un exemple qui est à sens unique alors que moi je veux que ce soit dans n'importe quel sens (dégressif dans le cas d'une précision, ou trouver les données source lorsque le code de projet précis est trouvé !)

    Merci d'avance pour vos conseils,

    Si ce message n'était pas assez typé Dojo pour entrer dans cette section, merci de me dire où le poster !

  2. #2
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2010
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2010
    Messages : 322
    Points : 535
    Points
    535
    Par défaut
    L'idée serait de charger chaque table dans un filteringSelect différent.Mais ca vous le savez déjà
    Ensuite, c'est de faire un event à la sélection et de faire un setquery sur la clé du précédent sur le filteringSelect qui vous intéresse et ainsi de suite.

    Par exemple :
    je sélectionne le client dans mon filtering. A la sélection je lance ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    filteringVoiture.setQuery({clientId:'*'+valeurSelectionneeFilteringClient+'*'});
    Cela fera un filtre sur mon filteringVoiture avec uniquement les voitures du client sélectionné. Et ainsi de suite.
    Procédé pouvant être réalisé dans l'autre sens bien évidemment

  3. #3
    Membre régulier
    Homme Profil pro
    Apprenti Informatique
    Inscrit en
    Avril 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti Informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2009
    Messages : 83
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par Daniel_Gibot Voir le message
    L'idée serait de charger chaque table dans un filteringSelect différent.Mais ca vous le savez déjà
    Ensuite, c'est de faire un event à la sélection et de faire un setquery sur la clé du précédent sur le filteringSelect qui vous intéresse et ainsi de suite.

    Par exemple :
    je sélectionne le client dans mon filtering. A la sélection je lance ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    filteringVoiture.setQuery({clientId:'*'+valeurSelectionneeFilteringClient+'*'});
    Cela fera un filtre sur mon filteringVoiture avec uniquement les voitures du client sélectionné. Et ainsi de suite.
    Procédé pouvant être réalisé dans l'autre sens bien évidemment
    J'essaie ça de suite ! Décidément quand on est à fond dedans on voit pas forcément l'architecture la plus adaptée du premier coup ^^ vous n'imaginez pas ce que j'ai pu tenter comme âneries :p

    Merci d'avoir tout lu, de votre rapidité et de la qualité de la réponse

    EDIT : pendant que mon code est en ligne, regardez à la fin j'ai deux évènement liés au démarrage d'un upload automatique sur dojox.form.Uploader => je veux pouvoir annuler les téléchargements en cours ! Si c'est possible bien sûr, Gmail Styyyyyyyyyyle

  4. #4
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2010
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2010
    Messages : 322
    Points : 535
    Points
    535
    Par défaut
    Ne vous inquiétez pas, je suis passé par là aussi

    En ce qui concerne l'annulation d'un upload, si vous utilisez la version flash je pense que c'est possible. Mais je ne connais pas du tout la commande.

  5. #5
    Membre régulier
    Homme Profil pro
    Apprenti Informatique
    Inscrit en
    Avril 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti Informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2009
    Messages : 83
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par Daniel_Gibot Voir le message
    Ne vous inquiétez pas, je suis passé par là aussi

    En ce qui concerne l'annulation d'un upload, si vous utilisez la version flash je pense que c'est possible. Mais je ne connais pas du tout la commande.
    Bonjour,

    Alors je testerai plus tard l'annulation d'upload, revenons à nos moutons

    Là j'en suis à coder la partie de liaison des FilteringSelect grâce à des dojo.connect à tout va MAIS j'ai un petit doute.

    Si vous regardez l'architecture de la base de données plus haut, vous voyez que l'on peut connaitre les véhicules d'un client (donc par exemple PSA => 307, 206 ...).
    Jusqu'ici tout va bien. C'est après que cela se corse : comment connaître les type_pièce (par exemple pare-choc avant, pare-choc arrière, spoiler, ...) pour lesquelles existent un projet (pas encore sélectionné donc liste 'large') pour le véhicule sélectionné.

    En gros je voudrais avoir dans ma liste de type uniquement ceux correspondant aux projets existants pour le véhicule qui vient d'être sélectionné.

    Pour ce faire j'ai pensé faire un store "tampon" comme ceci :

    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
     
    dojo.connect(dijit.byId('customerInput'),'onChange',null,function(){
    		var inputCar = dijit.byId('carInput');
    		var inputType = dijit.byId('typeInput');
    		var inputProject = dijit.byId('projectInput');
    		inputCar.set('value','');
    		inputType.set('value','');
    		inputProject.set('value','');
    		inputCar.set('query',{VEHICULE_CLIENT:'*'+dijit.byId('customerInput').value+'*'});
    	});
     
    	dojo.connect(dijit.byId('carInput'),'onChange',null,function(){
    		var inputType = dijit.byId('typeInput');
    		var inputProject = dijit.byId('projectInput');
    		var tempTypeStore = new dojo.data.ItemFileWriteStore({});
    		inputType.set('value','');
    		inputProject.set('value','');
    		inputProject.set('query',{PROJET_VEHICULE:'*'+dijit.byId('carInput').value+'*'});
    		dojo.forEach(inputProject.get('store').getValues(),function(i){
    			var currentProjectTP_ID = i.getValue('PROJET_PIECE_TYPE');
    			if(!tempTypeStore.containsValue(i,'TP_ID',currentProjectTP_ID)){
    				tempTypeStore.loadItem // ICI BLOCAGE
    			}
    		});
    	});
    ... mais je ne vois pas du tout comment remplir mon store à par en créant une page php qui prends en post l'identifiant PROJET_PIECE_TYPE du type de pièce en question et l'appeler pour chaque projet (dont la liste sera triée pour ne correspondre qu'au véhicule sélectionné). Je trouve cette solution lourde et coûteuse en échanges client-serveur pour une simple mise à jour de liste

    Voyez vous une meilleure solution ?

    En vous remerciant d'avance,

    Charlie.

  6. #6
    Membre régulier
    Homme Profil pro
    Apprenti Informatique
    Inscrit en
    Avril 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti Informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2009
    Messages : 83
    Points : 91
    Points
    91
    Par défaut This is IT !!
    Bonjour ! Aujourd'hui je ne viens pas me plaindre, je viens me la péter
    Pourquoi ? Parce que j'ai trouvé la solution et que je n'en suis pas peu fier !

    Alors je sais vous attendez tous le TRUC ! assez simple en fait :

    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
    dojo.connect(dijit.byId('customerInput'),'onChange',null,function(){
    	var inputCar = dijit.byId('carInput');
    	var inputType = dijit.byId('typeInput');
    	var inputProject = dijit.byId('projectInput');
    	inputCar.set('value','');
    	inputType.set('value','');
    	inputProject.set('value','');
    	inputCar.set('query',{VEHICULE_CLIENT:dijit.byId('customerInput').value});
    });
     
    dojo.connect(dijit.byId('carInput'),'onChange',null,function(){		
    	// getting Inputs 
    	var inputType = dijit.byId('typeInput');
    	var inputProject = dijit.byId('projectInput');
     
    	// emptying Inputs
    	inputType.set('value','');
    	inputProject.set('value','');
     
    	// storage of TP_ID matching with project list
    	arrayTP_ID = new Array();
     
    	// getting Stores
    	var projectStore = inputProject.get('store');
    	var typeStore = inputType.get('store');
     
    	// querying the project input so it matches the others fields
    	inputProject.set('query',{PROJET_VEHICULE:dijit.byId('carInput').value});
     
    	// fetching it to catch TP_ID
    	projectStore.fetch({query:{PROJET_VEHICULE:dijit.byId('carInput').value} , onItem: function(item){
    		arrayTP_ID.push(projectStore.getValue(item,'PROJET_PIECE_TYPE'));
    	}});
     
    	// querying the product type field with a custom function looking for TP_ID in the arrayTP_ID
    	inputType.set('query',{TP_ID:function(typeStore,item){
    				return arrayTP_ID.indexOf(typeStore.getValue(item,'TP_ID')) >= 0;
    			}}
    	);
    });
    OUI vous avez bien vu ! Je passe une fonction en paramètre d'une query ! Vous avez dit bizarre ? En fait oui ! Celà s'explique tout simplement parce que j'ai été obligé de créer un Store custom :

    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
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    dojo.provide("custom.dojo.data.ItemFileReadStoreQueryCapable");
     
    dojo.require("dojo.data.ItemFileReadStore");
     
    dojo.declare("custom.dojo.data.ItemFileReadStoreQueryCapable", [dojo.data.ItemFileReadStore], {
    	_fetchItems: function(	/* Object */ keywordArgs,
    							/* Function */ findCallback,
    							/* Function */ errorCallback){
    		//	summary:
    		//		See dojo.data.util.simpleFetch.fetch()
    		var self = this,
    		    filter = function(requestArgs, arrayOfItems){
    			var items = [],
    			    i, key;
    			if(requestArgs.query){
    				var value,
    				    ignoreCase = requestArgs.queryOptions ? requestArgs.queryOptions.ignoreCase : false;
     
    				//See if there are any string values that can be regexp parsed first to avoid multiple regexp gens on the
    				//same value for each item examined.  Much more efficient.
    				var regexpList = {};
    				for(key in requestArgs.query){
    					value = requestArgs.query[key];
    					if(typeof value === "string"){
    						regexpList[key] = dojo.data.util.filter.patternToRegExp(value, ignoreCase);
    					}else if(value instanceof RegExp){
    						regexpList[key] = value;
    					}
    				}
    				for(i = 0; i < arrayOfItems.length; ++i){
    					var match = true;
    					var candidateItem = arrayOfItems[i];
    					if(candidateItem === null){
    						match = false;
    					}else{
    						for(key in requestArgs.query){
    							value = requestArgs.query[key];
    							// this is the beginning of the customization :
    							if(dojo.isFunction(value))
    							{
    								if(!value(self,candidateItem))
    								{
    									match = false;
    								}
    							}
    							// the end of what's added
    							else if(!self._containsValue(candidateItem, key, value, regexpList[key])){
    								match = false;
    							}
    						}
    					}
    					if(match){
    						items.push(candidateItem);
    					}
    				}
    				findCallback(items, requestArgs);
    			}else{
    				// We want a copy to pass back in case the parent wishes to sort the array.
    				// We shouldn't allow resort of the internal list, so that multiple callers
    				// can get lists and sort without affecting each other.  We also need to
    				// filter out any null values that have been left as a result of deleteItem()
    				// calls in ItemFileWriteStore.
    				for(i = 0; i < arrayOfItems.length; ++i){
    					var item = arrayOfItems[i];
    					if(item !== null){
    						items.push(item);
    					}
    				}
    				findCallback(items, requestArgs);
    			}
    		};
     
    		if(this._loadFinished){
    			filter(keywordArgs, this._getItemsArray(keywordArgs.queryOptions));
    		}else{
    			//Do a check on the JsonFileUrl and crosscheck it.
    			//If it doesn't match the cross-check, it needs to be updated
    			//This allows for either url or _jsonFileUrl to he changed to
    			//reset the store load location.  Done this way for backwards
    			//compatibility.  People use _jsonFileUrl (even though officially
    			//private.
    			if(this._jsonFileUrl !== this._ccUrl){
    				dojo.deprecated("dojo.data.ItemFileReadStore: ",
    					"To change the url, set the url property of the store," +
    					" not _jsonFileUrl.  _jsonFileUrl support will be removed in 2.0");
    				this._ccUrl = this._jsonFileUrl;
    				this.url = this._jsonFileUrl;
    			}else if(this.url !== this._ccUrl){
    				this._jsonFileUrl = this.url;
    				this._ccUrl = this.url;
    			}
     
    			//See if there was any forced reset of data.
    			if(this.data != null){
    				this._jsonData = this.data;
    				this.data = null;
    			}
     
    			if(this._jsonFileUrl){
    				//If fetches come in before the loading has finished, but while
    				//a load is in progress, we have to defer the fetching to be
    				//invoked in the callback.
    				if(this._loadInProgress){
    					this._queuedFetches.push({args: keywordArgs, filter: filter});
    				}else{
    					this._loadInProgress = true;
    					var getArgs = {
    							url: self._jsonFileUrl,
    							handleAs: "json-comment-optional",
    							preventCache: this.urlPreventCache,
    							failOk: this.failOk
    						};
    					var getHandler = dojo.xhrGet(getArgs);
    					getHandler.addCallback(function(data){
    						try{
    							self._getItemsFromLoadedData(data);
    							self._loadFinished = true;
    							self._loadInProgress = false;
     
    							filter(keywordArgs, self._getItemsArray(keywordArgs.queryOptions));
    							self._handleQueuedFetches();
    						}catch(e){
    							self._loadFinished = true;
    							self._loadInProgress = false;
    							errorCallback(e, keywordArgs);
    						}
    					});
    					getHandler.addErrback(function(error){
    						self._loadInProgress = false;
    						errorCallback(error, keywordArgs);
    					});
     
    					//Wire up the cancel to abort of the request
    					//This call cancel on the deferred if it hasn't been called
    					//yet and then will chain to the simple abort of the
    					//simpleFetch keywordArgs
    					var oldAbort = null;
    					if(keywordArgs.abort){
    						oldAbort = keywordArgs.abort;
    					}
    					keywordArgs.abort = function(){
    						var df = getHandler;
    						if(df && df.fired === -1){
    							df.cancel();
    							df = null;
    						}
    						if(oldAbort){
    							oldAbort.call(keywordArgs);
    						}
    					};
    				}
    			}else if(this._jsonData){
    				try{
    					this._loadFinished = true;
    					this._getItemsFromLoadedData(this._jsonData);
    					this._jsonData = null;
    					filter(keywordArgs, this._getItemsArray(keywordArgs.queryOptions));
    				}catch(e){
    					errorCallback(e, keywordArgs);
    				}
    			}else{
    				errorCallback(new Error("dojo.data.ItemFileReadStore: No JSON source data was provided as either URL or a nested Javascript object."), keywordArgs);
    			}
    		}
    	}
    });
    On modifie donc la fonction de fetching du store et on ajoute quelques lignes (voir entres les lignes 38 et 46) pour rendre le store function ready
    Ici pas besoin de tout copier coller, juste la fonction en question c'est suffisant, Dojo a ça de bien que c'est assez orienté objet pour gérer l'héritage dans ce genre de cas !

    Bon ok j'avoue, j'ai trouvé cette parade grâce à ce lien : http://lazyloader.blogspot.com/2010/...nd-custom.html

    Toujours est-il que ça me permet maintenant de faire exactement ce qu'il me faut et c'est beau !

    J'espère que mon retour d'expérience servira à d'autres (en cherchant un peu comment créer un widget custom dans dojo vous trouverez).

    A bientôt !

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

Discussions similaires

  1. [Dojo] [dijit.Form.FilteringSelect] Rendu curieux : tous les boutons de la dropList s'affichent
    Par Giovanny Temgoua dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 30/11/2011, 10h03
  2. [Dojo] dijit.form.FilteringSelect et maxHeight
    Par Choubaka35 dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 22/06/2011, 10h07
  3. [Dojo] supprimer un élément de dijit.form.FilteringSelect
    Par moukit233 dans le forum Bibliothèques & Frameworks
    Réponses: 10
    Dernier message: 01/06/2010, 12h44
  4. [MySQL] requete avec liaisons avec plusieurs tables
    Par pod1978 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 10/03/2006, 22h21
  5. liaison entre plusieurs base de donnee
    Par GMI dans le forum Bases de données
    Réponses: 1
    Dernier message: 15/12/2004, 18h42

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