1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2 "http://www.w3.org/TR/html4/strict.dtd">
5 <style type="text/css">
6 @import "../../../dojo/resources/dojo.css";
7 @import "../../../dijit/themes/tundra/tundra.css";
8 @import "../../../dijit/themes/tundra/tundra_rtl.css";
11 <title>Query read store</title>
13 <script type="text/javascript" src="../../../dojo/dojo.js" djConfig="isDebug: true, parseOnLoad: true"></script>
14 <script type="text/javascript" src="../../../dojo/data/util/simpleFetch.js"></script>
15 <script type="text/javascript" src="../../../dojox/data/QueryReadStore.js"></script>
16 <script type="text/javascript">
17 dojo.require("dijit.form.ComboBox");
18 dojo.require("dijit.form.FilteringSelect");
19 dojo.require("dojox.data.QueryReadStore");
21 dojo.provide("ComboBoxReadStore");
22 dojo.declare("ComboBoxReadStore", dojox.data.QueryReadStore, {
23 fetch:function(request) {
24 // Copy the GET/POST parameters (request.query) we need into
25 // request.serverQuery. We actually want to have
26 // the query added to the URL like so: /url.php?q=<searchString>
27 // The data in "queryOptions" are useless for our backend,
28 // we ignore them, they are not sent to the server.
29 // The combobox puts this into the request-parameter:
31 // query: {name:<searchString>},
32 // queryOptions: {ignoreCase:true, deep:true},
35 // We generate request.serverQuery to be this, since those values will
36 // be sent to the server.
40 // This results in a xhr request to the following URL (in case of GET):
41 // /url.php?q=<searchString>
44 request.serverQuery = {q:request.query.name};
45 // If we wanted to send the queryOptions too, we could simply do:
46 // request.serverQuery = {
47 // q:request.query.name,
48 // ignoreCase:request.queryOptions.ignoreCase,
49 // deep:request.queryOptions.deep
51 // This would then result in this URL, for ignoreCase and deep
52 // assumed to be true:
53 // /url.php?q=<searchString>&ignoreCase=true&deep=true
54 return this.inherited("fetch", arguments);
58 dojo.provide("ServerPagingReadStore");
59 dojo.declare("ServerPagingReadStore", dojox.data.QueryReadStore, {
60 fetch:function(request) {
61 request.serverQuery = {q:request.query.name, start:request.start, count:request.count};
62 return this.inherited("fetch", arguments);
66 var testStore = new dojox.data.QueryReadStore({url:'stores/QueryReadStore.php'});;
68 var queryOptions = {};
69 if (dojo.byId("ignoreCaseEnabled").checked) {
70 queryOptions.ignoreCase = dojo.query("#fetchForm")[0].ignoreCase[0].checked;
72 if (dojo.byId("deepEnabled").checked) {
73 queryOptions.deep = dojo.query("#fetchForm")[0].deep[0].checked;
77 query.q = dojo.byId("searchText").value;
78 var request = {query:query, queryOptions:queryOptions};
79 request.start = parseInt(dojo.query("#fetchForm")[0].pagingStart.value);
80 request.count = parseInt(dojo.query("#fetchForm")[0].pagingCount.value);
82 var requestMethod = "get";
83 var radioButtons = dojo.query("#fetchForm")[0].requestMethod;
84 for (var i=0; i<radioButtons.length; i++){
85 if (radioButtons[i].checked) {
86 requestMethod = radioButtons[i].value;
90 testStore.requestMethod = requestMethod;
91 testStore.doClientPaging = dojo.query("#fetchForm")[0].doClientPaging.checked;
93 if (!testStore.doClientPaging) {
94 // We have to fill the serverQuery, since we also want to send the
95 // paging data "start" and "count" along with what is in query.
96 request.serverQuery = {q:request.query.q, start:request.start, count:request.count};
99 request.onComplete = function (items) {
100 var s = "number of items: "+items.length+"<br /><br />";
101 for (var i=0; i<items.length; i++) {
102 s += i+": name: '"+testStore.getValue(items[i], "name")+"'<br />";
104 //s += "<pre>"+dojo.toJson(items)+"</pre>";
105 dojo.byId("fetchOutput").innerHTML = s;
108 console.log(dojo.toJson(request));
109 testStore.fetch(request);
113 <body class="tundra" style="margin:20px;">
114 <div dojoType="ComboBoxReadStore" jsId="store" url="stores/QueryReadStore.php" requestMethod="get"></div>
115 This is a ComboBox: <input id="cb" dojoType="dijit.form.ComboBox" store="store" pageSize="5" />
118 This is a FilteringSelect: <input id="fs" dojoType="dijit.form.FilteringSelect" store="store" pageSize="5" />
120 <form id="filteringSelectForm">
121 <input id="selectById" value="0" size="3" />
122 <input type="button" value="set by id" onclick="dijit.byId('fs').setValue(dojo.byId('selectById').value)" />
127 This ComboBox uses a customized QueryReadStore, it prepares the query-string for the URL that
128 way that the paging parameters "start" and "count" are also send.<br />
129 <div dojoType="ServerPagingReadStore" jsId="serverPagingStore" url="stores/QueryReadStore.php" requestMethod="get"></div>
130 <input dojoType="dijit.form.ComboBox" store="serverPagingStore" pageSize="5" />
132 <a href="javascript://" onclick="var d = dojo.byId('pagingCode'); d.style.display= d.style.display=='none'?'block':'none';">Click here to see the code!</a>
133 <div id="pagingCode" style="display:none;">
134 The HTML might look like this.
136 <div dojoType="ServerPagingReadStore" jsId="serverPagingStore" url="stores/QueryReadStore.php" requestMethod="get"></div>
137 <input dojoType="dijit.form.ComboBox" store="serverPagingStore" pageSize="10" />
140 dojo.require("dojox.data.QueryReadStore");
141 dojo.provide("ServerPagingReadStore");
142 dojo.declare("ServerPagingReadStore", dojox.data.QueryReadStore, {
143 fetch:function(request) {
144 request.serverQuery = {q:request.query.name, start:request.start, count:request.count};
145 return this.inherited("fetch", arguments);
156 border:1px solid black;
164 <form id="fetchForm">
165 <fieldset title="requestMethod">
166 <legend>requestMethod</legend>
167 get <input type="radio" value="get" checked="checked" name="requestMethod" />
168 post <input type="radio" value="post" name="requestMethod" />
171 <fieldset title="queryOptions">
172 <legend>queryOptions</legend>
174 <fieldset id="ignoreCaseFieldset">
175 <legend><input type="checkbox" id="ignoreCaseEnabled" /> ignoreCase</legend>
176 <div class="disabled">
177 true <input type="radio" value="0" checked="checked" name="ignoreCase" />
178 false <input type="radio" value="1" name="ignoreCase" />
181 <fieldset id="deepFieldset">
182 <legend><input type="checkbox" id="deepEnabled" /> deep</legend>
183 <div class="disabled">
184 true <input type="radio" value="0" name="deep" />
185 false <input type="radio" value="1" name="deep" checked="checked" />
189 <fieldset title="paging">
190 <legend>paging</legend>
191 start: <input id="pagingStart" value="0" size="3" />
192 count: <input id="pagingCount" value="10" size="3" />
194 do client paging: <input id="doClientPaging" type="checkbox" checked="checked" />
197 var fieldsets = ["ignoreCaseFieldset", "deepFieldset"];
198 for (var i=0; i<fieldsets.length; i++) {
199 dojo.connect(dojo.byId(fieldsets[i]), "onchange", toggleFieldset);
201 function toggleFieldset(el) {
202 var divs = dojo.query("div", el.target.parentNode.parentNode);
205 if (el.target.checked) {
206 dojo.removeClass(div, "disabled");
208 dojo.addClass(div, "disabled");
215 <input id="searchText" type="text" value="a">
216 <input id="searchButton" type="button" value="store.fetch()" onclick="doSearch()" />
218 <div id="fetchOutput" style="background-color:#FFDDDD; margin-top:1em; float:left;"></div>