2012-01-03 67 views
0

我想驗證一個字段是否在依賴於另一個字段選擇的數字範圍內。在模型定製驗證規則中查找('第一')

例如。

'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

你不應該真的把數據分配給請求對象。將請求對象分配給另一個數組,例如$data,並在那裏進行更新或找到將範圍傳遞給驗證函數的方法。

此外,您的問題的查找語句將返回一個數組,而不是一個對象。所以你的語法在那裏是無效的。這可能是你原來的問題的原因。

像這樣的東西應該工作:

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; 
} 
+0

感謝,我會嘗試這一點,並報告 – khany 2012-01-07 20:37:09

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; 
}