Пример "in range" валидатора для дат:
public function rules()
{
return [
[['date'], 'required'],
[['date'], 'safe'],
[['date'],
'filter',
'filter' => function($value){
return \Yii::$app->formatter->asDate($value, 'yyyy-MM-dd');
}
],
[
['date'],
'date',
'format' => 'yyyy-MM-dd'
],
[
['date'],
'in',
'range' => function ($model, $attribute) {
$start = \Yii::$app->formatter->asTimestamp(!empty($model->oldAttributes[$attribute]) ?
$model->oldAttributes[$attribute] :
$this->$attribute);
$start += 24 * 60 * 60;
$stop = \Yii::$app->formatter->asTimestamp($model->relatedModel->end_date);
$dates = [];
while ($start <= $stop) {
$dates[] = \Yii::$app->formatter->asDate($start, 'MM/dd/yyyy');
$start += (24 * 60 * 60);
}
return $dates;
},
'on' => [
self::SCENARIO_DEFAULT,
],
'skipOnEmpty' => false,
'skipOnError' => false
],
];
}
P.S.
Валидатор готовит массив дат в американском формате, т.к. именно он нужен для выбора даты из \yii\jui\DatePicker
<?php
$form = ActiveForm::begin();
$model->date = \Yii::$app->formatter->asDate($model->date, 'MM/dd/yyyy');
?>
<?= $form->field($model, 'date')
->label('Date')
->widget(DatePicker::className(), [
'dateFormat' => 'MM/dd/yyyy',
])
->textInput([
'class' => 'form-control',
]);
?>