Пользовательская проверка не работает – Yii2-app-basic-Yii2

Вчера я опубликовал один вопрос о выборочной проверке для переключателя « Текстовое поле», обязательное по кнопке «Радио» . Я получил ответ. Но это был не точный ответ. Но он решил одну мою проблему.

На самом деле, у меня есть 2 переключателя.

  • Индивидуальный
  • Фирма

Когда выбрана радиокамера с индивидуальным значением, текстовое поле CompanyName не должно быть обязательным. Но, когда выбрана функция Radio Button, имеющая значение «Фирма», текстовое поле CompanyName должно быть обязательным.

Теперь, что происходит, Когда я выбираю радиокнопку «Фирма» и не заполняю никакого значения для текстового поля CompanyName, данные не вставляются в таблицу базы данных. FINE. Это нормально. Но сообщение об ошибке не отображается в форме. Сообщение об ошибке должно отображаться в качестве поля «Имя_компонента».

Я не понимаю, где я ошибаюсь. Вот мой код View, Controller и Model. Пожалуйста помогите.

register.php (VIEW)

<?php use yii\helpers\Html; use yii\bootstrap\ActiveForm; use yii\captcha\Captcha; use yii\bootstrap\Modal; use yii\helpers\Url; ?> <?php $form = ActiveForm::begin(['id' => 'register-form']); ?> . . . <?= $form->field($model, 'AdminType') ->radioList(array('Individual'=>'An Individual', 'Firm'=>'Firm/Company')) ->label('Are You')?> <?= $form->field($model, 'CompanyName')->textInput()->label('Company Name')->error() ?> . . <?php ActiveForm::end(); ?> 

SiteController.php (CONTROLLER)

 <?php namespace app\controllers; use Yii; use yii\filters\AccessControl; use yii\web\Controller; use yii\filters\VerbFilter; use yii\swiftmailer\Mailer; use app\models\RegisterForm; public function actionRegister() { // Register Model $model = new RegisterForm(); if ($model->load(Yii::$app->request->post())) { $post = Yii::$app->request->post('RegisterForm'); if ($model->validate()) { } else { // HERE YOU CAN PRINT THE ERRORS OF MODEL echo "<pre>"; print_r($model->getErrors()); echo "</pre>"; } return $this->refresh(); } } 

RegisterForm.php (MODEL)

 <?php namespace app\models; use Yii; use yii\base\Model; use kartik\password\StrengthValidator; class RegisterForm extends Model { public $fname; public $lname; public $email; public $password; public $confirmPassword; public $AdminType; public $CompanyName; public $verifyCode; public function rules() { return [ [['fname','lname', 'email', 'password','confirmPassword','verifyCode','AdminType'], 'required'], ['email', 'email'], ['confirmPassword', 'compare', 'compareAttribute' => 'password'], ['verifyCode', 'captcha'], //add rule that uses the validator function ['AdminType','radioValidator'], ]; } //implement the validator public function radioValidator($attribute) { if($this->$attribute === 'Firm') return $this->addError('CompanyName', 'Company Name cannot be blank'); } } 

Solutions Collecting From Web of "Пользовательская проверка не работает – Yii2-app-basic-Yii2"

Вы должны добавить 'enableAjaxValidation' => true в ActiveForm .

После этого ваш код должен быть,

контроллер

 public function actionRegister() { $model = new RegisterForm(); if(Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) { \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; return \yii\widgets\ActiveForm::validate($model); } if ($model->load(Yii::$app->request->post())) { } else { // HERE YOU CAN PRINT THE ERRORS OF MODEL echo "<pre>"; print_r($model->getErrors()); echo "</pre>"; } return $this->refresh(); } 

Посмотреть

 <?php $form = ActiveForm::begin([ 'id' => 'register-form', 'enableAjaxValidation' => true, ]); ?> . . . <?= $form->field($model, 'AdminType') ->radioList(array('Individual'=>'An Individual', 'Firm'=>'Firm/Company')) ->label('Are You')?> <?= $form->field($model, 'CompanyName')->textInput()->label('Company Name')->error() ?> . . <?php ActiveForm::end(); ?> 

Это может вам помочь.

Атласт, я получил свой ответ

  //company_name ['company_name', 'required', 'when' => function($model){ return ($model->user_type == 'Firm' ? true : false); }, 'whenClient' => "function (attribute, value) { return $('input[type=\"radio\"][name=\"Users[user_type]\"]:checked').val() == 'Firm'; }"], 

@Nana Partykar

Поскольку вы спросили, как проверка ajax может быть отключена для captcha, я пробовал этот путь. Но я не уверен, что это правильный путь.

Я установил форму с этими настройками

 'enableAjaxValidation' => true, 'enableClientValidation' => false, 'validateOnSubmit' => false, 

и изменил проверку на действие на это (я удалил свой captcha в моем случае «verifyCode» из атрибутов, которые должны быть проверены.

 if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) { Yii::$app->response->format = 'json'; $validateAttributes = $model->activeAttributes(); $key = array_search('verifyCode', $validateAttributes); if ($key!==false) { array_splice($validateAttributes, $key, 1); } return \yii\widgets\ActiveForm::validate($model, $validateAttributes); } 

Фактически, ваш метод действий неверен. Когда вы вызываете refresh (), вы в основном перезагружаете страницу. Если модель не была обновлена ​​в базе данных, вы не увидите ничего особенного и никаких ошибок с момента перезагрузки новой модели.

Этот код будет отображать ошибку, как обычно, в вашем представлении:

  /** * @return \yii\web\Response */ public function actionRegister() { // Register Model $model = new RegisterForm(); if ($model->load(Yii::$app->request->post())) { $post = Yii::$app->request->post('RegisterForm'); if ($model->validate()) { // whatever } // return $this->refresh(); // do not refresh but... } // ... render the view with the current model, who's errors attribute is filled return $this->render('register', compact('model')); } 

NB: также вам не нужно вызывать ошибки () в вашем представлении, метод рендеринга ActiveFormField позаботится об этом для вас:

 <?= $form->field($model, 'CompanyName')->textInput()->label('Company Name') ?> 

достаточно

Если вы вызываете error без параметров, вы вызываете ошибку

Метод error ActiveField

юй \ Виджеты \ ActiveField

 public function error($options = []) { if ($options === false) { $this->parts['{error}'] = ''; return $this; } $options = array_merge($this->errorOptions, $options); $this->parts['{error}'] = Html::error($this->model, $this->attribute, $options); return $this; } 

Вам нужно удалить метод error звонка в VIEW

 <?= $form->field($model, 'CompanyName')->label('Company Name')->textInput() ?>