yii2中的Kartik网格视图提供了一个在网格视图中显示复选框的选项。如何通过选中复选框来删除批量数据?任何帮助都会很棒。这是我的代码:
<?php use kartik\grid\GridView;?>
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'pjax'=>true,
'pjaxSettings'=>[
'neverTimeout'=>true,
],
'columns' => [
['class' => '\kartik\grid\CheckboxColumn'],
['class' => 'yii\grid\SerialColumn'],
'hotel_id',
'name',
'address',
'phone_no',
'contact_person',
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
答案 0 :(得分:7)
<强> 1。将自定义类或ID添加到pjax容器
使用GridView向pjax容器添加class或id,因此您不依赖于自动生成的类和ID(或者如果您在一个页面中有多个GridView小部件)。
kartik\grid\CheckboxColumn
只是yii\grid\CheckboxColumn的扩展版本。
kartik\grid\View
有containerOptions
,您可以在此处指定class
,似乎id
是自动生成的,无法使用此属性进行更改。
'containerOptions' => ['class' => 'hotel-pjax-container'],
生成输出的示例:
<div class="hotel-pjax-container table-responsive" id="w0-container">...</div>
yii\grid\View\
有options
,您可以在此处指定id
。结果容器ID将以传递的值为前缀,例如:
'options' => ['id' => 'hotel-pjax'],
生成输出:
<div class="table-responsive" id="hotel-pjax-container">...</div>
在这种情况下忽略类。
我建议指定id。
<强> 2。在控制器中创建或修改删除操作
默认delete
使用gii
自动生成的操作具有重定向功能,因此我们可以创建
多次删除的另一个动作(或者你可以在一个中处理这个,这取决于你)。
public function actionDeleteMultiple()
{
$pk = Yii::$app->request->post('pk'); // Array or selected records primary keys
// Preventing extra unnecessary query
if (!$pk) {
return;
}
return Hotel::deleteAll(['hotel_id' => $pk]);
}
请注意,如果您未在deleteAll()
中指定任何条件,则表格中的所有记录都将被删除!准确无误。
您还可以在VerbFilter
中指定此操作:
use yii\filters\VerbFilter;
/**
* @inheritdoc
*/
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'],
'delete-multiple' => ['post'],
],
],
];
}
第3。写一些javascript以结合在一起
您可以获取所选行的主键,如下所示:
$('#hotel-pjax-container').yiiGridView('getSelectedRows');
添加此javascript(例如按钮点击):
$.post(
"delete-multiple",
{
pk : $('#hotel-pjax-container').yiiGridView('getSelectedRows')
},
function () {
$.pjax.reload({container:'#hotel-pjax-container'});
}
);
您可以在此issue中找到有关使用pjax更新GridView的更多信息。
也许试试这个:$('#hotel-pjax-container').yiiGridView('applyFilter');
作为替代;
使用资产或仅使用registerJs()
;
答案 1 :(得分:7)
试试这个,我希望这会对您有帮助,而不是kartik\grid\CheckboxColumn
使用此yii\grid\CheckboxColumn
第1步: 在index.php中创建一个用于多次删除的按钮
<input type="button" class="btn btn-info" value="Multiple Delete" id="MyButton" >
第2步: 在index.php(同一页面)中使用此javascript
<?php
$this->registerJs('
$(document).ready(function(){
$(\'#MyButton\').click(function(){
var HotId = $(\'#w4\').yiiGridView(\'getSelectedRows\');
$.ajax({
type: \'POST\',
url : \'index.php?r=hotel/multiple-delete\',
data : {row_id: HotId},
success : function() {
$(this).closest(\'tr\').remove(); //or whatever html you use for displaying rows
}
});
});
});', \yii\web\View::POS_READY);
?>
此jquery用于获取所选行的值(id)
第3步: 在酒店的控制器(HotelController.php) 为多重删除创建一个动作
public function actionMultipleDelete()
{
$pk = Yii::$app->request->post('row_id');
foreach ($pk as $key => $value)
{
$sql = "DELETE FROM hotel WHERE hotel_id = $value";
$query = Yii::$app->db->createCommand($sql)->execute();
}
return $this->redirect(['index']);
}
尝试这一点肯定会对你有帮助......
答案 2 :(得分:0)
通过执行以下操作,我成功删除了gridview Yii2中的多行:
创建按钮
<p>
<button type="button" onclick="getRows()" class="btn btn-success">Delete Bulk</button>
</p>
添加JavaScript代码以执行从GridView小部件获取选中的行的事件。
<script>
function getRows()
{
//var user_id as row_id from the gridview column
// var list = [] is an array for storing the values selected from the gridview
// so as to post to the controller.
var user_id;
var list = [];
//input[name="selection[]"] this can be seen by inspecting the checkbox from your gridview
$('input[name="selection[]"]:checked').each(function(){
user_id = this.value;
list.push(user_id);
});
$.ajax({
type: 'post',
url:'index.php?r=student-detail-update/bulk',
data: {selection: list},
});
}
</script>
将此代码放在您的控制器中
if ($selection=(array)Yii::$app->request->post('selection')) {
foreach($selection as $id){
$StudentDetailUpdates = StudentDetailUpdate::find()
->where(['user_id' => $id])
->all(); //....put your stuffs here
}