【发布时间】: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() ?>
现在,事实上,问题本身。描述它的最简单方法是步骤的形式:
- 页面加载,数据取自actionIndex()
- 用户点击了按钮,向actionLoadData()发送了一个Ajax请求
- 新 GridView 的呈现
- 当您点击分页时,数据会从 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