Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript > Bibliothèques & Frameworks > Dojo
Dojo Forum d'entraide sur le framework Dojo
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/08/2011, 15h08   #1
Membre du Club
 
Inscription : avril 2009
Messages : 72
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 72
Points : 56
Points : 56
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 :
1
2
3
4
5
client
 
Colonne	Type	Null	Défaut	Commentaires	MIME
CLIENT_ID	int(5)	Non			
CLIENT_LIB	varchar(30)	Non
Code :
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 :
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 :
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 :
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 :
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 !
cfried est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2011, 16h20   #2
Membre éprouvé
 
Gibot Daniel
Inscription : janvier 2010
Messages : 313
Détails du profil
Informations personnelles :
Nom : Gibot Daniel
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : janvier 2010
Messages : 313
Points : 439
Points : 439
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 :
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
Daniel_Gibot est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/08/2011, 16h25   #3
Membre du Club
 
Inscription : avril 2009
Messages : 72
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 72
Points : 56
Points : 56
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 :
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
cfried est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2011, 16h40   #4
Membre éprouvé
 
Gibot Daniel
Inscription : janvier 2010
Messages : 313
Détails du profil
Informations personnelles :
Nom : Gibot Daniel
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : janvier 2010
Messages : 313
Points : 439
Points : 439
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.
Daniel_Gibot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 09h17   #5
Membre du Club
 
Inscription : avril 2009
Messages : 72
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 72
Points : 56
Points : 56
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 :
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.
cfried est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 11h31   #6
Membre du Club
 
Inscription : avril 2009
Messages : 72
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 72
Points : 56
Points : 56
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 :
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 :
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 !
cfried est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h56.


 
 
 
 
Partenaires

Hébergement Web