2014-02-08 35 views
0

我對名爲birthdate的字段使用了cakephp驗證。即使輸入錯誤,CakePHP日期驗證仍然保存並且沒有錯誤

我的模型是

'birthdate' => array(
    'rule'  => 'date', 
    'message' => 'Enter a valid date', 
    'allowEmpty' => true  
), 

我的問題是怎麼來的,它仍然正確保存,即使它是無效的輸入。例如:

1988年3月27日, 所以,如果我把它像這樣,數組導致這樣

//this will work 
'birthdate' => array(
    'month' => '3#', 
    'day' => '27', 
    'year' => '1988' 
) 

//this will NOT work 
'birthdate' => array(
    'month' => '#3', 
    'day' => '27', 
    'year' => '1988' 
) 

爲什麼第一個還在進行驗證(仍然正確保存如:最終結果仍然3月27日,1988)?但我想要保持一致。無論如何要報告錯誤?

+0

我們需要一些更多信息。請張貼表格/輸入。另外,請舉例說明應該和不應該通過驗證的內容。你的措詞「這將起作用」和「不起作用」並不是很有幫助。你的意思是工作在它節省了(這可能會或可能不會需要),或工作作爲驗證預期? – user1852176

回答

1

複雜數據類型解構

日期被傳遞作爲陣列,所以它們需要被格式化的第一到的字符串。如果數據庫中的列的類型爲date*,則會自動格式化該值,以使其適合正確的列類型格式。

最終,這是在Model::deconstruct()完成的,其中正通過sprintf()傳遞的單個值(它調用時Model::set(),其前驗證通常發生結束那裏):

$date[$index] = sprintf('%02d', $date[$index]); 

https://github.com/cakephp/cakephp/blob/2.4.5/lib/Cake/Model/Model.php#L1336

整數鑄造

而且這回答了你的第一個問題,那就是格式化指令,負責此行爲,它施放個別日期值整數,其中3#計算爲一個數字,而#3失敗(和00結束),這就是如何進行字符串轉換在PHP的作品。

http://php.net/manual/language.types.string.php#language.types.string.conversion

使用自定義的驗證/所以爲了能夠觸發這樣的輸入錯誤,你要麼必須使用custom validation rule格式化

,這將需要例如通過使用不同的字段名的數據,使得它沒有被在Model::set()格式化,或使用(由重寫Model::set()Model::deconstruct()例如)的方式,單獨的數值不被鑄造弄平復數值的自定義格式。