Почему сохраняет неверные данные даже при ajaxValidationUrl?

У меня есть поле, которое валидируется через enableAjaxValidation. У формы стоит validationUrl, который возвращает ошибки. Всё работает. Однако, если проигнорировать все эти сообщения и нажать кнопку "submit", то данные все сохранятся, т.к. валидации в экшне сохранения уже нет. Как быть?

Мне нужно, чтобы даже при клике на submit провалидировались данные и только потом произошла отправка формы на сохранение


Экшн

public function actionUpdate(int $id) {
    $componentModel = Component::findOne(['id' => $id]);

    if ($componentModel->load(Yii::$app->request->post()) && $componentModel->save(false)) {
        return $this->redirect(['view', 'id' => $componentModel->id], 200);
    }

    $renderData = [
        'model' => $componentModel,            
    ];

    return Yii::$app->request->isAjax ? $this->renderAjax('update', $renderData) : $this->render('update', $renderData);  
}   

валидация

public function actionValidate(int $id) {
    $componentModel = Component::findOne(['id' => $id]);    
    $componentModel->attributes = Yii::$app->request->post()['Component'];    
    
    Yii::$app->response->format = Response::FORMAT_JSON;
    
    if (!$componentModel->validate())
        return ActiveForm::validate($componentModel);
    
    return [];
}

форма

<?php $form = ActiveForm::begin([
    'id' => 'component-form',
    'action' => Url::to(['/physical-node/update', 'id' => $componentModel->id]),
    'options' => [
        'data-pjax' => 1
    ],
    'validationUrl' => Url::to(['/physical-node/validate', 'id' => $componentModel->id]),
]); ?>


// ...
// ...
// ...
// ...

Ответы (1 шт):

Автор решения: UKRman

При субмите в екшене тоже делайте валидацию, почему вы ее отключили, можете добавить к форме атрибут validateOnSubmit в true. Но ваш екшен при субмите изменить нужно:

public function actionUpdate(int $id) {
    $componentModel = Component::findOne($id);

    if ($componentModel->load(Yii::$app->request->post()) && $componentModel->validate()) { // или $componentModel->save()
        $componentModel->save(false);

        return $this->redirect(['view', 'id' => $componentModel->id], 200);
    }

    $renderData = [
        'model' => $componentModel,            
    ];

    return Yii::$app->request->isAjax ? $this->renderAjax('update', $renderData) : $this->render('update', $renderData);  
}
→ Ссылка