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