Yii2 Gridview 获取所有分页的所有选定行
Yii2 Gridview get all selected row for all pagination
我像这样用 Pjax 小部件包装了我的 gridview
\yii\widgets\Pjax::begin();
gridview
\yii\widgets\Pjax::end();
为了让 gridview 在我点击每个分页时发出 ajax 请求。
我也在专栏中使用 ['class' => 'yii\grid\CheckboxColumn'],
。
我发现当我第一次分页时,我检查了一些行,然后转到第二页并检查了一些行,但是当我回到第一页时,我检查的内容消失了。
我的问题是如何保留所有分页的所有选中行
在当前条件下(Pjax、多页、yii\grid\CheckboxColumn
)这是不可能的,因为它的工作方式。
当您单击分页链接时,所有 GridView
html 内容都将替换为来自 AJAX 响应的新内容。
显然,上一页上所有 selected 的复选框都消失了。
几种可能的解决方法:
1) 编写自定义 javascript 和服务器端逻辑。
作为选项之一,您可以向服务器发送 AJAX 请求,参数表示用户已选择 select 所有数据进行批量删除操作(或使用单独的控制器操作进行批量删除)删除)。在这种情况下,实际上我们不需要从用户那里获取 selected 数据,因为我们可以简单地从数据库中获取它们 (credits - Seng).
2)增加每页显示的行数。
3) 使用无限滚动扩展,例如 this.
4) 在几次迭代中打破所需的动作:
- select 需要首页上的行,执行操作(例如,删除)。
- 对其他页面重复此操作。
您可以获得这样的 selected 行:
$('#your-grid-view').yiiGridView('getSelectedRows');
我刚刚解决了这个问题,它可以与 Pjax 一起正常工作。
您可以使用我的 CheckboxColumn。我希望这能有所帮助。检查的项目记录在 cookie 中。
你可以阅读hezll的//add部分来了解如何修复它,因为我没有提供完整的通用部分。
希望对你有用。
[无限滚动] : 如果您没有任何 pjax 过滤器,http://kop.github.io/yii2-scroll-pager/ 会很好用。如果你也有过滤器,不要使用这个插件,因为它不支持 pjax 过滤器。对于其余的应用程序,它非常适合使用。
Update1:似乎比预期的要简单,这是我完成它的方法
将以下行添加到复选框列
'checkboxOptions' => function($data){
return ['id' => $data->id, 'onClick' => 'selectedRow(this)'];
}
现在将以下 JS 添加到该数据网格所在页面的项目中的公共 js 文件中
var selectedItems=[]; //global variable
/**
* Store the value of the selected row or delete it if it is unselected
*
* @param {checkbox} ele
*/
function selectedRow(ele){
if($(ele).is(':checked')) {
//push the element
if(!selectedItems.includes($(ele).attr('id'))) {
selectedItems.push($(ele).attr('id'));
}
} else {
//pop the element
if(selectedItems.includes($(ele).attr('id'))) {
selectedItems.pop($(ele).attr('id'));
}
}
}
以上函数会将选定的行 id 存储在全局变量数组中
现在将以下行添加到 pjax:end 事件处理程序
$(document).on('pjax:end', function () {
//Select the already selected items on the grid view
if(!empty(selectedItems)){
$.each(selectedItems, function (index,value) {
$("#"+value).attr('checked',true);
});
}
});
希望对您有所帮助。
我像这样用 Pjax 小部件包装了我的 gridview
\yii\widgets\Pjax::begin();
gridview
\yii\widgets\Pjax::end();
为了让 gridview 在我点击每个分页时发出 ajax 请求。
我也在专栏中使用 ['class' => 'yii\grid\CheckboxColumn'],
。
我发现当我第一次分页时,我检查了一些行,然后转到第二页并检查了一些行,但是当我回到第一页时,我检查的内容消失了。
我的问题是如何保留所有分页的所有选中行
在当前条件下(Pjax、多页、yii\grid\CheckboxColumn
)这是不可能的,因为它的工作方式。
当您单击分页链接时,所有 GridView
html 内容都将替换为来自 AJAX 响应的新内容。
显然,上一页上所有 selected 的复选框都消失了。
几种可能的解决方法:
1) 编写自定义 javascript 和服务器端逻辑。
作为选项之一,您可以向服务器发送 AJAX 请求,参数表示用户已选择 select 所有数据进行批量删除操作(或使用单独的控制器操作进行批量删除)删除)。在这种情况下,实际上我们不需要从用户那里获取 selected 数据,因为我们可以简单地从数据库中获取它们 (credits - Seng).
2)增加每页显示的行数。
3) 使用无限滚动扩展,例如 this.
4) 在几次迭代中打破所需的动作:
- select 需要首页上的行,执行操作(例如,删除)。
- 对其他页面重复此操作。
您可以获得这样的 selected 行:
$('#your-grid-view').yiiGridView('getSelectedRows');
我刚刚解决了这个问题,它可以与 Pjax 一起正常工作。
您可以使用我的 CheckboxColumn。我希望这能有所帮助。检查的项目记录在 cookie 中。
你可以阅读hezll的//add部分来了解如何修复它,因为我没有提供完整的通用部分。
希望对你有用。
[无限滚动] : 如果您没有任何 pjax 过滤器,http://kop.github.io/yii2-scroll-pager/ 会很好用。如果你也有过滤器,不要使用这个插件,因为它不支持 pjax 过滤器。对于其余的应用程序,它非常适合使用。
Update1:似乎比预期的要简单,这是我完成它的方法
将以下行添加到复选框列
'checkboxOptions' => function($data){
return ['id' => $data->id, 'onClick' => 'selectedRow(this)'];
}
现在将以下 JS 添加到该数据网格所在页面的项目中的公共 js 文件中
var selectedItems=[]; //global variable
/**
* Store the value of the selected row or delete it if it is unselected
*
* @param {checkbox} ele
*/
function selectedRow(ele){
if($(ele).is(':checked')) {
//push the element
if(!selectedItems.includes($(ele).attr('id'))) {
selectedItems.push($(ele).attr('id'));
}
} else {
//pop the element
if(selectedItems.includes($(ele).attr('id'))) {
selectedItems.pop($(ele).attr('id'));
}
}
}
以上函数会将选定的行 id 存储在全局变量数组中
现在将以下行添加到 pjax:end 事件处理程序
$(document).on('pjax:end', function () {
//Select the already selected items on the grid view
if(!empty(selectedItems)){
$.each(selectedItems, function (index,value) {
$("#"+value).attr('checked',true);
});
}
});
希望对您有所帮助。