Symfony 1.4 - Не сохраняйте пустой пароль в действии executeUpdate - PullRequest
0 голосов
/ 22 апреля 2010

У меня есть форма для редактирования UserProfile, которая хранится в MySQL DB. Который включает в себя следующую пользовательскую конфигурацию:

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) способ сделать это? Мое решение состояло в том, чтобы переопределить метод установки на модели (который я все равно сделал для шифрования пароля) и игнорировать пустые значения.

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

Кажется, что это нормально работает, но есть ли лучший способ?

Если вам интересно, я не могу использовать sfDoctrineGuard для этого проекта, так как имею дело с устаревшей базой данных и не могу изменить схему.

1 Ответ

3 голосов
/ 22 апреля 2010

Мне выглядит хорошо:

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();
}

... сохраняет значение, если значение было отправлено в форме.

...