2011-05-13 51 views
0

我已經在CakePHP書籍/ API和StackOverflow上搜索了網絡,但似乎無法找到答案。我遇到的問題是用戶爲我正在構建的應用創建。我在我的控制器中添加了一些操作的密碼驗證規則,這些規則工作得很好 - 沒有任何問題,甚至Auth組件也很開心。我創建了一個與我的數據模型完美配合的change_password動作(就像in - changes實際發生的那樣),但是沒有驗證應用於它,即使我將表單字段命名爲與add動作完全相同。許多操作的CakePHP驗證規則

多個操作可以不共享相同的驗證嗎?我是否需要在change_password動作中稍微重命名我的表單ID,然後創建新的驗證變量以匹配這些變量?這對我來說似乎效率很低,但如果我必須走下這條路,我會的。

非常感謝! John

編輯,現在添加代碼片段,因爲它看起來合適。

首先行動:

function change_password($id = null) { 
    if (!empty($this->data)) { 
     if (!empty($this->data['User']['passwd'])) { 
      $this->data['User']['password'] = $this->Auth->password($this->data['User']['passwd']); 
     } 
     if ($this->User->save($this->data)) { 
      $this->Session->setFlash('Password has been changed'); 
      $this->redirect(array('controller' => 'bookings', 'action' => 'index')); 
     } else { 
      $this->Session->setFlash('Password could not be changed'); 
     } 
    } 

現在,驗證規則(再次指出的是,這些工作完全爲我添加動作,他們只是無法在change_password):

var $validate = array(
    'first_name' => array(
     'notempty' => array('rule' => array('notempty')), 
    ), 
    'last_name' => array(
     'notempty' => array('rule' => array('notempty')), 
    ), 
    'email' => array(
     'email' => array('rule' => array('email')), 
    ), 
    'group_id' => array(
     'numeric' => array('rule' => array('numeric')), 
    ), 
    'active_user' => array(
     'boolean' => array('rule' => array('boolean')), 
    ), 
    'passwd' => array(
     'rule' => array('minLength', '6'), 
     'message' => 'Password should be at least 6 characters long', 
     'required' => true, 
     'allowEmpty' => false, 
     'on' => 'create' 
    ), 
    'passwd_confirm' => array(
     'rule' => 'matchpwd', 
     'message' => 'Confirm password doesnt match' 
    ), 
); 

    function matchpwd($data){ 
    if ($this->data['User']['passwd'] != $data['passwd_confirm']) { 
     return false; 
    } 
    return true; 
} 

最後,視圖(雖然我不認爲增加這個會有幫助,但我仍然會將它包括在內):

<div class="users form"> 
    <?php echo $form->create('User', array('action'=>'change_password'));?> 
<fieldset> 
    <legend><?php __('Change Password for "'.$User_to_change.'"');?></legend> 
<?php 
    echo $form->input('id'); 
    echo $form->input('passwd', array(
      'type' => 'password') 
     ); 
    echo $form->input('passwd_confirm', array(
      'type' => 'password') 
     ); 
?> 
</fieldset> 
    <?php echo $form->end('Submit');?> 
    </div> 

我在下面的答案中引用了驗證,似乎是「半路工作」。當我嘗試在「passwd」表單域中輸入密碼但將「passwd_confirm」留空時,控制器的保存操作失敗,並看到「密碼無法更改」的閃存信息。所以顯然它在我的驗證規則中運行matchpwd函數。但是,爲這兩個框輸入空白值會成功,因此就好像它失敗了其他驗證規則。

(請原諒我,如果代碼縮進沒有出現正常。正如你所看到的,我有點StackOverflow上的n00b的)

+0

糟糕!忘記說明我正在使用cakePHP版本1.3。如果它有幫助,我會提供代碼片段,但在這一點上,這更多的是一個理論問題:可以將驗證規則應用於多個操作? – SnoConeGod 2011-05-13 16:01:20

回答

0

蛋糕的驗證系統的一個很大的好處是,你只需要寫規則一次。在您的控制器正在加載模型定義時,默認情況下,規則將通過任何使用該模型的操作來應用。

我認爲最有可能發生的是你有required參數設置爲true。如果該字段爲空,則會導致驗證失敗。

+0

這不一定是發生了什麼事情。經過進一步的反思,似乎驗證在change_password的中途工作。它絕對要求我匹配密碼錶單域,但它會允許空白(這與我的驗證規則相反)。看到我上面編輯的帖子...也許是時候寫一些代碼片段了。 – SnoConeGod 2011-05-13 17:15:58

+0

當你說它允許空白時,你的意思是索引不存在於你傳遞的數據中,或者索引存在,但是該值設置爲空/空字符串? – Tyler 2011-05-13 17:25:17

+0

查看我上面的編輯。希望這會讓我們更多地瞭解這一點。我已經包含了動作片段,驗證和視圖。我從「添加」操作中盜取代碼以創建「change_password」。非常感謝你花時間陪伴! – SnoConeGod 2011-05-13 17:27:32

0

密碼會自動散列,因此您需要散列其他密碼字段以進行比較。我通常做一個beforeSave函數模型:

function beforeSave() { 
    if(!empty($this->data['User']['password2'])) { 
     $this->data['User']['password']=Security::hash($this->data['User']['password2'], null, true); 
    } 
    return true; 
} 

我使用這些驗證規則爲我的PW領域:

'password' => array(
     'notempty' => array(
      'rule' => array('notempty'), 
      'message' => 'Give a password.', 
     ), 
    ), 
    'password2' => array(
     'notempty' => array(
      'rule' => array('notempty'), 
      'message' => 'Give a password.', 
     ), 
    ), 
    'passwordn' => array(
     'notempty' => array(
      'rule' => array('notempty'), 
      'message' => 'Give a password.', 
     ), 
    ), 
    'current_password' => array(
     'notempty' => array(
      'rule' => array('notempty'), 
      'message' => 'Give a password.', 
     ), 
    ), 

密碼和密碼2註冊,passwordn密碼2和current_password都在PW改變形式。