Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Symfony] Problem z sfValidatorPropelUnique
blackroger
post 19.09.2009, 12:40:49
Post #1





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 8.11.2008

Ostrzeżenie: (0%)
-----


Witam. Mam problem dotyczący sfValidatorPropelUnique. Wszystko działa jak należy przy rejestracji tylko chcę go wykorzystać do zmiany danych użytkownika. Problem pojawia w momencie próby zmiany powiedzmy loginu który jest unikalny.
  1. $this->validatorSchema->setPostValidator(new sfValidatorAnd(array(
  2. new sfValidatorPropelUnique(
  3. array('model'=>'Uzytkownicy',
  4. 'column'=>'login'),
  5. array('invalid'=>'Podany login już istnieje'))
  6. ..........
  7. ....
  8. ...
  9. )));


Jak zrobić żeby ten walidator szukał unikalności tylko i wyłącznie dla wszystkich loginów różnych od loginu który jest aktualnie używany przez tego użytkownika. Powiedzmy że login jest Jasiu i użytkownik pozostawia przy zmianie login taki sam, to postwalidator poinformuje ze taki w bazie istnieje, a nie powinien. Natomiast jak użytkownik zmieni login z Jasiu na Janek, a taki login bedzie już przydzielony do innego id to ma poinformowac o zajętości. Wiem że można to zrobić poprzez bezpośrednie zapytania sqlowe i redukcją danego loginu ale chciałbym to zrobić za pomocą sfValidatorPropelUnique. CZy jest taka możliwość? A jeżeli nie ma to proszę o jak najlepsze rozwiązanie.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
yadue
post 21.09.2009, 19:18:04
Post #2





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 3.07.2009

Ostrzeżenie: (0%)
-----


Witam serdecznie,

mam także problem z sfValidatorPropelUnique:

kody:
  1. //rejestracja/actions.class.php
  2. <?php
  3.  
  4. /**
  5.  * rejestracja actions.
  6.  *
  7.  * @package sf_sandbox
  8.  * @subpackage rejestracja
  9.  * @author Your name here
  10.  * @version SVN: $Id: actions.class.php 12479 2008-10-31 10:54:40Z fabien $
  11.  */
  12. class rejestracjaActions extends sfActions
  13. {
  14. /**
  15.   * Executes index action
  16.   *
  17.   * @param sfRequest $request A request object
  18.   */
  19. public function executeIndex(sfWebRequest $request)
  20. {
  21. $formularz = new RegisterForm();
  22. if ($this->getRequest()->isMethod('post')) {
  23. $formularz->bind(array(
  24. 'login' => $this->getRequest()->getParameter('login'),
  25. 'haslo' => $this->getRequest()->getParameter('haslo'),
  26. 'powtorz' => $this->getRequest()->getParameter('powtorz'),
  27. 'imie' => $this->getRequest()->getParameter('imie'),
  28. 'nazwisko' => $this->getRequest()->getParameter('nazwisko'),
  29. 'miasto' => $this->getRequest()->getParameter('miasto'),
  30. 'mail' => $this->getRequest()->getParameter('mail')
  31. ));
  32.  
  33. if ($formularz->isValid()) {
  34. $dane = $this->formularz->getValues();
  35. $con = Propel::getConnection();
  36. try {
  37. $con->begin();
  38. $r = new Rejestracja();
  39. $r->setLogin($request->getParameter('login'));
  40. $r->setHaslo($request->getParameter('haslo'));
  41. $r->setMiasto($request->getParameter('miasto'));
  42. $r->setImie($request->getParameter('imie'));
  43. $r->setNazwisko($request->getParameter('nazwisko'));
  44. $r->setData(date("Y-m-d"));
  45. $r->setMail($request->getParameter('mail'));
  46. $r->save($con);
  47. $con->commit();
  48. return $this->forward("rejestracja/dziekujemy");
  49. } catch (Exception $e) {
  50. $con->rollback();
  51. return $this->forward("rejestracja/blad");
  52. }
  53. }
  54.  
  55. }
  56. $this->formularz = $formularz;
  57. }
  58. }
  59.  
  1. //rejestracja/lib/form/RegisterForm.php
  2. <?php
  3.  
  4. class RegisterForm extends sfForm {
  5. public function configure() {
  6. $this->setWidgets(array(
  7. 'login' => new sfWidgetFormInput(),
  8. 'haslo' => new sfWidgetFormInputPassword(),
  9. 'powtorz' => new sfWidgetFormInputPassword(),
  10. 'imie' => new sfWidgetFormInput(),
  11. 'nazwisko' => new sfWidgetFormInput(),
  12. 'miasto' => new sfWidgetFormInput(),
  13. 'mail' => new sfWidgetFormInput()
  14. ));
  15. $this->widgetSchema->setLabels(array(
  16. 'login' => 'Login:',
  17. 'haslo' => 'Hasło:',
  18. 'powtorz' => 'Powtórz hasło:',
  19. 'imie' => 'Imię:',
  20. 'nazwisko' => 'Nazwisko:',
  21. 'miasto' => 'Miasto:',
  22. 'mail' => 'E-mail:'
  23. ));
  24. $this->setValidators(
  25. 'login' => new sfValidatorPropelUnique(
  26. 'model' => 'Uzytkownicy',
  27. 'column' => 'login'),
  28. 'invalid' => 'Podany login już istnieje')),
  29. 'haslo' => new sfValidatorString(
  30. 'required' => true,
  31. 'min_length' => 4),
  32. 'invalid' => 'Hasło musi mieć minimum 4 znaki.')),
  33. 'imie' => new sfValidatorString(
  34. array('required' => false)),
  35. 'nazwisko' => new sfValidatorString(
  36. array('required' => false)),
  37. 'miasto' => new sfValidatorString(
  38. array('required' => false)),
  39. 'mail' => new sfValidatorAnd(
  40. new sfValidatorEmail(
  41. array('required' => true),
  42. array('invalid'=>'Zły adres E-Mail')),
  43. new sfValidatorPropelUnique(
  44. 'model' => 'Uzytkownicy',
  45. 'column' => 'login'),
  46. 'invalid' => 'Podany login już istnieje'))
  47. )),
  48.  
  49. ));
  50. $this->validatorSchema->setPostValidator(
  51. new sfValidatorSchemaCompare('haslo', '==', 'powtorz'));
  52. }
  53. }
  54.  
  55. ?>


Komunikat błędu:
You must pass an array parameter to the clean() method (this validator can only be used as a post validator).

Błąd dotyczy dokładnie lini 26 oraz 49. Bez nich względnie działa wszystko poprawnie, tzn nie ma błędu. Niestety nie mogę sobie poradzić z tym problemem. Jestem początkującym w Symfony (co w ogóle mnie oczywiście nie usprawiedliwia) i niestety nie mogę znaleźć rozwiązania tego problemu. Kod żywcem przepisany z książki niejakiego Pana Karola Przytalskiego, Symfony Aplikacje internetowe. Z góry dziękuję za pomoc i pozdrawiam
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 19:36