1

かなり典型的なドキュメントによる検証配列があり、それらのルールを保持し、8 つ以上の他のフィールドに特定の検証ルールを追加したいとします。

オリジナル$validate:

var $validate = array( 
    'name' => array( 
        'notEmpty'=> array( 
            'rule' => 'notEmpty', 
            'message' => 'Name can not be blank.' 
        ), 
        'allowedCharacters'=> array( 
            'rule' => '|^[a-zA-Z ]*$|', 
            'message' => 'Name can only be letters.' 
        ), 
        'minLength'=> array( 
            'rule' => array('minLength', 3), 
            'message' => 'Name must be at least 3 characters long.' 
        ), 
        'maxLength'=> array( 
            'rule' => array('maxLength', 255), 
            'message' => 'Name can not be longer that 255 characters.' 
        ) 
    ), 
    'email' => array( 
        'email' => array( 
            'rule' => 'email', 
            'message' => 'Please provide a valid email address.' 
        ), 
        'isUnique' => array( 
            'rule' => 'isUnique', 
            'message' => 'This E-mail used by another user.' 
        ) 
    )         
); 

次のルールを検証配列に追加できますが、8 回繰り返す必要はありません。

 ////fragment of array
    'field1' => array(
        'greaterThanField' => array(
            'rule' => array('greaterThanField', 'age'),
            'message' => 'This field cannot be greater than age'
        )
    )
////

 function greaterThanField( $field=array(), $compare_field=null ){ 
    foreach( $field as $key => $value ){ 
        $v1 = $value; 
        $v2 = $this->data[$this->name][ $compare_field ];                  
        if($v1 > $v2) { 
            return false; 
        } else { 
            continue; 
        } 
    } 
    return true; 
} 

これに、同じルールとメッセージを使用してすべて評価されるフィールド名の配列を追加したいと考えています。モデルに変数を作成してから beforeValidate 関数でコードを実行しようとしましたが、beforeValidate は compareFields 変数にアクセスできないようです

var $compareFields = array('field1', 'field2', 'field3', 'field4', 'field5', 'field6', 'field7', 'field8');

function beforeValidate(){
    foreach ($compareFields as $field) {
        $validate[$field] = array(
            'rule'=> array('greaterThanField', 'age' ),
            'message'=>'Cannot exceed delivery age',
        );
    }
}

これを達成する適切な方法は何ですか?

4

1 に答える 1