@davron2813

Как сделать range validator для yii2?

как в yii2 сделать rangle validator
как бы правило о том что значение поля должно быть не менее 1 и не больше 100
[['score'],'in','max'=>100,'min'=>1],
ну как то попытался взять из yii1 не получилось ?
  • Вопрос задан
  • 8719 просмотров
Пригласить эксперта
Ответы на вопрос 3
iiifx
@iiifx
PHP, OOP, SOLID, Yii2, Composer, PHPStorm
Для начала почитать офф. доки: www.yiiframework.com/doc-2.0/guide-tutorial-core-v...
[ [ 'score' ], 'compare', 'compareValue' => 1, 'operator' => '>=' ],
[ [ 'score' ], 'compare', 'compareValue' => 100, 'operator' => '<=' ],
# или
[ [ 'score' ], 'in', 'range' => [ 1, ..., 100 ] ],
# или
[ [ 'score' ], function ( $attribute, $params ) {
    if ( !( $this->$attribute >= 1 && $this->$attribute <= 100 ) ) {
        # Ошибка!
    } 
} ],
Ответ написан
Комментировать
@alchir79
[['score'], 'integer', 'min' => 1, 'max' => 100, 'message' => 'Неверный диапазон'],
Ответ написан
Комментировать
mulat
@mulat
seo, php, yii2
Пример "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',
        ]);
?>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы