Yii2 валидация при обновлении формы

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
LLIAKAJI
Сообщения: 2
Зарегистрирован: 2019.12.03, 15:12

Yii2 валидация при обновлении формы

Сообщение LLIAKAJI » 2019.12.03, 15:20

Доброго времени суток, есть форма с данными, у ней имеются уникальные поля, даже если ничего не меняя в форме, ее сохранить все равно не получится, валидация не пропускает(ругается на уникальные поля)

//вид формы обновления

Код: Выделить всё

<?php
$form = ActiveForm::begin([
    'enableAjaxValidation' => true,
    'validationUrl' => \yii\helpers\Url::toRoute('post/validation'),
    ]
)
?>
<?=$form->field($post, 'login')?> // уникальный логин
<?=$form->field($post, 'name')?>
<?=$form->field($post, 'password')->passwordInput() ?>
<?=$form->field($post, 'email')->input('email')?> // уникальный емейл
<?=Html::submitButton('обновить', ['class'=>'btn btn-success'])?>
<?php
ActiveForm::end()
?>
//модель

Код: Выделить всё

class TestForm extends ActiveRecord
{
    public function rules(){ //правила валидации 
        return [
            ['login','unique','targetClass'=>'app\models\TestForm'],
            ['email','required'],
             ['email','unique','targetClass'=>'app\models\TestForm'],
            ];

    }
}
//контроллер

Код: Выделить всё

public function actionUpdate($id){
        $post = TestForm::findOne($id);
       if($post->load(Yii::$app->request->post()) && $post->save()){
        Yii::$app->getSession()->setFlash('message', 'Обновлено');
        return $this->redirect(['index','id'=>$post->id]);
       }else{
           return $this->render('update',compact('post'));

       }

    }

yiiliveext
Сообщения: 536
Зарегистрирован: 2019.08.13, 01:49

Re: Yii2 валидация при обновлении формы

Сообщение yiiliveext » 2019.12.04, 21:29

targetClass указывать не обязательно, если он совпадает с классом модели.
А так, при апдейте должно нормально отрабатывать. Покажите запрос на уникальность из дебагера и action валидации.
Скорее всего вы при апдейте валидируете как новую модель. Перенесите валидацию в основной экшн или передавайте айди и делайте $model->find().

Код: Выделить всё

public function actionUpdate($id){
        $post = TestForm::findOne($id);
        if (Yii::$app->request->isAjax && $post->load(Yii::$app->request->post())) {
            Yii::$app->response->format = Response::FORMAT_JSON;
            return ActiveForm::validate($post);
       }
       if($post->load(Yii::$app->request->post()) && $post->save()){
        Yii::$app->getSession()->setFlash('message', 'Обновлено');
        return $this->redirect(['index','id'=>$post->id]);
       }else{
           return $this->render('update',compact('post'));

       }

    }

Код: Выделить всё

<?php
$form = ActiveForm::begin([
    'enableAjaxValidation' => true,
    ]
)
?>
<?=$form->field($post, 'login')?> // уникальный логин
<?=$form->field($post, 'name')?>
<?=$form->field($post, 'password')->passwordInput() ?>
<?=$form->field($post, 'email')->input('email')?> // уникальный емейл
<?=Html::submitButton('обновить', ['class'=>'btn btn-success'])?>
<?php
ActiveForm::end()
?>

LLIAKAJI
Сообщения: 2
Зарегистрирован: 2019.12.03, 15:12

Re: Yii2 валидация при обновлении формы

Сообщение LLIAKAJI » 2019.12.05, 16:15

то что надо, ваш вариант работает 8-) )

Ответить