Например в таблице posts есть поле created_at (дата создания записи) и у нас задача в админке вывести посты за определенный период (между двумя выбранными датами).

Обычно 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).