22
22
*/
23
23
class DataTableAction extends Action
24
24
{
25
+ /**
26
+ * GET or POST
27
+ *
28
+ * @var string
29
+ */
30
+ public $ requestMethod = "GET " ;
31
+
25
32
/**
26
33
* @var ActiveQuery
27
34
*/
@@ -43,44 +50,68 @@ class DataTableAction extends Action
43
50
*/
44
51
public $ applyFilter ;
45
52
53
+ /**
54
+ * Format data
55
+ * Signature is following:
56
+ * function ($query, $columns)
57
+ * @var callable
58
+ */
59
+ public $ formatData ;
60
+
61
+ /**
62
+ * Format response
63
+ * Signature is following:
64
+ * function ($response)
65
+ * @var callable
66
+ */
67
+ public $ formatResponse ;
68
+
46
69
public function init ()
47
70
{
48
71
if ($ this ->query === null ) {
49
72
throw new InvalidConfigException (get_class ($ this ) . '::$query must be set. ' );
50
73
}
51
74
}
52
75
76
+ protected function getParam ($ name , $ defaultValue = null )
77
+ {
78
+ return $ this ->requestMethod == 'GET ' ?
79
+ Yii::$ app ->request ->getQueryParam ($ name , $ defaultValue ) :
80
+ Yii::$ app ->request ->getBodyParam ($ name , $ defaultValue );
81
+ }
82
+
53
83
public function run ()
54
84
{
55
85
/** @var ActiveQuery $originalQuery */
56
86
$ originalQuery = $ this ->query ;
57
87
$ filterQuery = clone $ originalQuery ;
58
- $ draw = Yii:: $ app -> request -> getQueryParam ('draw ' );
88
+ $ draw = $ this -> getParam ('draw ' );
59
89
$ filterQuery ->where = null ;
60
- $ search = Yii:: $ app -> request -> getQueryParam ('search ' , ['value ' => null , 'regex ' => false ]);
61
- $ columns = Yii:: $ app -> request -> getQueryParam ('columns ' , []);
62
- $ order = Yii:: $ app -> request -> getQueryParam ('order ' , []);
90
+ $ search = $ this -> getParam ('search ' , ['value ' => null , 'regex ' => false ]);
91
+ $ columns = $ this -> getParam ('columns ' , []);
92
+ $ order = $ this -> getParam ('order ' , []);
63
93
$ filterQuery = $ this ->applyFilter ($ filterQuery , $ columns , $ search );
64
94
$ filterQuery = $ this ->applyOrder ($ filterQuery , $ columns , $ order );
65
95
if (!empty ($ originalQuery ->where )) {
66
96
$ filterQuery ->andWhere ($ originalQuery ->where );
67
97
}
68
98
$ filterQuery
69
- ->offset (Yii:: $ app -> request -> getQueryParam ('start ' , 0 ))
70
- ->limit (Yii:: $ app -> request -> getQueryParam ('length ' , -1 ));
99
+ ->offset ($ this -> getParam ('start ' , 0 ))
100
+ ->limit ($ this -> getParam ('length ' , -1 ));
71
101
$ dataProvider = new ActiveDataProvider (['query ' => $ filterQuery , 'pagination ' => ['pageSize ' => Yii::$ app ->request ->getQueryParam ('length ' , 10 )]]);
72
102
Yii::$ app ->response ->format = Response::FORMAT_JSON ;
73
103
try {
74
104
$ response = [
75
105
'draw ' => (int )$ draw ,
76
106
'recordsTotal ' => (int )$ originalQuery ->count (),
77
107
'recordsFiltered ' => (int )$ dataProvider ->getTotalCount (),
78
- 'data ' => $ filterQuery -> all ( ),
108
+ 'data ' => $ this -> formatData ( $ filterQuery , $ columns ),
79
109
];
80
110
} catch (\Exception $ e ) {
81
111
return ['error ' => $ e ->getMessage ()];
82
112
}
83
- return $ response ;
113
+
114
+ return $ this ->formatResponse ($ response );
84
115
}
85
116
86
117
/**
@@ -129,4 +160,31 @@ public function applyOrder(ActiveQuery $query, $columns, $order)
129
160
}
130
161
return $ query ;
131
162
}
163
+
164
+ /**
165
+ * @param ActiveQuery $query
166
+ * @param array $columns
167
+ * @return ActiveQuery
168
+ */
169
+ public function formatData (ActiveQuery $ query , $ columns )
170
+ {
171
+ if ($ this ->formatData !== null ) {
172
+ return call_user_func ($ this ->formatData , $ query , $ columns );
173
+ }
174
+
175
+ return $ query ->all ();
176
+ }
177
+
178
+ /**
179
+ * @param array $response
180
+ * @return ActiveQuery
181
+ */
182
+ public function formatResponse ($ response )
183
+ {
184
+ if ($ this ->formatResponse !== null ) {
185
+ return call_user_func ($ this ->formatResponse , $ response );
186
+ }
187
+
188
+ return $ response ;
189
+ }
132
190
}
0 commit comments