1
假設我有一個相當典型的by-the-docs驗證數組,並且我想保留這些規則併爲其他8個字段添加特定的驗證規則。在CakePHP中結合驗證語法
原始$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',
);
}
}
什麼是實現這一目標的正確方法?
通常'beforeValidate'或'__construct'被用於這個目的 - 因此這個問題的答案很好。注意,雖然你覆蓋了字段'$ field'的所有驗證規則,最好寫成'$ validate [$ field] ['greaterThanField'] =',這樣如果你稍後添加其他規則,你不會把它們擦掉用這個邏輯。 – AD7six 2013-03-20 01:08:54
我將它從'$ compareFields'改爲'$ this-> compareFields'並開始工作。 – Damon 2013-03-20 15:24:08
這個問題並不清楚 - 你的代碼不工作:) – AD7six 2013-03-20 22:05:50