GridView Yii2
Редактирование таблицы GridView Yii2#
Редактировать данных в ячейке GridView Yii2. Решение от пользователя на форуме Prooksius.
1) GridView:
[ 'attribute' => 'list_count', 'contentOptions' => ['class' => 'td-editing'], 'value' => function ($data) { $html = html::beginForm(Url::to(['update', 'id' => $data->id])); $html .= html::activeTextInput($data, 'list_count', ['class' => 'form-control grid-editable', 'label' => false,]); $html .= html::endForm(); return $html; }, 'format' => 'raw', ],
2) В контроллере для actionUpdate (после сохранения и перед редиректом):
if (Yii::$app->request->get('inplace_edit', '0') == '1') { return \yii\helpers\Json::encode('1'); }
3) JS (после успешного сохранения будет добавлен класс updated на 3 секунды):
$(document).on('change', '.grid-editable', function() { let cur_input = $(this), cur_form = $(this).closest('form'), formData = cur_form.find('input, select'), action = cur_form.attr('action'); $.ajax({ url: action + '&inplace_edit=1', data: formData, type: 'POST', dataType: 'json', success: function (data) { if (data === '1') { cur_input.addClass('updated'); } setTimeout(function(){ cur_input.removeClass('updated'); }, 3000) } }); });
4) Ээффект сохранения в CSS:
.td-editing input{ font-size: 12px; padding: 0 10px 2px; height: unset; border: unset; background: unset; border-bottom: 1px dashed #cecece; text-align: center; } .td-editing .updated{ border-color: #00a65a; color: #00a65a; font-weight: 600; }
DropDownList фильтр с множественным выбором GridView Yii2#
Создание выпадающего списка с множественным выбором для фильтров GridView Yii2 на примере библиотеки Bootstrap Multiselect
1) Подключаем библиотеку Bootstrap Multiselect
Скачиваем на офф.сайте файлы bootstrap-multiselect.js и bootstrap-multiselect.css и подключаем (можно через registerjs)
<?php $this->registerJsFile('/js/bootstrap-multiselect.js', ['depends' => [\yii\web\JqueryAsset::className()]]); $this->registerCssFile("/css/bootstrap-multiselect.css", ['depends'=> ['backend\assets\AppAsset']]); //инициализируем фильтр dropDownList $this->registerJs("$(document).ready(function(){ $('#scansearch-user_scan').multiselect();});", yii\web\View::POS_END); ?>
2) Добавляем список для фильтра в GridView
<?php use yii\helpers\ArrayHelper; use yii\helpers\Html; ?>
[ 'attribute'=>'user_scan', 'filter' => Html::activeDropDownList($searchModel, 'user_scan', ArrayHelper::map(User::find()->all(), 'id', 'name'), ['style'=>'display: none','multiple' =>true]), 'value' => function($data){ return $data->name; } ],
3) Модель поиска ScanSearch
Это в rules
[[ 'user_scan'], 'safe'],
Это в метод search
if ($this->user_scan != null && count ($this->user_scan)>0) { $ids = array_map('intval', $this->user_scan); $query->andFilterWhere(['in', 'user_scan', $ids]); }