@Barkasth

Не работает AJAX проверка на уникальность имени пользователя YII2. Подскажи что не так в коде?

Правила модели:
public function rules()
    {
        return [
            [['username', 'password_hash', 'status'], 'required'],
            ['username', 'unique'],
            ['password_hash', 'string', 'min' => 6, 'max' => 255],
            [['auth_key'], 'string', 'max' => 32],
            ['status', 'in','range' => [
                User::STATUS_ACTIVE,
                User::STATUS_NOT_ACTIVE,
            ]]
        ];
    }
}


действие контроллера
public function actionReg()
    {
        $model = new RegForm();
        
        if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
            Yii::$app->response->format = 'json';
            return \yii\widgets\ActiveForm::validate($model);
        }
        if($model->load(Yii::$app->request->post()) && $model->validate()){
            if($user = $model->reg()){
                if($user->status === User::STATUS_ACTIVE){
                    if(Yii::$app->getUser()->login($user)){
                        return $this->goHome();
                    }
                }
            }else{
                echo '<pre>';
                Yii::$app->session->setFlash('error','Возникла ошибка при регистрации');
                Yii::error('Возникла ошибка при регистрации');
                return $this->refresh();
            }
        }
        
        return $this->render('reg',
            ['model' => $model]
                );
    }


Вид:
<?php $form = ActiveForm::begin(['id' => 'registration-form',])?>

        <?= $form->field($model, 'username',['enableAjaxValidation' => true]) ?>

        <?= $form->field($model, 'password_hash')->passwordInput() ?>
    
        <?= $form->field($model, 'password_repeat')->passwordInput() ?>
    
        <?= $form->field($model, 'status')->hiddenInput()?>

        <div class="form-group">
            <div>
                <?= Html::submitButton('Зарегистрироваться', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?>
            </div>
        </div>

    <?php ActiveForm::end(); ?>
  • Вопрос задан
  • 670 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Barkasth Автор вопроса
не, не в том дело... это задаем только одному полю, а если добавить виджету - то всей, но так тоже не работает...
разобрался: ['username', 'unique'], - работает только c атрибутами ActiveRecord. А у меня class RegForm extends Model.
Поменял: ['username', 'ajaxValidate'],
public function ajaxValidate($attribute)
{
$user = User::findOne(['username' => $this->username]);
if($user){
$this->addError($attribute, 'Пользователь с таким логином существует');
}elseif (!preg_match('/\+\d{12,15}/', $this->username)) {
$this->addError($attribute, 'Введите свой номер телефона в формате +111111111111');
}
}
Ответ написан
Комментировать
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Что бы работала ajax валидация, надо включить ее при выводе виджета формы.

<?php 
$form = ActiveForm::begin([
'id' => 'registration-form',
'enableAjaxValidation' => true,
])
?>

Еще следует проверить url куда отправляется форма и возможно указать его в конфиге виджета явно. Добавлю, что можно указать не только урл отправки, но и урл для ajax валидации, они могут быть разными экшенами.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы