2013-04-09 164 views
1

我的表單驗證有一個奇怪的問題。我在表格中有4個輸入,他們都被驗證。cakephp中的表單驗證問題

一切正常,直到它驗證我的最後一個輸入字段是一個電子郵件輸入字段。我在電子郵件輸入字段中設置了兩個規則'rule' => 'notEmpty''rule' => 'email'。表單驗證併發布時很好,因爲它只需檢查notEmpty規則,但如果找到無效的電子郵件,它會驗證它,但即使在輸入有效的電子郵件後也不會發布。

這裏是一些假設:
一:所有輸入用戶輸入有效的條目
一切工作正常,表單職位和將數據添加到數據庫中。

二:爲所有,但email輸入用戶輸入有效的條目,但隨後進入在所有輸入
一個有效的電子郵件假設用戶點擊僅前三場
一切工作提供意見後提交在他們首先輸入一個有效的電子郵件地址後,表格帖子和數據被添加到數據庫中。

三:所有除了電子郵件用戶輸入有效條目(提供了一個無效的電子郵件)
它顯示錯誤消息,但即使提供了一個有效的電子郵件地址後,它不會做任何事情。我注意到,如果您不斷點擊提交按鈕,頁面會繼續使用相同的數據重新加載。
此外,該錯誤信息消失,如果提交按鈕的第一次點擊

這裏後,再次點擊是我的模型:

class Member extends AppModel 
{ 
    public $validate = array(
     'id' => array(
      'rule' => 'notEmpty' 
      ), 
     'Student_First_Name' => array(
      'rule' => 'notEmpty' 
      ), 
     'Student_Last_Name' => array(
      'rule' => 'notEmpty' 
      ), 
     'Student_Email' => array(
      'emailRule-1' => array(
       'rule' => 'notEmpty', 
       'last' => false 
       ), 
      'emailRule-2' => array(
       'rule' => 'email', 
       'message' => 'Please enter a valid email address.' 
      )) 
     ); 

} 

這裏是控制器:

class MembersController extends AppController 
{ 
    ... 
    public function add() 
    { 
     if($this->request->is('post')) 
     { 
      $this->Member->create(); 

      if($this->Member->save($this->request->data)) 
      { 
       $this->Session->setFlash('Member has been added!'); 
       $this->redirect(array('action' => 'members')); 
      } 
      else 
      { 
       $this->Session->setFlash('Unable to add member.'); 
      } 
     } 
    } 
    } 

對於這樣一個簡單/煩惱問題的長篇帖子,我表示歉意,但我討厭在我的應用程序/網站上有這樣的東西。

謝謝。

+0

你爲什麼使用''last'=> false'?對我來說沒有意義..如果一個人沒有輸入任何電子郵件,就沒有必要檢查一個有效的電子郵件形式...... – mark 2013-04-09 11:48:13

+0

是它的不必要的,我只是查閱文檔,並嘗試不同的東西。 – Archon 2013-04-09 12:04:29

回答

0

您的表單很可能是另一種形式的帖子:put。

快速的解釋是:

POST is simulated by FormHelper for 'create' form, or any post form that isn't modifying an existing record. 

PUT is for updating existing records. 

http://book.cakephp.org/2.0/en/core-libraries/helpers/form.html#FormHelper::create

你添加動作計爲 「創造」。順便說一句:蛋糕代碼表明它實際上應該是一個POST(見下面的評論)。因此,在代碼中的某處,您可以使幫助程序將其從POST更改爲PUT。也許你正在做一些非常規的事情。

提示:如果你想成爲安全起見,檢查兩個:

if ($this->request->is('post') || $this->request->is('put')) {} 

,以確保這兩種文章類型都有效。

也嘗試遵守慣例並使用lower_case_underscored字段名稱。最後但並非最不重要的是放棄「ID」驗證。驗證主鍵是毫無意義的。

+0

太棒了!那就是訣竅......我感覺很蠢。花了幾個小時。一般而言,對框架和Web開發不熟悉,我熟悉POST和GET請求。無論如何,真的很感謝幫助! – Archon 2013-04-09 12:07:16

+0

不正確。創建新記錄是POST,編輯記錄是PUT。它在[手冊](http://book.cakephp.org/2.0/en/core-libraries/helpers/form.html#FormHelper::create)中說明,並且由烘焙[template](https:// github.com/cakephp/cakephp/blob/master/lib/Cake/Console/Templates/default/actions/controller_actions.ctp#L54)代碼。 – ADmad 2013-04-09 13:05:14

+0

@Archon爲什麼你的id字段有一個notEmpty驗證?創建新記錄時它將爲空。 – ADmad 2013-04-09 13:08:07