Недавно я писал как можно использовать 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
$searchModel = new tableClass();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
echo GridView::widget([
'dataProvider' => $dataProvider,
<strong> </strong> 'filterModel' => $searchModel,
'columns' => [
....