Сетка сетки 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']); }
Попробуйте это, это поможет вам …