2011-10-13 61 views
0

我在提交模型中寫了一個自定義驗證方法,該方法基本上允許空白輸入字段,但是一旦某人輸入了某個內容,它就會驗證輸入的數據。CakePHP中的自定義驗證規則不能按預期工作

我提交模型內部驗證看起來是這樣的(所有其他的驗證規則,除了「說明」工作):

var $validate = array(
    'title' => array(
     'title' => array(
      'rule' => 'notEmpty', 
      'required' => true, 
      'allowEmpty' => false, 
      'message' => 'Please enter a title' 
     ), 
     'minLength' => array(
      'rule' => array('minLength', 5), 
      'message' => 'Please make your title longer' 
     ), 
     'maxLength' => array(
      'rule' => array('maxLength', 300), 
      'message' => 'Your title needs to be shorter' 
     ), 
    ), 
    'description' => array(
     'checkDescription' => array(
      'rule' => array('validateDescription'), 
      'message' => 'Description must be greater than 5 characters' 
     ), 
    ), 
    'source' => array(
     'source' => array(
      'rule' => 'notEmpty', 
      'required' => true, 
      'allowEmpty' => false, 
      'message' => 'Enter a valid source URL' 
     ), 
     'website' => array(
      'rule' => 'url', 
      'message' => 'Please enter a valid source URL' 
     ), 
    ) 
); 

我的方法,這也是我在提交模型(上面的代碼下文) :

public function validateDescription($data) { 
    if(empty($data['Submission']['description'])) 
     return true; 

    if((strlen($data['Submission']['description'])) <= 5) 
     return false; 
} 

我不知道爲什麼這根本不起作用。在我看來,我有這顯示錯誤:

if ($form->isFieldError('Submission.description')) 
    echo ($form->error('Submission.description', null, array('class' => 'error'))); 

我想這樣做的唯一原因,是因爲使用與required => false正常驗證,並用minLengthmaxLength驗證規則一起allowEmpty => true沒有表現出我的意圖。

任何幫助將不勝感激! :)

回答

1

傳入驗證方法的$data變量僅包含array($fieldname => $value)。對於長度爲5的字符串,您也不會返回true。您的方法應該如下所示:

public function validateDescription(array $data) { 
    $value = current($data); 
    return !$value || strlen($value) > 5; 
} 
+0

這樣做了。謝謝!如果我要爲此添加另一個驗證規則,那麼如何向$ validate屬性中的'description'數組發送定製'消息'?我正在考慮做3個條件,並且改變$ message ='需要大於5個字符'或$ message ='需要小於10k個字符'並返回。 –

+2

我要麼將它合併成一條消息(「需要在x和y之間」),要麼將其分別制定爲每條都有自己的消息的規則。 – deceze

+0

也注意到你錯過了關鍵的「last」=> true部分 – mark