2013-02-11 26 views
4

我在寫一個頁面,我的用戶可以更改他們的帳戶電子郵件和密碼。這裏是控制器的動作和視圖:CakePHP需要兩個頁面加載來驗證表單

# UsersController.php 
public function edit() { 
    if($this->request->is('post')) { 
     if($this->User->save($this->request->data)) { 
      $this->Session->setFlash('Your account has been updated.'); 
      $this->redirect(array('action' => 'edit')); 
     } 

     $this->Session->setFlash('There was a problem saving your account settings. Please try again.'); 
    } 

    // Auto populate form fields 
    if(!$this->request->data) { 
     $this->request->data = $this->User->find('first', array(
      'conditions' => array('User.id' => $this->Auth->user('id')) 
     )); 
    } 
} 

# edit.ctp 
<?php echo $this->Form->create('User'); ?> 
<?php echo $this->Form->input('currentPassword', array('between' => 'You must enter your password in order to make changes', 'type' => 'password', 'value' => '', 'autocomplete' => 'off')); ?> 
<?php echo $this->Form->input('email'); ?> 
<?php echo $this->Form->input('password', array('type' => 'password', 'between' => 'Must be atleast 6 characters', 'value' => '', 'autocomplete' => 'off')); ?> 
<?php echo $this->Form->input('confirmPassword', array('type' => 'password', 'value' => '', 'autocomplete' => 'off')); ?> 
<?php echo $this->Form->end('Save changes'); ?> 

現在,我想讓用戶輸入他們的當前密碼以進行更改。爲了達到這個目的,我需要運行驗證檢查以確保他們在currentPassword中輸入的密碼與我在數據庫中的密碼匹配。一個在我User模型的驗證規則是這樣的:

'currentPassword' => array(
    'custom' => array(
     'rule' => 'validateCurrentPassword', 
     'message' => 'Incorrect password. Make sure you\'re using your current password.' 
    ) 
), 

和相關函數被調用:

public function validateCurrentPassword($data) { 
    debug($data); 
    return false; 
} 

到目前爲止好,但有一些很怪異的行爲。 Cake似乎只在兩次頁面加載後驗證此字段。例如,如果我輸入了錯誤的值並按下「保存更改」頁面刷新,但沒有驗證錯誤彈出。如果我輸入另一個錯誤的值,則會出現驗證錯誤。出於某種原因,我需要提交表單兩次以進行驗證。

任何人都可以解決這是爲什麼?

+0

這很奇怪。那麼,它是否在第一次提交表單時顯示「存在問題......」?您第一次保存時,是否在控制器中設置了變量validationErrors? DebugKit可能有助於調試。另外,你有沒有像beforeSave,afterSave等模型中的回調或控制器中的beforeFilter回調? – jimiyash 2013-02-12 03:41:14

回答

2

$this->request->is('post')false你第一次提交表格和true你第二次提交它。看看lib/Cake/Console/Templates/default/actions/controller_actions.ctp文件,你會看到,當你烤控制器動作,這是用於edit行動代碼:

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

如果使用上面的代碼,第一個表單提交將被處理(因爲$this->request->is('put')將是true)。

查看FormHelper類的create方法(位於lib/Cake/View/Helper/FormHelper.php)查看錶單何時被視爲PUT以及何時將其視爲POST。

+0

謝謝,我被絆倒了,因爲我認爲Cake會默認POST(就像它在'FormHelper.php'中說的那樣),我明確地在視圖中設置了方法,現在它工作正常。 – 2013-02-16 23:40:40

0

您可以使用ajax調用從數據庫獲取密碼。當用戶輸入密碼字段旁邊的字段時,在jquery或javascript中觸發一個事件,以檢查用戶輸入的密碼和從ajax響應中檢索的密碼是否相同,如果它們沒有給用戶提示或輸入正確密碼的消息,