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

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

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

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

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

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

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

register.php (ПОСМОТРЕТЬ)

<?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 (Контроллер)

<?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 (МОДЕЛЬ)

<?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');
}
}

3

Решение

Вы должны добавить '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(); ?>

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

1

Другие решения

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

     //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';
}"],
1

@Nana Partykar

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

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

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

и изменил валидацию действия на это (я удалил мою капчу в моем случае ‘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);
}
0

На самом деле, ваш метод действий неверен. Когда вы вызываете 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: также вам не нужно вызывать error () в вашем представлении, метод рендеринга ActiveFormField позаботится об этом за вас:

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

достаточно

0

Если вы позвоните error без опций вы подавляете вывод ошибок

ActiveField error метод

юй \ Виджеты \ 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 метод в вид

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