2014-12-10 15 views
8

Chế độ xem lưới Kartik trong yii2 cung cấp tùy chọn hiển thị các hộp kiểm trong chế độ xem lưới. Làm cách nào để xóa dữ liệu hàng loạt bằng cách chọn hộp kiểm? Bất kỳ sự giúp đỡ nào sẽ là tuyệt vời. Đây là mã của tôi:Yii 2: cách xóa hàng loạt dữ liệu trong chế độ xem lưới 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

Chính xác bạn muốn xóa gì? – arogachev

+0

Tôi muốn xóa tất cả dữ liệu có hộp kiểm được chọn. – Stark

Trả lời

7

1. Thêm lớp tùy chỉnh hoặc id để chứa pjax

Hoặc thêm class hoặc id để chứa pjax của bạn với GridView, vì vậy bạn không phải phụ thuộc từ tự động tạo ra các lớp học và id (hoặc trong trường hợp bạn có nhiều widget GridView trong một trang).

kartik\grid\CheckboxColumn chỉ là phiên bản mở rộng của yii\grid\CheckboxColumn.

kartik\grid\ViewcontainerOptions, bạn có thể chỉ định class tại đây, có vẻ như id được tạo tự động và không thể thay đổi bằng thuộc tính này.

'containerOptions' => ['class' => 'hotel-pjax-container'], 

Ví dụ về sản lượng được tạo ra:

<div class="hotel-pjax-container table-responsive" id="w0-container">...</div> 

yii\grid\View\options, bạn có thể chỉ định id đây. Id kết quả container sẽ được bắt đầu bằng giá trị thông qua, ví dụ:

'options' => ['id' => 'hotel-pjax'], 

tạo đầu ra:

<div class="table-responsive" id="hotel-pjax-container">...</div> 

Class được bỏ qua trong trường hợp này.

Tôi khuyên bạn nên chỉ định id.

2. Tạo hoặc sửa đổi hành động để xóa trong bộ điều khiển

Theo mặc định delete tự động được tạo ra với gii đã chuyển hướng, vì vậy chúng tôi có thể tạo một hành động cho nhiều xóa (hoặc bạn có thể xử lý này trong một, tuỳ bạn).

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]); 
} 

Lưu ý rằng nếu bạn không chỉ định bất kỳ điều kiện trong deleteAll(), tất cả các bản ghi trong bảng sẽ bị xóa! Hãy chính xác với điều đó.

Bạn cũng có thể chỉ định các hành động trong VerbFilter như thế này:

use yii\filters\VerbFilter; 

/** 
* @inheritdoc 
*/ 
public function behaviors() 
{ 
    return [ 
     'verbs' => [ 
      'class' => VerbFilter::className(), 
      'actions' => [ 
       'delete' => ['post'], 
       'delete-multiple' => ['post'], 
      ], 
     ], 
    ]; 
} 

3.Viết một số javascript để buộc tất cả cùng nhau

Bạn có thể nhận được từ khóa chính của dòng được chọn như thế này:

$('#hotel-pjax-container').yiiGridView('getSelectedRows'); 

Thêm javascript này (nút bấm ví dụ):

$.post(
    "delete-multiple", 
    { 
     pk : $('#hotel-pjax-container').yiiGridView('getSelectedRows') 
    }, 
    function() { 
     $.pjax.reload({container:'#hotel-pjax-container'}); 
    } 
); 

Bạn có thể tìm thêm thông tin về việc cập nhật GridView với pjax trong issue này. Có thể thử cách này: $('#hotel-pjax-container').yiiGridView('applyFilter'); làm phương án thay thế; Bao gồm js bằng nội dung hoặc chỉ với registerJs();

7

Hãy thử điều này, tôi hy vọng điều này sẽ giúp bạn, thay vì sử dụng kartik\grid\CheckboxColumn này này yii\grid\CheckboxColumn

Bước 1: tạo ra một nút cho nhiều xóa trong index.php

<input type="button" class="btn btn-info" value="Multiple Delete" id="MyButton" > 

Bước 2: Trong index.php của bạn (cùng một trang), hãy sử dụng 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 này được sử dụng để nhận được giá trị (id) của hàng đã chọn

Bước 3: trong bộ điều khiển của khách sạn (HotelController.php) tạo một hành động cho nhiều động xóa

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

    } 

Hãy thử điều này chắc chắn điều này sẽ giúp bạn ..

+0

tuyệt vời, chỉ cần thêm 'id = 'w4'' trên gridview vì bạn đang làm' $ (\' # w4 \ '). YiiGridView (\' getSelectedRows \ '); ' –

+0

không hoạt động trên dự án của tôi. làm thế nào để cho rằng id = w4 & ở đâu ?? – Goli

+0

@Nodemon có giao diện .. https://stackoverflow.com/questions/47844216/delete-multiple-rows-selected-by-checkbox-column?noredirect=1#comment82652658_47844216 – Goli

Các vấn đề liên quan