0
|
1
|
|
2
|
|
3 /**
|
|
4 * Update the table using an Ajax call
|
|
5 * @param {object} oSettings dataTables settings object
|
|
6 * @returns {boolean} Block the table drawing or not
|
|
7 * @memberof DataTable#oApi
|
|
8 */
|
|
9 function _fnAjaxUpdate( oSettings )
|
|
10 {
|
|
11 if ( oSettings.bAjaxDataGet )
|
|
12 {
|
|
13 oSettings.iDraw++;
|
|
14 _fnProcessingDisplay( oSettings, true );
|
|
15 var iColumns = oSettings.aoColumns.length;
|
|
16 var aoData = _fnAjaxParameters( oSettings );
|
|
17 _fnServerParams( oSettings, aoData );
|
|
18
|
|
19 oSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, aoData,
|
|
20 function(json) {
|
|
21 _fnAjaxUpdateDraw( oSettings, json );
|
|
22 }, oSettings );
|
|
23 return false;
|
|
24 }
|
|
25 else
|
|
26 {
|
|
27 return true;
|
|
28 }
|
|
29 }
|
|
30
|
|
31
|
|
32 /**
|
|
33 * Build up the parameters in an object needed for a server-side processing request
|
|
34 * @param {object} oSettings dataTables settings object
|
|
35 * @returns {bool} block the table drawing or not
|
|
36 * @memberof DataTable#oApi
|
|
37 */
|
|
38 function _fnAjaxParameters( oSettings )
|
|
39 {
|
|
40 var iColumns = oSettings.aoColumns.length;
|
|
41 var aoData = [], mDataProp, aaSort, aDataSort;
|
|
42 var i, j;
|
|
43
|
|
44 aoData.push( { "name": "sEcho", "value": oSettings.iDraw } );
|
|
45 aoData.push( { "name": "iColumns", "value": iColumns } );
|
|
46 aoData.push( { "name": "sColumns", "value": _fnColumnOrdering(oSettings) } );
|
|
47 aoData.push( { "name": "iDisplayStart", "value": oSettings._iDisplayStart } );
|
|
48 aoData.push( { "name": "iDisplayLength", "value": oSettings.oFeatures.bPaginate !== false ?
|
|
49 oSettings._iDisplayLength : -1 } );
|
|
50
|
|
51 for ( i=0 ; i<iColumns ; i++ )
|
|
52 {
|
|
53 mDataProp = oSettings.aoColumns[i].mData;
|
|
54 aoData.push( { "name": "mDataProp_"+i, "value": typeof(mDataProp)==="function" ? 'function' : mDataProp } );
|
|
55 }
|
|
56
|
|
57 /* Filtering */
|
|
58 if ( oSettings.oFeatures.bFilter !== false )
|
|
59 {
|
|
60 aoData.push( { "name": "sSearch", "value": oSettings.oPreviousSearch.sSearch } );
|
|
61 aoData.push( { "name": "bRegex", "value": oSettings.oPreviousSearch.bRegex } );
|
|
62 for ( i=0 ; i<iColumns ; i++ )
|
|
63 {
|
|
64 aoData.push( { "name": "sSearch_"+i, "value": oSettings.aoPreSearchCols[i].sSearch } );
|
|
65 aoData.push( { "name": "bRegex_"+i, "value": oSettings.aoPreSearchCols[i].bRegex } );
|
|
66 aoData.push( { "name": "bSearchable_"+i, "value": oSettings.aoColumns[i].bSearchable } );
|
|
67 }
|
|
68 }
|
|
69
|
|
70 /* Sorting */
|
|
71 if ( oSettings.oFeatures.bSort !== false )
|
|
72 {
|
|
73 var iCounter = 0;
|
|
74
|
|
75 aaSort = ( oSettings.aaSortingFixed !== null ) ?
|
|
76 oSettings.aaSortingFixed.concat( oSettings.aaSorting ) :
|
|
77 oSettings.aaSorting.slice();
|
|
78
|
|
79 for ( i=0 ; i<aaSort.length ; i++ )
|
|
80 {
|
|
81 aDataSort = oSettings.aoColumns[ aaSort[i][0] ].aDataSort;
|
|
82
|
|
83 for ( j=0 ; j<aDataSort.length ; j++ )
|
|
84 {
|
|
85 aoData.push( { "name": "iSortCol_"+iCounter, "value": aDataSort[j] } );
|
|
86 aoData.push( { "name": "sSortDir_"+iCounter, "value": aaSort[i][1] } );
|
|
87 iCounter++;
|
|
88 }
|
|
89 }
|
|
90 aoData.push( { "name": "iSortingCols", "value": iCounter } );
|
|
91
|
|
92 for ( i=0 ; i<iColumns ; i++ )
|
|
93 {
|
|
94 aoData.push( { "name": "bSortable_"+i, "value": oSettings.aoColumns[i].bSortable } );
|
|
95 }
|
|
96 }
|
|
97
|
|
98 return aoData;
|
|
99 }
|
|
100
|
|
101
|
|
102 /**
|
|
103 * Add Ajax parameters from plug-ins
|
|
104 * @param {object} oSettings dataTables settings object
|
|
105 * @param array {objects} aoData name/value pairs to send to the server
|
|
106 * @memberof DataTable#oApi
|
|
107 */
|
|
108 function _fnServerParams( oSettings, aoData )
|
|
109 {
|
|
110 _fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [aoData] );
|
|
111 }
|
|
112
|
|
113
|
|
114 /**
|
|
115 * Data the data from the server (nuking the old) and redraw the table
|
|
116 * @param {object} oSettings dataTables settings object
|
|
117 * @param {object} json json data return from the server.
|
|
118 * @param {string} json.sEcho Tracking flag for DataTables to match requests
|
|
119 * @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering
|
|
120 * @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering
|
|
121 * @param {array} json.aaData The data to display on this page
|
|
122 * @param {string} [json.sColumns] Column ordering (sName, comma separated)
|
|
123 * @memberof DataTable#oApi
|
|
124 */
|
|
125 function _fnAjaxUpdateDraw ( oSettings, json )
|
|
126 {
|
|
127 if ( json.sEcho !== undefined )
|
|
128 {
|
|
129 /* Protect against old returns over-writing a new one. Possible when you get
|
|
130 * very fast interaction, and later queries are completed much faster
|
|
131 */
|
|
132 if ( json.sEcho*1 < oSettings.iDraw )
|
|
133 {
|
|
134 return;
|
|
135 }
|
|
136 else
|
|
137 {
|
|
138 oSettings.iDraw = json.sEcho * 1;
|
|
139 }
|
|
140 }
|
|
141
|
|
142 if ( !oSettings.oScroll.bInfinite ||
|
|
143 (oSettings.oScroll.bInfinite && (oSettings.bSorted || oSettings.bFiltered)) )
|
|
144 {
|
|
145 _fnClearTable( oSettings );
|
|
146 }
|
|
147 oSettings._iRecordsTotal = parseInt(json.iTotalRecords, 10);
|
|
148 oSettings._iRecordsDisplay = parseInt(json.iTotalDisplayRecords, 10);
|
|
149
|
|
150 /* Determine if reordering is required */
|
|
151 var sOrdering = _fnColumnOrdering(oSettings);
|
|
152 var bReOrder = (json.sColumns !== undefined && sOrdering !== "" && json.sColumns != sOrdering );
|
|
153 var aiIndex;
|
|
154 if ( bReOrder )
|
|
155 {
|
|
156 aiIndex = _fnReOrderIndex( oSettings, json.sColumns );
|
|
157 }
|
|
158
|
|
159 var aData = _fnGetObjectDataFn( oSettings.sAjaxDataProp )( json );
|
|
160 for ( var i=0, iLen=aData.length ; i<iLen ; i++ )
|
|
161 {
|
|
162 if ( bReOrder )
|
|
163 {
|
|
164 /* If we need to re-order, then create a new array with the correct order and add it */
|
|
165 var aDataSorted = [];
|
|
166 for ( var j=0, jLen=oSettings.aoColumns.length ; j<jLen ; j++ )
|
|
167 {
|
|
168 aDataSorted.push( aData[i][ aiIndex[j] ] );
|
|
169 }
|
|
170 _fnAddData( oSettings, aDataSorted );
|
|
171 }
|
|
172 else
|
|
173 {
|
|
174 /* No re-order required, sever got it "right" - just straight add */
|
|
175 _fnAddData( oSettings, aData[i] );
|
|
176 }
|
|
177 }
|
|
178 oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
|
|
179
|
|
180 oSettings.bAjaxDataGet = false;
|
|
181 _fnDraw( oSettings );
|
|
182 oSettings.bAjaxDataGet = true;
|
|
183 _fnProcessingDisplay( oSettings, false );
|
|
184 }
|
|
185
|