yii2服务器端的条件验证

时间:2017-06-13 10:23:48

标签: php validation yii2 yii2-advanced-app yii2-basic-app

我有一个表单,表单下面有字段

  

i)个预订   ⅱ)量

控制器操作:

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在需要amount字段时为true,否则不需要,这里一切正常,客户端验证工作正常,但是当我使用console更改amount字段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(); ?>

2 个答案:

答案 0 :(得分:2)

对字段ID进行验证,如果您通过控制台进行更改,则模型无法理解它需要验证

答案 1 :(得分:1)

$model = new Book();
if ($model->load(Yii::$app->request->post()) && $model->validate()){ 
    print_r($model);exit;
    return $this->redirect('/Book');
}
$model->getBook();

这里你初始化了$ model-&gt; getBook();在if块之后所以模型在post请求中被新实例覆盖,因此服务器端验证在条件时失败。

    $model = new Book();
    $model->getBook();
    if ($model->load(Yii::$app->request->post()) && $model->validate()){ 
        print_r($model);exit;
        return $this->redirect('/Book');
    }

应该在后加载

之前