Проверка Ajax на стороне сервера Yii2 внутри модального окна

В моем модальном поле я хочу проверить уникальный адрес электронной почты, что можно сделать только после отправки формы. Когда я нажимаю кнопку отправки, действие контроллера отправит меня для создания действия в контроллере, потому что оно вернет уникальную ошибку адреса электронной почты. Я хочу, чтобы эта ошибка отображалась в модальном окне. Поэтому я использовал представление Ajax. Вот мой код ниже.

Моя форма

<?php yii\widgets\Pjax::begin(['class' => 'new_projects']) ?>
<?php $form = ActiveForm::begin([
        'action' => ['create'],
        'options' => ['class' => 'form-horizontal disable-submit-buttons', 'id'=> 'projectsId'],
             'fieldConfig' => [
                    'template' => "<div class=\"row .field-register-email\">
                                        <div class=\"col-xs-6 .help-block\">{label}</div>\n<div class=\"col-xs-6 text-right\">{hint}</div>
                                    \n<div class=\"col-xs-12 \">{input}</div>
                                    </div>",
                              ],
        ]); ?>

 <?= $form->errorSummary($model, $options = ['header'=>'']); ?>

            <?= $form->field($model, 'user_fname')->textInput(['class'=>'form-control']);?>
            <?= $form->field($model, 'user_lname')->textInput(['class'=>'form-control']); ?>
            <?= $form->field($model,'user_email',['enableAjaxValidation'=> 'true'])->textInput(['class'=>'form-control']); ?>
            <?= $form->field($model, 'user_password_hash')->passwordInput([]); ?>
            <?= $form->field($model, 'user_password_hash_repeat')->passwordInput(['class'=>'form-control']); ?>
            <?php  $items = ArrayHelper::map(SimAuthAssignment::find()->all(),'item_name' ,'item_name');?>
            <?= $form->field($mode, 'item_name')->dropDownList($items,[]);?>




