Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] sfGuardPlugin i aktualizacja danych
Forum PHP.pl > Forum > PHP > Frameworki
uirapuru
Hej! To moje pierwsze podrygi z Symfony (v. 1.4.15), więc proszę o wyrozumiałość smile.gif



Funkcja jaką robię jest prosta; użytkownik po zalogowaniu (poprzez sfDoctrineGuardPlugin) ma mozliwosc zmiany swojego nazwiska, imienia, emaila lub hasła (dwa pole dla hasła). Pojawia się taki problem, że jeżeli chce zmienić nazwisko, imie lub email - wszystko jest ok, zapisuje się do bazy. Kiedy zmieniam hasło - również zapisuje się do bazy oraz wysyłany jest email z potwierdzeniem. Natomiast kiedy chce zmienic nazwisko, imię lub email ORAZ hasło, na tablicy z danymi uzytkownika nie dzieje sie nic poza updatem pola daty 'updated_at' natomiast hasło się zmienia i email z potwierdzeniem leci. Trochę już skołowany jestem, od czego tak może się dziać, może jakiś pomysł? smile.gif

Mam dwa formularze zmiany danych użytkownika, jeden jest 'embedded' w drugim:

  1. // formularz z danymi użytkownika
  2. class ChangeDataForm extends sfGuardUserAdminForm {
  3. public function configure() {
  4. if (($object = $this->getObject()->getChangeUserData()) == false) {
  5. $object = new ChangeUserData();
  6. $object->setSfGuardUserId($this->getObject()->getId());
  7. }
  8. $this->setValidators(array(
  9. 'id' => new sfValidatorPass(),
  10. 'first_name' => new sfValidatorString(array("required" => true, "min_length" => 2, "trim" => true)),
  11. 'last_name' => new sfValidatorString(array("required" => true, "min_length" => 2, "trim" => true)),
  12. 'email_address' => new sfValidatorEmail(array("required" => true, "min_length" => 2, "trim" => true))
  13. ));
  14. $this->embedForm('change_data', new ChangeUserDataForm($object, array('sf_guard_user' => $this->getObject())));
  15. $this->widgetSchema['change_data']->setLabel(false);
  16. }
  17. }
  18.  
  19. // formularz zmiany hasła
  20. class ChangeUserDataForm extends BaseChangeUserDataForm {
  21. public function configure() {
  22. $this->disableLocalCSRFProtection();
  23. $this->widgetSchema['password'] = new sfWidgetFormInputPassword(array('always_render_empty' => true), array('autocomplete' => 'off'));
  24. $this->widgetSchema['password_again'] = new sfWidgetFormInputPassword(array('always_render_empty' => true), array('autocomplete' => 'off'));
  25. $this->setValidators(array(
  26. 'password' => new sfValidatorString(array("required" => false, "min_length" => 8, "trim" => true)),
  27. 'password_again' => new sfValidatorString(array("required" => false, "min_length" => 8, "trim" => true)),
  28. ));
  29. $this->widgetSchema->moveField('password_again', 'after', 'password');
  30. $this->mergePostValidator(new sfValidatorSchemaCompare('password', sfValidatorSchemaCompare::EQUAL, 'password_again', array(), array('invalid' => 'The two passwords must be the same.')));
  31. }
  32. public function processValues($values) {
  33. $values = parent::processValues($values);
  34. if ($values['password'] != '') {
  35. $values['token'] = md5(time());
  36. $values['token_expire'] = date("Y-m-d H:i:s", strtotime('+ 24 hours'));
  37. $values['sf_guard_user_id'] = $this->getOption('sf_guard_user')->getId();
  38. }
  39. return $values;
  40. }
  41. public function save($con = null) {
  42. if ($this['password'] != null) {
  43. return parent::save($con);
  44. }
  45. }
  46. }


W widoku zamiast wyświetlać je jak leci, wyciągam tylko interesujące mnie widgety i je wyświetlam:

  1. <?php echo $change_data_form->renderHiddenFields(false); ?>
  2.  
  3. <?php
  4. $widgets = array(
  5. $change_data_form['first_name'],
  6. $change_data_form['last_name'],
  7. $change_data_form['email_address'],
  8. $change_data_form['change_data']['password'],
  9. $change_data_form['change_data']['password_again'],
  10. );
  11. ?>
  12. <?php foreach ($widgets as $widget): ?>
  13. <div class="sf_admin_form_row sf_admin_text sf_admin_form_field_external_id<?php echo $widget->hasError() ? ' error' : null; ?>">
  14. <?php echo $widget->renderLabel(); ?>
  15. <?php echo $widget->render(); ?>
  16. <?php echo $widget->renderError(); ?>
  17. </div>
  18. <?php endforeach; ?>


Z kolei akcja kontrolera wygląda w ten sposób:

  1. public function executeEditPrefs(sfWebRequest $request) {
  2. $this->change_data_form = new ChangeDataForm($this->getUser()->getGuardUser());
  3.  
  4. if ($request->isMethod('post') && $request->hasParameter($this->change_data_form->getName())) {
  5. $this->change_data_form->bind($request->getParameter($this->change_data_form->getName()));
  6. if ($this->change_data_form->isValid()) {
  7. $user = $this->change_data_form->save();
  8.  
  9. $params = $request->getParameter($this->change_data_form->getName());
  10. if ($params['change_data']['password'] != '') {
  11. $this->getMailer()->sendAdminPasswordChanged(sfConfig::get('app_email_service'), $user->getChangeUserData()->getToken(), $user->getChangeUserData()->getTokenExpire(), $this);
  12. }
  13. }
  14. }
  15. }
Valantir
Cytat
Natomiast kiedy chce zmienic nazwisko, imię lub email ORAZ hasło, na tablicy z danymi uzytkownika nie dzieje sie nic poza updatem pola daty 'updated_at' natomiast hasło się zmienia i email z potwierdzeniem leci.

Nie wiem czy dobrze rozumiem... Opisujesz dwie możliwości edycji:
1) nazwisko, imię, hasło
2) nazwisko, email, hasło
Dobrze rozumiem, bo trochę zagmatwałeś?tongue.gif Próbowałeś uruchomić w developerskim środowisku?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.