在用gridview时,大家都注意到了,列表的开头有现成的复选框,这肯定是批量操作中用到的,今天就来介绍一下,gridview中的批量操作,简直简单的不行,效果图如下:

前端页面只需要改这几个地方即可,

1、gridview设置options时增加一个id 这里我们命名grid。

2.columns增加选项复选框,批量删除必然不可少了复选框操作,这里我们的name值设定为id,方便对数据操作,代码如下

'options' =>['id'=>'grid'],
'columns' => [
    [
        'class' => 'yii\grid\CheckboxColumn',
        'name'=>'id',
    ],//复选框列

3、页面上我们增加一个批量删除按钮,注意这里我们增加了一个class gridviewdelete,方便后面js实现点击效果

<?= Html::a('批量删除', "javascript:void(0);", ['class' => 'btn btn-primary gridviewdelete']) ?>

4、最后一步,写js实现按钮操作,我们很轻松的就拿到了选中的行的id,然后这里就可以异步操作数据了。

$script = <<<SCRIPT
$(".gridviewdelete").on("click", function () {
if(confirm('您确定要删除吗?')){
    var keys = $("#grid").yiiGridView("getSelectedRows");
     $.ajax({
            url: '/food/batchdelete',
            data: {ids:keys},
            type: 'post',
            success: function (t) {
                t = JSON.parse(t);
                if (t.status == 1) {
                    window.location.href= window.location.href;
                }
            },
            error: function () {
                alert("删除失败!")
            }
    
        })
    }
});
SCRIPT;
$this->registerJs($script);
?>

5.post传给控制器的是一个数组,这里我写了一个批量操作的方法,一块贴出来,这里的删除为逻辑删除

public function actionBatchdelete(){
   $this->enableCsrfValidation = false;//去掉yii2的post验证
   $ids = Yii::$app->request->post();
   $model = new Product();
   if($model->batchHandle($ids['ids']))
      return \yii\helpers\Json::encode(['status'=>1,'info'=>'删除成功!']);
   else
      return false;
}

其中batchHandle为批量操作的方法:

public function batchHandle($ids = [],$status = 3){
    foreach ($ids as $k=>$v){
        $model = $this->has(['id'=>$v]);
        $model->status = $status;
        if(!$model->save(false))
            return new BadRequestHttpException('操作失败!');
    }
    return true;
}

//其中has方法如下:
public function has($where=[], $field='*') {
    $result = $this->_query
        ->select($field)
        ->where($where)
        ->one();
    return empty($result) ? false : $result;
}

批量操作就这样完成了,是不是很简单,gridview中的一些使用方法也算是总结的差不多了,希望能帮助到大家!该睡觉了!