【问题标题】:yii2 ajax validation does not show errorsyii2 ajax 验证不显示错误
【发布时间】:2021-03-04 17:15:29
【问题描述】:

我在一个小部件中有 ActiveForm,并且想要验证它的字段(获取 字段下的错误)而无需重新加载页面。但最好的 结果,我得到的是带有验证错误的json action.'ValidateOn..' - 似乎它们根本不起作用,我也尝试 捕捉'beforeValidate'回调,它也不起作用。我尝试了很多 变体,几乎决定这是不可能的。可能有人看到 我的主要错误,如果是这样,请帮助我。


表单视图
 <div class="feedback-form__wrap">
                        <?php $form = ActiveForm::begin([
                            'class' => 'feedback-form__form',
                            'id' => 'feedback-form',
                            'enableAjaxValidation' => true,
                            'enableClientValidation' => false,
                            'ajaxDataType' => 'json',
                            'validateOnChange' => true,
                            'validateOnType' => true,
                            'validateOnBlur' => true,
                            'validationUrl' => '/feedback/validate',
                        ]) ?>
                        <div class="custom-input-wrapper">
                            <?= Html::activeTextInput($feedbackForm, 'name', [
                                'class' => 'custom-input',
                                'required' => 'required',
                                'placeholder' => 'Имя',
                                'enableAjaxValidation' => true,
                            ]); ?>
                        </div>
                    ...   

控制器(反馈控制器)

 ` public function actionSubmit()
            {
                $feedbackForm = new FeedbackForm();
                if ($feedbackForm->load(Yii::$app->getRequest()->post())) {
                            $message = ['to' => self::FEEDBACK_TO,
                                'subject' => $feedbackForm->messageType . self::FEEDBACK_SUBJECT];
                            $mailer = Yii::$container->get(Mailer::class);
                            $viewData = [
                                'name' => $feedbackForm->name,
                                'surname' => $feedbackForm->surname,
                                'phone' => $feedbackForm->phone ?? "",
                                'email' => $feedbackForm->email,
                                'messageType' => $feedbackForm->messageType,
                                'messageText' => $feedbackForm->message
                            ];
                            $mailer->send($message, 'feedback/feedback-layout', $viewData);
        
                            $response = new Response();
                            $response->statusCode = 200;
                            $response->data = json_encode(["status" => "success"]);
                        }
                return $response ?? new Response();
            }
        
            /**
             * @return array
             */
            public function actionValidate()
            {
                $model = new FeedbackForm();
                if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
                    Yii::$app->response->format = Response::FORMAT_JSON;
                    return ActiveForm::validate($model);
                }
                return null;
            }
`
    

我的表单类(规则和方法)

     `
   `

 class FeedbackForm extends Model
        {
          
            public function rules(): array
            {
                return [
                    [['name','surname','email','message'],'required'],
                    [['phone','messageType'],'string'],
                    ['email', 'validateEmail'],
                ];
            }
        
            public function validateEmail(): void
            {
                if(!filter_var($this->email,FILTER_VALIDATE_EMAIL)){
                    $this->addError('email','Неверный формат почты');
                }
            }
        }
    `

P.S. I work with yii second day, so be condescending please :)

【问题讨论】:

    标签: php yii2 yii2-validation


    【解决方案1】:

    首先你应该把Html::activeTextInput改成$form-&gt;field($feedbackForm, 'name')-&gt;textInput模式

    由于$form-&gt;field 生成错误块、验证错误等等

    替换

    <?=
    $form->field($feedbackForm, 'name')->textInput([
        'class' => 'custom-input',
        'required' => 'required',
        'placeholder' => 'Имя',
    ]);
    ?>
    

    而不是

    <?=
    Html::activeTextInput($feedbackForm, 'name', [
        'class' => 'custom-input',
        'required' => 'required',
        'placeholder' => 'Имя',
        'enableAjaxValidation' => true,
    ]);
    ?>
    

    如果您的问题仍然存在,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      • 2020-12-09
      相关资源
      最近更新 更多