Yii 2:如何在kartik网格视图中批量删除数据?

时间:2014-12-10 09:37:48

标签: php yii2

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'],
    ],
]); ?>

3 个答案:

答案 0 :(得分:7)

<强> 1。将自定义类或ID添加到pjax容器

使用GridView向pjax容器添加class或id,因此您不依赖于自动生成的类和ID(或者如果您在一个页面中有多个GridView小部件)。

kartik\grid\CheckboxColumn只是yii\grid\CheckboxColumn的扩展版本。

kartik\grid\ViewcontainerOptions,您可以在此处指定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();

包含js

答案 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中的多行:

  1. 创建按钮

    <p>
        <button type="button" onclick="getRows()" class="btn btn-success">Delete Bulk</button>
    </p>
    
  2. 添加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>
    
  3. 将此代码放在您的控制器中

    if ($selection=(array)Yii::$app->request->post('selection')) {
    
        foreach($selection as $id){
            $StudentDetailUpdates = StudentDetailUpdate::find()
            ->where(['user_id' => $id])
            ->all(); //....put your stuffs here
    }