Yii 2: как объединить удаление данных в виде сетки картика?

Сетка сетки Kartik в yii2 предоставляет возможность отображения флажков в режиме сетки. Как удалить объемные данные, установив флажки? Любая помощь будет полезна. Вот мой код:

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

1. Добавить пользовательский класс или идентификатор в контейнер pjax

Либо добавьте класс или id в свой контейнер pjax с помощью GridView, так что вы не зависите от автоматически сгенерированных классов и идентификаторов (или если у вас несколько виджетов 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 . Идентификатор контейнера результата будет иметь префикс переданного значения, например:

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

Сгенерированный выход:

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

Класс игнорируется в этом случае.

Я рекомендую указать идентификатор.

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

Вы можете найти дополнительную информацию об обновлении GridView с помощью pjax в этой проблеме . Возможно, попробуйте следующее: $('#hotel-pjax-container').yiiGridView('applyFilter'); как альтернатива; Включить js с использованием активов или просто с registerJs() ;

Попробуйте это, я надеюсь, что это поможет вам, вместо этого 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']); } 

Попробуйте это, это поможет вам …