You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 23:27:00