2011-06-09 53 views
0

我爲CakePHP使用了一個簡單的註冊表單。編輯表單中的CakePHP密碼驗證

這是我編輯觀點:

<h2>Add User</h2> 
<?php echo $form->create('User'); 
echo $form->input('first_name'); 
echo $form->input('last_name'); 
echo $form->input('email'); 
echo $form->input('address'); 
echo $form->input('phone'); 
echo $form->end('Edit');?> 

這些都是在我的user.php的驗證規則

class User extends AppModel { 

    var $name = 'User'; 
    var $validate = array(

     (... more rules here ...) 

     'password' => array('rule' => array('confirmPassword', 'password'), 
          'message' => 'Passwords do not match'), 
     'password_confirm' => array('rule' => 'alphanumeric', 
            'required' => true) 
    ); 

這是一個愚蠢的問題,但是當我使用的編輯形式,對節約數據失敗,因爲我需要在最後一條規則中輸入密碼。當然,該規則是爲註冊頁面添加的。

我發現了數十億種方法來繞過這個問題(禁用驗證保存,選擇要保存的字段,...),但我不知道什麼是「正確的」CakePHP的方式是?看起來像這樣一個簡單的問題,但我找不到任何關於如何以乾淨的方式完成的文檔。

爲了讓我的問題更清楚:我不希望編輯用戶頁面的密碼可以更改。

回答

1

刪除你的「需要」 =>真實的,它不是做你認爲它做。

'required'=> true表示該字段應存在於任何已保存的數據中。你沒有通過它。

+0

我想我混淆了notEmpty並且確實需要! – 2011-06-09 15:28:14

3

Cake方法是簡單地將驗證規則設置爲僅適用於create,允許您自由編輯數據而無需再次驗證字段。

var $validate = array(
    'fieldName' => array(
    'rule' => 'ruleName' 
    'required' => true, 
    'allowEmpty' => false, 
    'on' => 'create', // or update <-- here 
    'message' => 'Your Error Message' 
    ) 
); 

當然,如果你不想在這裏編輯密碼字段,只刪除相應的input

3

我使用多個驗證組:

在你的模型,或app_model,覆蓋與此只會驗證功能:

function validates($options = array()) { 
// copy the data over from a custom var, otherwise 
$actionSet = 'validate' . Inflector::camelize(Router::getParam('action')); 
if (isset($this->validationSet)) { 
    $temp = $this->validate; 
    $param = 'validate' . $this->validationSet; 
    $this->validate = $this->{$param}; 
} elseif (isset($this->{$actionSet})) { 
    $temp = $this->validate; 
    $param = $actionSet; 
    $this->validate = $this->{$param}; 
} 

$errors = $this->invalidFields($options); 

// copy it back 
if (isset($temp)) { 
    $this->validate = $temp; 
    unset($this->validationSet); 
} 

if (is_array($errors)) { 
    return count($errors) === 0; 
} 
return $errors; 

}

在你的控制器:

class UsersController extends AppController { 
    function forgot() { 
     $this->User->set($this->data); 
     $this->User->validationSet = 'forgotpassword'; 
     if ($this->User->validates()) { 
     // send email to reset password and show success message 
     } 
    } 
} 

最後回到你的模型中,構建一個驗證數組,你可以讓你的defau LT驗證陣列,然後添加一個附加陣列如

class User extends AppModel { 
    var $validate = array(...); 
    var $validateForgotpassword = array(...); 
} 

更多細節在這裏:

http://snook.ca/archives/cakephp/multiple_validation_sets_cakephp

(注意文章中的代碼示例中有一個錯誤,所以一定要改變$ param ='validate'。 $ validationSet;到$ param ='validate'。 $ this-> validationSet;)