服务器端的 yii2 条件验证
yii2 conditional validation on server side
我有一个表单,其中包含以下字段
i)Book
ii)Amount
控制器操作:
public function actionBook()
{
$model = new Book();
if ($model->load(Yii::$app->request->post()) && $model->validate()){
print_r($model);exit;
return $this->redirect('/Book');
}
$model->getBook();
return $this->render('BookForm', ['model' => $model]);
}
每当此页面加载时,我都会默认调用一个模型函数,该函数是 getBook()
型号:
public book;
public amount;
public showAmountField;
public function rules()
{
return [
[['book'], 'required'],
['amount', 'required', 'when' => function($model) {
return $model->showAmountField == true;
}],
];
}
public function getBook()
{
if(some condition here){
$this->showAmountField = true;
}
}
因此,只要 showAmountField 在需要金额字段时为真,否则就不需要,这里一切正常,客户端验证也正常,但是当我使用控制台更改金额字段 ID 时( f12) 当时服务器端验证不起作用,表单只是简单地提交,金额字段为空,所以这里出了什么问题。请任何人解释。
更新
查看
<?php
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
$this->params['breadcrumb'] = $model->breadCrumbs;
?>
<?php $form = ActiveForm::begin([
'id' => 'book-form',
'options' => ['class' => 'form-horizontal'],
]);
?>
<?= $form->field($model, 'book')->textInput()->label("Book"); ?>
<?php if($model->showAmountField): ?>
<?= $form->field($model, 'amount')->textInput()->label("Amount"); ?>
<?php endif; ?>
<?= $form->errorSummary($model, ['header' => '']); ?>
<?php ActiveForm::end(); ?>
验证发生在字段ID上,如果通过控制台更改它,模型不理解它需要验证
$model = new Book();
if ($model->load(Yii::$app->request->post()) && $model->validate()){
print_r($model);exit;
return $this->redirect('/Book');
}
$model->getBook();
这里你正在初始化 $model->getBook();在 if 块之后,模型在 post 请求中被新实例覆盖,因此服务器端验证在 when 条件下失败。
$model = new Book();
$model->getBook();
if ($model->load(Yii::$app->request->post()) && $model->validate()){
print_r($model);exit;
return $this->redirect('/Book');
}
它应该在 post 加载之前
我有一个表单,其中包含以下字段
i)Book ii)Amount
控制器操作:
public function actionBook()
{
$model = new Book();
if ($model->load(Yii::$app->request->post()) && $model->validate()){
print_r($model);exit;
return $this->redirect('/Book');
}
$model->getBook();
return $this->render('BookForm', ['model' => $model]);
}
每当此页面加载时,我都会默认调用一个模型函数,该函数是 getBook()
型号:
public book;
public amount;
public showAmountField;
public function rules()
{
return [
[['book'], 'required'],
['amount', 'required', 'when' => function($model) {
return $model->showAmountField == true;
}],
];
}
public function getBook()
{
if(some condition here){
$this->showAmountField = true;
}
}
因此,只要 showAmountField 在需要金额字段时为真,否则就不需要,这里一切正常,客户端验证也正常,但是当我使用控制台更改金额字段 ID 时( f12) 当时服务器端验证不起作用,表单只是简单地提交,金额字段为空,所以这里出了什么问题。请任何人解释。
更新
查看
<?php
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
$this->params['breadcrumb'] = $model->breadCrumbs;
?>
<?php $form = ActiveForm::begin([
'id' => 'book-form',
'options' => ['class' => 'form-horizontal'],
]);
?>
<?= $form->field($model, 'book')->textInput()->label("Book"); ?>
<?php if($model->showAmountField): ?>
<?= $form->field($model, 'amount')->textInput()->label("Amount"); ?>
<?php endif; ?>
<?= $form->errorSummary($model, ['header' => '']); ?>
<?php ActiveForm::end(); ?>
验证发生在字段ID上,如果通过控制台更改它,模型不理解它需要验证
$model = new Book();
if ($model->load(Yii::$app->request->post()) && $model->validate()){
print_r($model);exit;
return $this->redirect('/Book');
}
$model->getBook();
这里你正在初始化 $model->getBook();在 if 块之后,模型在 post 请求中被新实例覆盖,因此服务器端验证在 when 条件下失败。
$model = new Book();
$model->getBook();
if ($model->load(Yii::$app->request->post()) && $model->validate()){
print_r($model);exit;
return $this->redirect('/Book');
}
它应该在 post 加载之前