Bagi developer Yii2 yang berpengalaman, perubahan default filtering behavior dari POST di Yii1 ke GET di Yii2’s GridView seringkali menimbulkan kebutuhan untuk custom implementation. Artikel ini akan membahas teknik advanced untuk mengubah metode request GridView dari GET ke POST, termasuk pertimbangan security dan performance yang perlu diperhatikan.
Yii2 framework mengadopsi metode GET sebagai default untuk filter operations dalam GridView widget, berbeda dengan pendahulunya Yii1 yang menggunakan POST. Meskipun GET method lebih mudah untuk implementasi caching dan bookmarking, dalam beberapa scenario production environment, penggunaan POST menjadi kebutuhan mandatory karena:
- Security considerations terhadap sensitive data
- Length limitations pada query string parameters
- URL cleanliness dan SEO considerations
- Prevention of CSRF attacks melalui token validation
Implementasi POST Method dalam GridView
Berikut adalah implementasi teknikal untuk mengkonfigurasi GridView menggunakan POST method dengan Pjax integration.
View Configuration
Modifikasi view file dengan konfigurasi Pjax widget berikut:
<?php
use yii\widgets\Pjax;
use yii\grid\GridView;
Pjax::begin([
'id' => 'grid-pjax',
'timeout' => 5000,
'enablePushState' => false,
'enableReplaceState' => false,
'clientOptions' => [
'method' => 'POST',
'skipOuterContainers' => true
]
]);
?>
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => require __DIR__ . '/_columns.php',
'layout' => "{items}\n{pager}",
]); ?>
<?php Pjax::end(); ?>Parameter Configuration:
enablePushState: false– Mencegah update browser historyenableReplaceState: false– Menonaktifkan URL replacementmethod: 'POST'– Set HTTP method ke POSTtimeout: 5000– Set request timeout 5 detik
Controller Modification
Pada controller, ubah parameter handling dari queryParams ke post():
public function actionIndex()
{
$searchModel = new YourSearchModel();
$dataProvider = $searchModel->search(
Yii::$app->request->post()
);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}Advanced Configuration dan Best Practices
Untuk production environment, pertimbangkan implementasi berikut:
CSRF Protection
Pjax::begin([
'id' => 'grid-pjax',
'clientOptions' => [
'method' => 'POST',
'data' => [
Yii::$app->request->csrfParam => Yii::$app->request->csrfToken
]
]
]);Custom Filter Handler
// Dalam SearchModel
public function search($params)
{
$query = YourModel::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 20,
],
'sort' => [
'defaultOrder' => ['id' => SORT_DESC]
]
]);
if (!empty($params) && $this->load($params) {
// Apply filters here
$query->andFilterWhere(['like', 'attribute', $this->attribute]);
}
return $dataProvider;
}Performance Note: Implementasi POST method dengan Pjax dapat meningkatkan memory usage pada large datasets. Disarankan untuk implementasi proper pagination dan query optimization.
Debugging dan Troubleshooting
- Pastikan Pjax ID konsisten antara initialization dan termination
- Verify CSRF token validation pada POST requests
- Check browser console untuk JavaScript errors
- Monitor network tab untuk request/response inspection
Dengan implementasi yang tepat, konversi GridView dari GET ke POST dapat memberikan enhanced security dan flexibility tanpa mengorbankan user experience yang optimal.


