2012-11-13 84 views
8

在創建和更新用戶時,我想在基於Yii的Web應用程序中設置密碼重複字段。創建時,我希望這兩個字段都是必需的,當更新時,用戶可以將這些字段留空(密碼將相同)或輸入新密碼並進行確認。我怎樣才能點出它?Yii密碼重複字段

+2

http://www.yiiframework.com/wiki/277/model-password-confirmation-field/ – Stu

回答

19

首先,你需要創建一個模型中的一個新的屬性(在這個例子中,我們把它叫做repeatpassword):

class MyModel extends CActiveRecord{ 
    public $repeatpassword; 
    ... 

接下來,你需要定義一個規則,以確保它符合現有的密碼屬性:

public function rules() { 
      return array(
       array('password', 'length', 'max'=>250), 
       array('repeatpassword', 'compare', 'compareAttribute'=>'password', 'message'=>"Passwords don't match"), 
       ... 
      ); 
    } 

現在,創建一個新的模型時,該模型將無法驗證,除非密碼和repeatpassword屬性相匹配。正如您所提到的,創建新記錄時沒有問題,但您不想驗證更新上匹配的密碼。爲了創建這個功能,我們可以使用model scenarios

我們簡單地改變repeatpassword規則從上面可以看出有一個額外的parmanter:

... 
array('repeatpassword', 'compare', 'compareAttribute'=>'password', 'message'=>"Passwords don't match",'on'=>'create'), 
... 

所有剩下現在要做的,就是聲明你的模型時在爲創建功能,使用方法:

$model = new MyModel('create'); 

,而不是正常的:

$model = new MyModel; 
+0

有關當前設置的一個疑問是,如果用戶在稍後嘗試更新密碼。但除此之外,看起來不錯。 – acorncom

+0

一般來說,如果用戶更新的話,你可能會要求用戶輸入兩次密碼。無論如何,我在場景中對此進行了解釋($ model = new MyModel('create');) –

+0

您可以使用sceario名稱作爲更新,每次Yii創建AR模型時都是默認值。所以你的模型成爲'$ model = new MyModel;' –