yii2中的gridview复选框多删除

gridview check box multi delete in yii2

我只是想要一个在每行前面都有复选框列的 gridview,我的管理员可以通过选中所有或选中一个或选中他们不喜欢的复选框来删除行,然后单击删除按钮删除所有选中的行从他们的视野中移除

在后面重要的是将他们的删除列更新为 1 行而不是删除

这是我删除一个 id 的代码

控制器(忽略波斯语)

    public function actionDelete($id=[])
    {
    $model = \Yii::$app->db->createCommand()
        ->update('tbl_post',['Delete'=>1],['id'=>$id])->execute();

    if($model==true){
        \Yii::$app->session->setFlash('با موفقیت نیست شد');
    }else{
        \Yii::$app->session->setFlash('با موفقیت نیست نشد');
    }
    return $this->redirect('index');
    }

这是风景(忽略波斯语)

//in baraye ine ke form taiid shod payam bede
foreach (Yii::$app->session->getAllFlashes() as $key => $message) {
    echo '<div class="alert alert-' . $message . '">' . $key . '</div>';
}
//-------------------------table it self
echo \yii\grid\GridView::widget([
    'dataProvider' => $adp,
    'caption' => 'لیست تمامی محتوا ها',
    'captionOptions' => ['id' => 'atro-caption'],
    'headerRowOptions' => ['class' => 'atro-th'],
    'columns' => [
        ['class' => \yii\grid\SerialColumn::className(),],
        ['class' => \yii\grid\CheckboxColumn::className(),
            'checkboxOptions' => function ($a) {
                return ['value' => $a->id];
            }],
        'Title',
        'FK_PostType',
        'FK_Author',
    ]
]);

在我就你的问题向你提出任何建议之前,你应该了解编程的基本规则,即永远不要将保留关键字用于函数命名变量或数据库字段名称,你已经使用 Delete 作为列名,你应该立即将其更改为 is_deleted 之类的内容。我将在示例参考中使用此名称。

关于你的问题,你有两种方法可以解决。

  1. 添加一个按钮并绑定 javascript 点击事件到它会序列化所有选中的复选框,然后使用 ajax post 请求提交选中的ID 并将其标记为删除。

  2. 将您的 Gridview 包裹在一个表单标签中,然后使用提交按钮将其提交到删除操作。

我给大家演示第一个选项

GridView

顶部添加按钮
<?=Html::button('Delete', ['class' => 'btn btn-danger', 'id' => 'delete'])?>

然后给pjax容器分配一个ID

<?php Pjax::begin(['id' => 'my-grid']);?>

将此 javascript 粘贴到您的视图顶部,但将 ajax 调用的 url 更新为您的实际 controller/delete 操作

$this->registerJs('
$(document).on("click","#delete",function(e){
    let selected=$(".grid-view>table>tbody :input");
    let data=selected.serialize();
    if(selected.length){
        let confirmDelete  =   confirm("Are you sure you want to delete?");
        if(confirmDelete){
            $.ajax({
                url:"/test/delete",
                data:data,
                dataType:"json",
                method:"post",
                success:function(data){
                    if(data.success){
                        $.pjax({container:"#my-grid"});
                    }else{
                        alert(data.msg);
                    }
                },
                error:function(erorr,responseText,code){}
            });
        }
    }else{
        alert("select someitems to delete");
    }
});
', \yii\web\view::POS_READY);

并将您的删除操作更改为以下内容,尝试使用 transaction 块,这样如果在操作过程中发生某些事情,它将恢复所有更改,更改 model 名称和namespace 到合适的型号,我假设你的型号名称是 Post.

 public function actionDelete()
    {
        if (Yii::$app->request->isPost) {
            $selection = Yii::$app->request->post('selection');
            $response['success'] = false;

            $transaction = Yii::$app->db->beginTransaction();

            try {
                \frontend\models\Post::updateAll(['is_deleted' => 1], ['IN', 'id', $selection]);
                $response['success'] = true;
                $transaction->commit();
            } catch (\Exception $ex) {
                $transaction->rollBack();
                $response['msg'] = $ex->getMessage();
            }

            echo \yii\helpers\Json::encode($response);

        }
    }