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 |
} |