Symfony: запретить сохранение поля формы - PullRequest
0 голосов
/ 10 августа 2011

У меня есть форма для изменения электронной почты, EmailChangeForm, которая расширяет форму охранного пользователя, sfGuardUserForm и использует два столбца: email_address и password.

Я хочу, чтобы форма проверяла,пароль правильный, и если да, измените адрес электронной почты на новый.

Моя проблема в том, что форма также сохраняет поле password в объекте пользователя.

Я знаю, что спароль проверен, его нельзя изменить в теории, но мне все еще не нравится, когда он повторно сохраняется с новым значением из формы, поэтому есть ли способ заставить форму сохранить только поле email_address?

Ответы [ 4 ]

2 голосов
/ 12 августа 2011

Я бы предложил такой скелет:

class emailForm extends sfFrom {
    public function configure(){
       $this->widgetSchema['email'] = new sfWidgetFormInputText();
       $this->widgetSchema['password'] = new sfWidgetFormInputPassword();
       $this->validatorSchema['password'] = new myValidatorPassword();
    }
}

class myValidatorPassword extends sfValidatorBase{
    protected function doClean($value)
    {
        $clean = (string) $value;

        // current user
        $sf_guard_user = sfContext::getInstance()->getUser()->getGuardUser();
        if($sf_guard_user)
        {
            // password is ok?
            if ($sf_guard_user->checkPassword($value))
            {
                return $clean;
            }
        }
        // Throw error
        throw new sfValidatorError($this, 'invalid', array('value' => $value)); 
    }
}

Таким образом, вы можете легко сохранить новый пароль в своем действии:

/***** snip *****/
if($this->form->isValid()){
    // set and save new password to current user
    $user = $this->getUser()->getGuardUser();
    $user->setPassword($formValues["password"]);
    $user->save();
/***** snip *****/

Конечно, это базовый подход, улучшения всегда приветствуются: -)

0 голосов
/ 11 августа 2011

Сначала убедитесь, что вы используете функцию useFields в своем классе EmailChangeForm.При этом вы можете определить, какие поля вы хотите редактировать с помощью вашей формы (это лучше, чем unset, потому что, если вы добавите больше полей, вам не придется беспокоиться о useFields).Пример:

$this->useFields(array( 
  'email'
));

НЕ ВКЛЮЧАЙТЕ ПАРОЛЬ!

Второе: в шаблон добавьте дополнительное поле ввода для пароля с такой же схемой имени (updatemail [пароль]).

Третье: в своем действии перед методом $form->isValid вы добавляете следующее:

$params = $request->getParameter($form->getName();
unset($params['password'];
$form->bind($params), $request->getFiles($form->getName()));
if($form->isValid()) {...}
0 голосов
/ 12 августа 2011

Я предполагаю, что в EmailChangeForm есть только одно поле, и что EmailChangeForm расширяет SfUserForm ...

Чтобы удалить все поля, кроме поля электронной почты, добавьте это в метод configure:

$ this-> useFields (массив ( 'электронная почта'));

0 голосов
/ 11 августа 2011

создайте новую форму (например, editUserForm), которая расширяет базовую форму, а затем сбросьте пароль с помощью этого кода

class editUserForm extend baseForm{
   public function configure(){
      unset($this['password']);
   }
 }

все вышеприведенное имя является примером, вы должны изменить его на свое имя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...