Yii2框架中如何保存GridView过滤器参数实现带筛选的分页功能
问题原因
你之前将查询字符串拼接到route参数的操作是错误的,route仅用于指定路由地址,分页的额外参数需要通过Pagination组件的params属性传入,系统会自动将参数拼接到URL的query部分,不会出现格式异常。
解决方案
步骤1:改造actionIndex,支持读取GET参数过滤数据,同时配置分页参数
// OrderController actionIndex public function actionIndex() { $request = Yii::$app->request; // 读取筛选参数 $selectedIds = $request->get('selected_ids', []); // 构造查询 $query = Model::find(); if (!empty($selectedIds)) { $query->accounts($selectedIds); } $dataProvider = new ActiveDataProvider([ 'query' => $query, 'sort' => false, 'pagination' => [ 'pageSize' => 15, 'route' => '/order', // 关键配置:将当前所有GET参数自动带入分页链接 'params' => $request->getQueryParams(), ], ]); return $this->render('index', [ 'dataProvider' => $dataProvider, ]); }
步骤2:改造actionLoadData,为分页配置筛选参数
你筛选请求返回的局部视图里的分页链接,需要在生成DataProvider时就传入筛选参数:
// OrderController actionLoadData public function actionLoadData() { Yii::$app->response->format = Response::FORMAT_JSON; if (Yii::$app->request->isAjax) { $selectedAccountsIds = Yii::$app->request->post('selected_ids', []); $dataProvider = new ActiveDataProvider([ 'query' => Model::find()->accounts($selectedAccountsIds), 'sort' => false, 'pagination' => [ 'pageSize' => 15, 'route' => '/order', // 把筛选参数加入分页配置,生成的链接会自动携带这些参数 'params' => [ 'selected_ids' => $selectedAccountsIds, // 其他筛选参数可以按同样规则添加 ], ], ]); return [ 'success' => true, 'render' => $this->renderPartial('parts/_table', [ 'dataProvider' => $dataProvider ]) ]; } // 原有异常处理逻辑 }
保留你现有JS修改URL追加筛选参数的逻辑即可,现在分页链接会自动携带筛选参数,点击分页后actionIndex会自动读取GET参数返回对应筛选结果。
优化建议(可选)
可以不用单独开发actionLoadData处理筛选请求,直接将筛选表单放在Pjax作用域内,指定Pjax提交,Yii会自动处理局部刷新、参数保留逻辑,无需自定义Ajax:
<!-- 视图文件 --> <?php Pjax::begin(['timeout' => 5000, 'id' => 'order-grid-pjax']) ?> <!-- 筛选表单 --> <form method="get" action="<?= Url::to(['/order']) ?>" data-pjax="#order-grid-pjax"> <input type="text" name="selected_ids" value="<?= Html::encode(Yii::$app->request->get('selected_ids', '')) ?>"> <button type="submit">筛选</button> </form> <div class="table-responsive"> <?= GridView::widget([ 'dataProvider' => $dataProvider, // 原有GridView配置 ]); ?> </div> <?php Pjax::end() ?>
内容的提问来源于stack exchange,提问作者daniil sidorov
相关产品推荐
相关产品推荐

