自定义验证不工作- Yii2-app-basic-Yii2
Custom Validation Not Working- Yii2-app-basic-Yii2
我昨天发布了一个关于单选按钮自定义验证的问题 。我得到了答案。但是,这不是确切的答案。但是,它解决了我的一个问题。
实际上,我有 2 个单选按钮。
- 个人
- 坚定
当具有 "Individual" 值的单选按钮被 select 编辑时,CompanyName 文本框不应是强制性的。但是,当具有 "Firm" 值的单选按钮被 select 编辑时,CompanyName 文本框应该是强制性的。
现在发生的事情是,当我 select 单选按钮 'Firm' 并且没有为 CompanyName 文本框填充任何值时,数据没有插入数据库 table。美好的。没关系。但是,错误消息没有以表格形式显示。 selecting 单选按钮固定后,应显示错误消息,因为 CompanyName 文本框是必需的。
我没明白我哪里做错了。这是我的视图、控制器和模型代码。请帮助我。
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');
}
}
您应该在 ActiveForm
中添加 'enableAjaxValidation' => true
。
执行此操作后,您的代码应该是,
控制器
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(); ?>
可能对你有帮助。
如果你在没有选项的情况下调用 error
,你会抑制错误输出
ActiveField error
方法
yii\widgets\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() ?>
@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);
}
其实你的操作方法不对。当您调用 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'));
}
注意:另外,您不必在视图中调用 errors(),ActiveFormField 呈现方法会为您处理:
<?= $form->field($model, 'CompanyName')->textInput()->label('Company Name') ?>
够了
终于找到答案了
//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';
}"],
我昨天发布了一个关于单选按钮自定义验证的问题
实际上,我有 2 个单选按钮。
- 个人
- 坚定
当具有 "Individual" 值的单选按钮被 select 编辑时,CompanyName 文本框不应是强制性的。但是,当具有 "Firm" 值的单选按钮被 select 编辑时,CompanyName 文本框应该是强制性的。
现在发生的事情是,当我 select 单选按钮 'Firm' 并且没有为 CompanyName 文本框填充任何值时,数据没有插入数据库 table。美好的。没关系。但是,错误消息没有以表格形式显示。 selecting 单选按钮固定后,应显示错误消息,因为 CompanyName 文本框是必需的。
我没明白我哪里做错了。这是我的视图、控制器和模型代码。请帮助我。
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');
}
}
您应该在 ActiveForm
中添加 'enableAjaxValidation' => true
。
执行此操作后,您的代码应该是,
控制器
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(); ?>
可能对你有帮助。
如果你在没有选项的情况下调用 error
,你会抑制错误输出
ActiveField error
方法
yii\widgets\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() ?>
@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);
}
其实你的操作方法不对。当您调用 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'));
}
注意:另外,您不必在视图中调用 errors(),ActiveFormField 呈现方法会为您处理:
<?= $form->field($model, 'CompanyName')->textInput()->label('Company Name') ?>
够了
终于找到答案了
//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';
}"],