
Обычно c этой целью генерируется CRUD (контроллер с основными методами index/view/create/update/delete и видами). По-умолчанию у нас отобразится такой вид:

Если мы захотим отфильтровать записи по полю created_at, то просто так сделать это не получится. Можно, конечно, изменить формат даты или вводить вручную метку времени, но выбрать между двумя датами - никак.
Наша цель:

где удобно указывать диапазон в двух всплывающих окнах и автоматически будет применен фильтр к выводящимся данным.
Устанавливаем расширения.
• https://github.com/kartik-v/yii2-widget-datepicker
composer require kartik-v/yii2-widget-datepickerЕсли нужны не только даты но и время, то устанавливать этот пакет:
https://github.com/kartik-v/yii2-widget-datetimepicker
• https://github.com/kartik-v/yii2-field-range
composer require kartik-v/yii2-field-range "dev-master"
Второе расширение не является обязательным и используется для разметки Bootstrap и др. при выводе нескольких полей (диапазонов дат).
Если планируется установка многих виджетов от Kartik, в т.ч. выше указанные, то можно загрузить их одним расширением:
https://github.com/kartik-v/yii2-widgets
composer require kartik-v/yii2-widgets "*"
Корректируем модель(сущность).
При создании CRUD, действие index() вызывает поисковую модель:
$searchModel = new PostSearch();
где происходит выборка из БД. Нужно подкорректировать условие в методе search, что бы поле created_at выбиралось между выбираемым диапазоном дат.
Убрать строку
'created_at' => $this->created_at,из списка условий наподобии
$query->andFilterWhere([ 'id' => $this->id, 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, ]); $query->andFilterWhere(['like', 'name', $this->name]);и добавить с низу дополнительное условие:
$query ->andFilterWhere(['>=', 'created_at', $this->date_from ? strtotime($this->date_from . ' 00:00:00') : null]) ->andFilterWhere(['<=', 'created_at', $this->date_to ? strtotime($this->date_to . ' 23:59:59') : null]);
Так же добавить для данного класса два свойства:
public $date_from; public $date_to;и назначить им правила в методе rules:
[['date_from', 'date_to'], 'date', 'format' => 'php:Y-m-d'],
Еще кое-что не относящееся напрямую к теме - чтобы поля created_at и updated_at проставлялись автоматически текущими временными метками при сохранении данных в таблицу - нужно удалить данные поля из метода rules() модели(сущности) и добавить поведение:
/** * @inheritdoc */ public function behaviors() { return [ TimestampBehavior::className(), ]; }
Устанавливаем виджет в представление.
В основной файл представления backend/views/xxx/index.php вместо простого вывода поля 'created_at' вставляем вывод виджета:
[ 'attribute' => 'created_at', 'filter' => kartik\date\DatePicker::widget([ 'model' => $searchModel, 'attribute' => 'date_from', 'attribute2' => 'date_to', 'type' => kartik\date\DatePicker::TYPE_RANGE, 'separator' => '-', 'pluginOptions' => [ 'todayHighlight' => true, 'weekStart'=>1, //неделя начинается с понедельника 'autoclose'=>true, 'format' => 'yyyy-mm-dd', ], ]), 'format' => ['date', 'YYYY-MM-dd HH:mm:ss'], ],
В поле 'type' указываем что нужен именно диапазон дат (константа TYPE_RANGE).