Вчера я опубликовал один вопрос о выборочной проверке для переключателя « Текстовое поле», обязательное по кнопке «Радио» . Я получил ответ. Но это был не точный ответ. Но он решил одну мою проблему.
На самом деле, у меня есть 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'); } }
Вы должны добавить '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() ?>