0

我有一个表单来编辑存储在 mysql db 中的 UserProfile。其中包括以下自定义配置:

public function configure()
  {
    $this->widgetSchema['password']=new sfWidgetFormInputPassword();
    $this->validatorSchema['password']->setOption('required', false); // you don't need to specify a new password if you are editing a user.
  }

当用户尝试保存时,调用 executeUpdate 方法来提交更改。如果密码留空,密码字段设置为“”,但我希望它保留旧密码而不是覆盖它。

这样做的最佳方式(/最符合 symfony 精神)是什么?我的解决方案是覆盖模型上的 setter 方法(我已经为密码加密做过),并忽略空白值。

public function setPassword( $password )
{
  if ($password=='') return false; // if password is blank don't save it.
  return $this->_set('password', UserProfile ::encryptPassword( $password ));
}

它似乎像这样工作得很好,但是有更好的方法吗?

如果您想知道我无法在此项目中使用 sfDoctrineGuard,因为我正在处理旧数据库,并且无法更改架构。

4

1 回答 1

3

对我来说看起来不错:

public function setPassword($password)
{
  if (!$password) return false;
  return $this->_set('password', UserProfile::encryptPassword($password));
}

我有一些表单需要更新 sfGuardUser 密码以及与不同模型相关的其他表单字段,我最终得到了这样的结果:

$id = // sfGuardUser primary key
$values['password'] = // the form post value returned

if ($values['password']) {
  $user = Doctrine::getTable('sfGuardUser')->find($id);
  $user->setPassword($values['password']);
  $user->save();
}

...如果在表单中发布了一个值,则保存一个值。

于 2010-04-22T12:51:26.607 回答