<div class="form-group">
    <?= Html::submitButton($model->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>

<?php ActiveForm::end(); ?>
<?php yii\widgets\Pjax::end() ?>

Действие создания моего контроллера

 public function actionCreate()
    {
       $model = new SimUser(['scenario' => SimUser::SCENARIO_CREATE]);
       $mode = new \app\modules\auth\models\SimAuthAssignment();

        if ($model->load(Yii::$app->request->post()) && $mode->load(Yii::$app->request->post())){ 
            \Yii::$app->response->format = Response::FORMAT_JSON;
            $model->setPassword($model->user_password_hash);
            $model->generateAuthKey(); 
            $model->company_id = Yii::$app->user->identity->company_id;
            if (!$model->save()){
                ($model->load(Yii::$app->request->post()) && $model->validate());
            }
            else{
            $auth = Yii::$app->authManager;
            $authorRole = $auth->getRole($mode->item_name);
            $auth->assign($authorRole, $model->getId());
             echo BaseJson::encode(array(
                "status"=>true,
                "message"=>"Created Project $model->name Successfully",
            ));
            }
        //    return $this->redirect(['index']);
        }  
            return $this->renderAjax('create', [
                'model' => $model,
                'mode' => $mode,
            ]);

    }

Js-файл

$(document).on("beforeSubmit", "#projectsId", function () {
    // submit form
    $.ajax({
        url    : $("#projectsId").attr('action'),
        type   : 'post',
        data   : $("#projectsId").serialize(),
        success: function(response)
        {
            alert("success");
            $.pjax.reload({container:"#projectsGrid"});
            $('#modal').modal("hide");
        },
        error  : function (response) 
        { 
            alert("failure");
            console.log('internal server error');
        }
        });
        return false;
        // Cancel form submitting.

});

Как я могу получить ошибки в моем модальном окне. Даже если есть ошибки, срабатывает предупреждение («успех»). Если нет уникального адреса электронной почты, он работает идеально. Я хочу выяснить, как сделать так, чтобы ошибка попала в модальное окно. Спасибо!!!


person Mohan Prasad    schedule 19.07.2016    source источник
comment
добавьте enableAjaxValidation = true в свою форму, например ‹?php $form = ActiveForm::begin([ 'enableAjaxValidation' =› true, ]); ?›   -  person vishuB    schedule 19.07.2016
comment
Я добавил это в поле электронной почты ... и до того, как я попробовал это ... не работает ...   -  person Mohan Prasad    schedule 19.07.2016
comment
добавить идентификатор формы, например <?php $form = ActiveForm::begin([ 'id' => 'xyz', ]); ?>, а также добавить идентификатор pjax, например <?php yii\widgets\Pjax::begin(['id' => 'xyz-pjas', 'class' => 'new_projects']) ?>   -  person vishuB    schedule 19.07.2016
comment
Тоже ничего не изменил..   -  person Mohan Prasad    schedule 19.07.2016


Ответы (1)


в вашем коде изменения контроллера, как показано ниже:

use yii\bootstrap\ActiveForm;

public function actionCreate()
    {
       $model = new SimUser(['scenario' => SimUser::SCENARIO_CREATE]);
       $mode = new \app\modules\auth\models\SimAuthAssignment();

        if ($model->load(Yii::$app->request->post()) && $mode->load(Yii::$app->request->post())){ 
            \Yii::$app->response->format = Response::FORMAT_JSON;
            $model->setPassword($model->user_password_hash);
            $model->generateAuthKey(); 
            $model->company_id = Yii::$app->user->identity->company_id;
            if ($model->validate()){
            $model->save();
            $auth = Yii::$app->authManager;
            $authorRole = $auth->getRole($mode->item_name);
            $auth->assign($authorRole, $model->getId());
             echo BaseJson::encode(array(
                "status"=>'true',
                "message"=>"Created Project $model->name Successfully",
            ));
            }
            else{

                $model=ActiveForm::validate($model);
                return['status'=>'false','errors'=>$model];

            }
        //    return $this->redirect(['index']);
        }  
            return $this->renderAjax('create', [
                'model' => $model,
                'mode' => $mode,
            ]);

    }

и ваш файл js добавляет скрипт проверки формы yii:

 $(document).on("beforeSubmit", "#projectsId", function (e) {
e.stopImmediatePropagation(); 
        // submit form
        $.ajax({
            url    : $("#projectsId").attr('action'),
            type   : 'post',
            data   : $("#projectsId").serialize(),
            success: function(response)
            {
               if(response.status=="true")
               {
                $.pjax.reload({container:"#projectsGrid"});
                $('#modal').modal("hide");
                }
                else
                {

                 $('#projectsId').yiiActiveForm('updateMessages', 
                       response.errors
                    , true);
                }
            }
            });
            return false;
            // Cancel form submitting.
    });

для получения дополнительной информации https://github.com/samdark/yii2-cookbook/blob/master/book/forms-activeform-js.md

person jithin    schedule 19.07.2016
comment
Я понятия не имею. Даже если есть ошибки, он выдает предупреждение: успех.... только если он вызывает ошибку, можно было бы отобразить ошибку.. - person Mohan Prasad; 19.07.2016
comment
В контроллере должна быть функция model-›validate(), которая будет отправлять сообщения об ошибках обратно в представление. но когда я их добавляю, код ломается. - person Mohan Prasad; 19.07.2016
comment
@MohanPrasad, только если он вызывает ошибку, можно было бы отобразить ошибку, нет, я добавил небольшие изменения в коде контроллера и файла js, пожалуйста, проверьте - person jithin; 19.07.2016
comment
если нет уникального адреса электронной почты, он отправляет форму и сразу же выдает сообщение об ошибке - person Mohan Prasad; 19.07.2016
comment
@MohanPrasad любое сообщение об ошибке отображается в вашем ответе ajax (response.error) - person jithin; 19.07.2016
comment
да, это отображается в этом .. но когда нет уникального адреса электронной почты, что происходит, я создаю пользователя, он возвращает true. Он должен скрыть модальное окно, но вместо этого он создал пользователя и сразу же снова запускает js и показывает сообщение об ошибке, что ваша электронная почта была принята? - person Mohan Prasad; 19.07.2016
comment
Давайте продолжим это обсуждение в чате. - person Mohan Prasad; 19.07.2016