簡體   English   中英

yii2服務器端的條件驗證

[英]yii2 conditional validation on server side

我有一種形式,該形式具有以下字段

i)賬簿ii)金額

控制器動作:

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為true時,金額字段都是必需的,否則它將不是必需的,這里的一切工作正常,客戶端驗證也正常,但是當我當時使用console(f12)更改金額字段ID時服務器端驗證不起作用,並且表單只是提交,而value字段為空,所以這里有什么問題。 請向任何人解釋。

UPDATE

視圖

<?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塊之后,因此該模型在新實例的后期請求中被覆蓋,因此服務器端驗證在when條件下失敗。

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

應該在加載后

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM