2013-03-26 5 views
2

Я использую sfDoctrineGuardPlugin. В форме изменения пароля есть три поля:Странное поведение смены формы пароля, то есть

текущий пароль, новый пароль, повторите новый пароль.

Если ток является правильным, и новый и повторите то же самое, я

$this->getUser()->getGuardUser()->setPassword($this->form->getValue('password')); 
$this->getUser()->getGuardUser()->save(); 

Во всех браузерах, кроме то есть все в порядке, но в то есть когда save() есть - или форма переаттестации, или перенаправлять на тот же маршрут.

В результате новая проверка текущего пароля со старыми данными (а затем с новым паролем) выдает ошибку формы. Скажите, что делать, я не понимаю, как браузер может влиять на действия сервера.

public function executeChangePassword(sfWebRequest $request) { 
     $this->forward404Unless($this->getUser()->isAuthenticated()); 
     $this->form = new ChangePasswordForm(); 
     $this->bSuccess = false; 

     if ($request->isMethod('post')) { 
      $this->form->bind($request->getParameter($this->form->getName())); 
      if ($this->form->isValid()) { 
       $this->oUser = $this->getUser(); 
       $this->oUser->setPassword($this->form->getValue('password')); 
       $this->bSuccess = true; 
      } 
     } 
} 
class ChangePasswordForm extends BaseForm { 
    public function configure() { 
     $this->setWidgets(array(
      'current_password' => new sfWidgetFormInputPassword(array(), array('class' => 'b-input-text')), 
      'password' => new sfWidgetFormInputPassword(array(), array('class' => 'b-input-text')), 
      'password_again' => new sfWidgetFormInputPassword(array(), array('class' => 'b-input-text')), 
     )); 

     $this->validatorSchema['current_password'] = new slValidatorUserPassword(
      array('required' => true, 
       'min_length' => 6, 
       'max_length' => 128 
      ) 
     ); 
     $this->validatorSchema['password'] = new sfValidatorString(
      array(
       'required' => true, 
       'min_length' => 6, 
       'max_length' => 128 
      ) 
     ); 
     $this->validatorSchema['password_again'] = new sfValidatorString(
      array('required' => true, 
       'min_length' => 6, 
       'max_length' => 128 
      ) 
     ); 
     $this-> mergePostValidator(new sfValidatorSchemaCompare('password', '==', 'password_again', array(), array())); 
     $this->widgetSchema->setNameFormat('change_password[%s]'); 
    } 
} 
+0

Вы используете встроенную в forgot_password систему или пользовательские один? Можем ли мы увидеть сгенерированную форму html & ваше действие для обработки формы? – j0k

+0

Добавлены действия. Да, пользовательское действие. ChangePasswordForm расширяет BaseForm. – Karmazzin

+0

Можете ли вы добавить класс ChangePasswordForm? – j0k

ответ

0

Вы можете просто использовать предоставленный sfGuardChangeUserPasswordForm класса. Он включен в плагин.

Вот рабочий пример контроллера:

public function executeIndex(sfWebRequest $request) 
{ 
    $sf_user = $this->getUser(); 
    $sf_guard_user = $sf_user->getGuardUser(); 
    $this->form = new sfGuardChangeUserPasswordForm($sf_guard_user); 

    if ("changepassword" == $request->getParameter('do')) 
    { /* dont forget to put action="/route/to/this/controler/?do=changepassword" on the view's <form> */ 
     $this->processForm($request, $this->form); 
    } 
} 

protected function processForm(sfWebRequest $request, sfForm $form) 
{ 
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName())); 
    if ($form->isValid()) 
    { 
     $notice = 'Password updated successfully.'; 

     try { 
      $sf_guard_user = $form->save(); 
     } catch (Doctrine_Validator_Exception $e) { 

      $errorStack = $form->getObject()->getErrorStack(); 

      $message = get_class($form->getObject()) . ' has ' . count($errorStack) . " field" . (count($errorStack) > 1 ? 's' : null) . " with validation errors: "; 
      foreach ($errorStack as $field => $errors) 
      { 
       $message .= "$field (" . implode(", ", $errors) . "), "; 
      } 
      $message = trim($message, ', '); 

      $this->getUser()->setFlash('error', $message); 
      return sfView::SUCCESS; 
     } 

     $this->dispatcher->notify(new sfEvent($this, 'admin.save_object', array('object' => $sf_guard_user))); 

     $this->getUser()->setFlash('notice', $notice); 

     $this->redirect(array('sf_route' => 'sf_guard_user_profile')); 
    } 
    else 
    { 
     $this->getUser()->setFlash('error', 'Password was not changed due to some errors.', false); 
    } 
}