我想验证一个字段是否在一个数字范围内,这取决于另一个字段选择。
例如
'rating' => array(
'within class range' => array(
'rule' => 'withinClassRange',
'message' => 'number not in range'
)
),
和withinClassRange
public function withinClassRange($data) {
// get class range
$classRange = $this->Edition->Aclass->find('first', array('conditions' => array('Aclass.id' => $this->data['Edition']['aclass_id'])));
if($data['rating'] < $classRange->minRange) {
return false;
}
if($data['rating'] > $classRange->maxRange) {
return false;
}
return true;
}
但这个发现只能在控制器内完成。我该如何实现呢?
答案 0 :(得分:0)
我明白了!
我所做的是检索数据并在“保存”调用之前将范围限制设置为控制器中的请求对象中的额外变量。然后可以在模型中进行比较。。
//controller
$classRange = $this->Edition->Aclass->find('first', array('conditions' => array('Aclass.id' => $this->request->data['Edition']['aclass_id'])));
$this->request->data['Edition']['minRange'] = $classRange['Aclass']['minRange'];
$this->request->data['Edition']['maxRange'] = $classRange['Aclass']['maxRange'];
//model
public function withinClassRange($data) {
if($data['rating'] < $this->data['Edition']['minRange']) {
return false;
}
if($data['rating'] > $this->data['Edition']['maxRange']) {
return false;
}
return true;
}
答案 1 :(得分:0)
您不应该真正将数据分配给请求对象。将请求对象分配给另一个数组,例如$data
,然后在那里进行更新,或者找到将范围传递给验证函数的方法。
此外,您问题中的find语句将返回一个数组,而不是一个对象。所以你的语法在那里无效。这可能是你原来问题的原因。
这样的事情应该有效:
public function withinClassRange($data) {
// get class range
$classRange = $this->Edition->Aclass->find('first', array('conditions' => array('Aclass.id' => $this->data['Edition']['aclass_id'])));
if($data['rating'] > $classRange['Aclass']['minRange'] && $data['rating'] < $classRange['Aclass']['maxRange']) {
return true;
}
return false;
}