2012-03-03 10 views
3

フォームには、start dateend dateの2つのフィールドがあります。 start dateが存在する場合にのみend dateを検証したいと思います。他のフィールドが存在する場合のみyiiの検証

レールには、:ifがあります。 yiiに類似したものはありますか?

+0

私はちょうどYiiでこの種の検証を完了しました。ここから参照することができます。 http://chevronscode.com/index.php/yii-model-rules-dynamic-required-if-extension.html – chen

+0

** Yii2 **では、['when'](http:// www。プロパティ。 –

答えて

11

検証用にカスタム関数を定義します。

ルールを定義します。

array('end_date','checkEndDate'); 

は、カスタム関数を定義します。

public function checkEndDate($attributes,$params) 
{ 
    if($this->start_date){ 
    if(!$this->validate_end_date($this->end_date)) 
     $this->addError('end_date','Error Message'); 
    } 
} 
0

あなたは、属性を個別を検証するためにvalidate()methodを使用することができますので、エラーがある場合は、最初start_dateを検証し、検証をスキップすることができますそのようなもの:

<?php 
// ... code ... 
// in your controller's actionCreate for the particular model 

// ... other code ... 

if(isset($_POST['SomeModel'])){ 
    $model->attributes=$_POST['SomeModel']; 
    if ($model->validate(array('start_date'))){ 
    // alright no errors with start_date, so continue validating others, and saving record 

     if ($model->validate(array('end_date'))){ 
     // assuming you have only two fields in the form, 
     // if not obviously you need to validate all the other fields, 
     // so just pass rest of the attribute list to validate() instead of only end_date 

       if($model->save(false)) // as validation is already done, no need to validate again while saving 
        $this->redirect(array('view','id'=>$model->id)); 
     } 
    } 
} 
// ... rest of code ... 
// incase you didn't know error information is stored in the model instance when we call validate, so when you render, the error info will be passed to the view 
0123このことができます

// in your model's rules, mark every validator rule that includes end_date as skipOnError, 
// so that if there is any error with start_date, validation for end_date will be skipped 
public function rules(){ 
    return array(
     array('start_date, end_date', 'required', 'skipOnError'=>true), 
     array('start_date, end_date', 'date', 'skipOnError'=>true), 
     // The following rule is used by search(). 
     // Please remove those attributes that should not be searched. 
     array('id, start_date, end_date', 'safe', 'on'=>'search'), 
    ); 
} 

希望:

はまた、あなたはまた、CValidator classskipOnError属性を使用することができます。
免責事項:skipOnErrorソリューションについてはわかりません。バリデータの順序によって影響を受ける可能性があります。まだテストしていないが、動作するかどうかを調べることができます。個々の検証ソリューションはもちろん、いつでも動作します。

+0

ご要望があれば教えてください。 –

1

怠け者のために、モデルのbeforeValidate方法に条件付きの検証を追加:

if($this->start_date){ 
    if(!$this->validate_end_date($this->end_date)) 
    $this->addError('end_date','Error Message'); 
} 
1

検証他に基づいて一つのフィールドのは、モデル規則の方法で行うことができます。 ここにルールメソッドがあります。

 ['start_date','required','when'=>function($model) { 
      return $model->end_date != ''; 
     }] 

私はこれがあなたに役立つことを願っています。

+1

注:上記の解決策は、Yii 2 –

関連する問題