2016-02-10 60 views
0

我在Yii2高級後端做了CRUD。我用類擴展ActiveRecord。而且我有一個密碼屬性的問題,當我想更新它時,顯示帶有許多點的散列密碼,當我嘗試更新它時不保存散列密碼。所以我用beforeSave散列我的密碼:在yii2後臺更新密碼

public function beforeSave($insert) 
{ 
    if (parent::beforeSave($insert)) { 
     if($this->isNewRecord) { 
      $this->created_at = time(); 
      $this->status = self::DEFAULT_STATUS; 
      $this->generateAuthKey(); 
      $this->setPassword($this->PasswordHash); 
      $this->RulesAccept=1; 
      return true; 
     } else { 
      $this->setPassword($this->PasswordHash); 
      return true; 
     } 
    } 
} 

我不知道我該怎麼做,當我顯示了更新的形式,它顯示我從哈希密碼點,如果不更改密碼,也不會改變。目前,每次單擊更新我的密碼已更改或重新哈希。我怎樣才能避免這一點。我試圖在形式上使用空值是這樣的:

<label class="control-label"> <?= Yii::t('app', 'Hasło')?> </label> 
<?= $form->field($model, 'PasswordHash')->passwordInput(['placeholder' => Yii::t('app', 'Utwórz hasło'), 'value' => ''])->label('') ?> 

然後我想在我的beforeSave檢查()輸入的形式是空的,則不會保存此密碼只是離開它,因爲它是在數據庫中:

public function beforeSave($insert) 
{ 
    if (parent::beforeSave($insert)) { 
     if($this->isNewRecord) { 
      $this->created_at = time(); 
      $this->status = self::DEFAULT_STATUS; 
      $this->generateAuthKey(); 
      $this->setPassword($this->PasswordHash); 
      $this->RulesAccept = 1; 
      return true; 
     } else { 
      if((!empty)$this->PasswordHash)){ 
       $this->setPassword($this->PasswordHash); 
       return true; 
      } 
      return false; 
     } 
    } 
} 

所以總是當我進入更新的形式,我看到空輸入密碼。如果我沒有寫新密碼,它只會改變我更改的所有屬性,但是如果我寫了一些密碼,它會爲我保存這個新密碼。我認爲這個功能應該工作,但我錯了,這種形式總是改變密碼。我能做些什麼來解決這個問題。也許還有其他的方式?

+0

它甚至可以顯示一個點從我的數據庫散列密碼,但是當我點擊更新它不應該覆蓋我的密碼,當我刪除此點並寫了新的密碼(6個字母),這應該保存我新的密碼,並可以再次顯示來自散列密碼的很多點。我能做些什麼來修復? – Informer

回答

0

可以使用$這 - > isAttributeChanged(「password_field」)

public function beforeSave($insert) 
{ 
    if (parent::beforeSave($insert)) { 
     if ($this->isAttributeChanged('PasswordHash')) { 
      $this->setPassword($this->PasswordHash); 
     } 
     return true; 
    } else { 
     return false; 
    } 
}