Бортовой журнал Ктулху

Фильтрация по полю GridView в Yii2

Недавно я писал как можно использовать GridView для отображения данных из одной таблицы, а сегодня задача немного усложняется - нужно фильтровать данные из таблицы по одному из полей. Делать буду максимально просто для общего понимания.

Для реализации этого функционала понадобятся три файла:

1). контроллер - \controllers\testController.php

2). модель - \models\test.php

3). представление - \views\index.php

 

Контроллер

Тут ничего сложного, просто отобразить шаблон.

public function actionTest() {
    return $this->render('index');
}

Модель

В модели должен быть такой метод:

public function search($params){   
    $query = static::find();
    $this->scenario = 'filter'; // использование сценариев определяет какие поля выводить в фильтре
    if(isset($params["some-parameter"])){
        $query->where(['some-field' => $params["some-parameter"])]);   
    }
    $dataProvider = new ActiveDataProvider([
        'query' => $query,    ]);
    $this->load($params);
    if (!$this->validate()) {
        return $dataProvider;   
    }
    return $dataProvider;
}

Выбрать, какие поля отображать а какие нет, можно через использование сценариев.

В примере я указал сценарий filter.

 
public function scenarios() {   
    $scenarios = parent::scenarios();   
    $scenarios['filter'] = [
        'some-field'   
    ];   
    return $scenarios; }

Кроме того, в модели должны быть заполнены все поля в методе правил:

    public function rules(){
      return [             
        ['Type', 'string', 'max' => 1],             
        ['Date', 'date', 'format' => 'LLL dd yyyy hh:mm:ss:AAAa'],             
        ['Id', 'integer'],     
    ];
}
 

Представление

Фильтр активируется при добавлении опции FilterModel

screenshot 2019 12 11 09 23 41 

$searchModel = new tableClass();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
echo GridView::widget([   
    'dataProvider' => $dataProvider,
<strong>   </strong> 'filterModel' => $searchModel,
    'columns' => [
    ....