Project

General

Profile

Download (5.56 KB) Statistics
| Branch: | Tag: | Revision:
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

    
(1-1/16)