Пользовательский метод/функция проверки модели Yii2 не работает

Я хочу проверить мою fine_amount по двум введенным датам. Но он не возвращает никакой ошибки. Без проверки этого метода он сохранил данные. я тоже заглянул

Yii2: how to use custom validation function for activeform?, но для мне нет решения.

Ниже мой код

Controller method

    $model = $this->findModel($id);

    $model->payment_date=date('d-M-Y',strtotime($model->payment_date));
    $model->payment_expected_date=date('d-M-Y',strtotime($model->payment_expected_date));

    if ($model->load(Yii::$app->request->post())) {
        $model->payment_date=date('Ymd',strtotime($model->payment_date));
        $model->payment_expected_date=date('Ymd',strtotime($model->payment_expected_date));

        if($model->validate()){
            $model->save();
            return $this->redirect(['view', 'id' => $model->id]);
        }
        else{
            $model->payment_date=date('d-M-Y',strtotime($model->payment_date));
            $model->payment_expected_date=date('d-M-Y',strtotime($model->payment_expected_date));

            return $this->render('update', [
                'model' => $model,
            ]);
        }
    }

    return $this->render('update', [
        'model' => $model,
    ]);

My Rule

['fine_amount' , 'fine_required'] ,

Validation function

public function fine_required() {
    $this->payment_date = date ( 'Ymd' , strtotime ( $this->payment_date ) );
    $this->payment_expected_date = date ( 'Ymd' , strtotime ( $this->payment_expected_date ) );

    if ( $this->payment_date > $this->payment_expected_date ) {
        if ( $this->fine_amount <= 0 ) {
            $this->addError ( 'fine_amount' , 'Fine Amount Must be add.' );
        }
        return false;
    }
    return true;
}

person Destroyer.0211    schedule 26.03.2018    source источник
comment
что не работает, какое поведение вы получаете при отправке формы? добавьте и свой controller/action   -  person Muhammad Omer Aslam    schedule 26.03.2018
comment
Я хочу проверить, превышает ли дата платежа ожидаемую дату, тогда необходимо ввести какое-то положительное значение, но оно не проверяет это. Я имею в виду без сохранения данных проверки.   -  person Destroyer.0211    schedule 26.03.2018
comment
положительное значение для fine_amount ? и в каком формате payment_date и payment_expected_date публикуются через форму?   -  person Muhammad Omer Aslam    schedule 26.03.2018
comment
да, но только если ожидаемая_дата меньше платежной_даты   -  person Destroyer.0211    schedule 26.03.2018
comment
формат даты - дд-мм-гггг, но я конвертирую его, и если я выйду из этой функции, это не повлияет   -  person Destroyer.0211    schedule 26.03.2018
comment
вам не нужно конвертировать дату для сравнения сейчас   -  person Muhammad Omer Aslam    schedule 26.03.2018


Ответы (1)


Вам необходимо использовать conditional validation в вашем случае используйте when и whenClient соответственно. См. ниже добавление в раздел правил и удаление любых других проверок. Это будет обрабатывать внешний и внутренний интерфейсы обеих проверок.

[ 'fine_amount' , 'required' , 'when' => function($model) {
        if ( $model->payment_date > $model->payment_expected_date ) {
            if ( $model->fine_amount <= 0 ) {
                return true;
            }
        }
        return false;
    } , 'whenClient' => 'function (attribute, value) {

    var d1 = new Date($("#' . Html::getInputId($this, 'payment_date') . '").val());
    var d2 = new Date($("#' . Html::getInputId($this, 'payment_expected_date'). '").val());
    if(d1>d2){
        if(value<=0){
            return true;
        }
    }
    return false;
}' , 'message' => 'Fine Amount Must be add.' ] ,

ИЗМЕНИТЬ

Заменил strtolower ( \yii\helpers\StringHelper::basename ( get_class ( $this ) ) ) на Html::getInputId, так как он больше подходит для этого случая.

person Muhammad Omer Aslam    schedule 26.03.2018
comment
как передать данные модели этой функции? - person Destroyer.0211; 26.03.2018
comment
какой when или whenCLient ? @Разрушитель.0211 - person Muhammad Omer Aslam; 26.03.2018
comment
посмотрите документацию здесь yiiframework.com/doc/guide /2.0/ru/ - person Muhammad Omer Aslam; 26.03.2018
comment
когда и когда CLient оба - person Destroyer.0211; 26.03.2018
comment
$model передается как параметр для when вы можете использовать его там, а в whenClient вы можете использовать $this @Destroyer.0211 - person Muhammad Omer Aslam; 26.03.2018
comment
['fine_amount','required', 'whenClient'=›function($model) { $payment_cr_date=date('Ymd',strtotime($model-›payment_date)); $payment_cr_expected_date=date('Ymd',strtotime($model-›payment_expected_date)); if ($payment_cr_date › $payment_cr_expected_date) { if($model-›fine_amount ‹= 0 || empty($model-›fine_amount)){ $model-›addError('fine_amount', 'Должна быть добавлена ​​сумма штрафа.') ; } } }], - person Destroyer.0211; 26.03.2018
comment
вам не нужно этого делать, я уже написал для вас валидацию, - person Muhammad Omer Aslam; 26.03.2018
comment
не делайте этого, просто используйте его как есть, вам не нужно конвертировать дату - person Muhammad Omer Aslam; 26.03.2018
comment
сообщение не отображается при этом, если я оставлю поле пустым, то покажу только сообщение - person Destroyer.0211; 26.03.2018
comment
я не могу понять, что вы говорите, сообщение будет отображаться для проверки интерфейса активной формы, и после отправки на стороне сервера я тоже проверил, и он работает нормально, вам не нужно добавлять какие-либо другие вещи или проверять. невозможно, чтобы сообщение не появилось, вы должны позвонить $model->validate() или $model->save(), и оно автоматически сработает - person Muhammad Omer Aslam; 26.03.2018
comment
теперь он не сохраняет, но нет, он не показывает никаких сообщений. - person Destroyer.0211; 26.03.2018
comment
@Destroyer.0211 Destroyer.0211 не сохраняется, потому что у вас неправильный формат, который вам нужен для форматирования дат, прежде чем вы вызовете сохранение не внутри проверки, а внутри действия контроллера. - person Muhammad Omer Aslam; 26.03.2018
comment
вы должны изучить документацию, чтобы узнать, как работать с моделями - person Muhammad Omer Aslam; 26.03.2018
comment
Извините, может быть, я не могу правильно описать вас. Я форматирую дату и сохраняю дату без моего формата проверки. Но когда я пытаюсь выполнить проверку, сообщение не отображается, и если я делаю $model->save(false), то оно сохраняется. - person Destroyer.0211; 26.03.2018
comment
@Destroyer.0211 добавьте код действия вашего контроллера, отредактировав свой вопрос, я посмотрю на него - person Muhammad Omer Aslam; 26.03.2018