我在Yii2 Advanced-后端做了CRUD。我使用了类扩展ActiveRecord。我有一个密码属性的问题,当我想要更新它显示带有很多点的散列密码时,当我尝试更新它时不保存散列密码。所以我使用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 {
$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 :(得分:1)
你可以使用$ this-&gt; isAttributeChanged(&#39; password_field&#39;)
public function beforeSave($insert)
{
if (parent::beforeSave($insert)) {
if ($this->isAttributeChanged('PasswordHash')) {
$this->setPassword($this->PasswordHash);
}
return true;
} else {
return false;
}
}