【问题标题】:How to save GridView filters for pagination in Yii2如何在 Yii2 中保存 GridView 过滤器以进行分页
【发布时间】:2021-09-24 13:53:59
【问题描述】:

有一个页面显示了GridView:

// OrderController

public function actionIndex()
{
    $dataProvider = new ActiveDataProvider([
        'query' => Model::find(),
        'sort' => false,
        'pagination' => [
            'pageSize' => 15,
            'route' => '/order'
        ],
    ]);

    return $this->render('index', [
        'dataProvider' => $dataProvider,
    ]);
}

页面上有一些按钮可以过滤表格中的信息。当您单击它们时,将向 loadData 方法发送一个带有必要参数的 Ajax 请求。然后结果显示在页面上。

// OrderController

public function actionLoadData()
{
    Yii::$app->response->format = Response::FORMAT_JSON;

    if (Yii::$app->request->isAjax)
    {
        ...

        $dataProvider = new ActiveDataProvider([
            'query' => Model::find()->accounts($selectedAccountsIds)
            'sort' => false,
            'pagination' => [
                'pageSize' => 15,
                'route' => '/order'
            ],
        ]);
        
        return [
            'success' => true,
            'render' => $this->renderPartial('parts/_table', [
                'dataProvider' => $dataProvider
            ])
        ];
    }

    ...
}

GridView 封装在 Pjax 中,因此分页无需重新加载即可工作。

<?php Pjax::begin(['timeout' => 5000]) ?>
    <div class="table-responsive">
        <?= GridView::widget([
            'dataProvider' => $dataProvider,
           ...
        ]); ?>
    </div>
<?php Pjax::end() ?>

现在,事实上,问题本身。描述它的最简单方法是步骤的形式:

  1. 页面加载,数据取自actionIndex()
  2. 用户点击了按钮,向actionLoadData()发送了一个Ajax请求
  3. 新 GridView 的呈现
  4. 当您点击分页时,数据会从 actionIndex() 加载,不带过滤器

这是合乎逻辑的,因为通过逐页导航,请求将转到 actionIndex()。问题是,我如何告诉 actionIndex() 需要考虑过滤器来检索数据?

我脑子里只有两个选项。第一种是Ajax请求成功后使用JavaScript在URL参数中添加过滤信息,例如...&daterange=week,在actionIndex()中获取并进行必要的操作。第二个是相同的,但带有 cookie。

// actionIndex() - Example with GET params
if (Yii::$app->request->isPjax)
{
    $dateRange = Yii::$app->request->get('dateRange');
    ...
}

我创建了一个 JavaScript 函数,它将必要的参数添加到 url。在 ajax 请求之后,我的 URL 如下所示:

http://site.loc/order?selected_ids=%5B1%2C4%5D

但是,如果您查看为分页而形成的链接,它们看起来像这样:

http://site.loc/order?page=2

我需要它们看起来像这样:

http://site.loc/order?selected_ids=%5B1%2C4%5D&page=2

actionIndex()actionLoadData() 中,我将路由参数更改为:

    $dataProvider = new ActiveDataProvider([
        'query' => Model::find(),
        'sort' => false,
        'pagination' => [
            'pageSize' => 15,
            'route' => '/order' . Yii::$app->request->queryString
        ],
    ]);

但这只会更加破坏 URL...cookie 只剩下一个选项,但我似乎也怀疑。

如果有人遇到过类似的问题,请分享您的经验。谢谢!

【问题讨论】:

    标签: php gridview pagination yii2


    【解决方案1】:

    我通过使用 cookie 解决了这个问题。最初加载页面时,会检查是否存在 cookie,如果有,则使用必要的过滤器获取数据,如果没有,则设置默认过滤器。作为一个不错的奖励,重新加载页面后会保存过滤器设置:)

    【讨论】:

      猜你喜欢
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      相关资源
      最近更新 更多