Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony] modyfikacja walidatora z poziomu szablonu
Foxx
post 14.03.2011, 16:10:18
Post #1





Grupa: Zarejestrowani
Postów: 896
Pomógł: 76
Dołączył: 15.11.2003
Skąd: Sosnowiec/Kraków

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


Symfony 1.4.

Formularz rejestracji zaczyna się od wyboru typu użytkownika. Domyślnie jest to firma i rejestracja składa się z pól login, hasło i nazwa firmy. Jeżeli zostanie wybrany typ "osoba prywatna" to pole "nazwa firmy" znika i pojawiają się pola "imię" i "nazwisko".

Dane firmy są połączone relacją z tabelą z użytkownikami więc do wyświetlenia takiego mieszanego formularza (login i hasło + nazwa firmy) używam merge obu formularzy. Każde z wymienionych pól jest obowiązkowe.

Mój problem polega na tym, że jeżeli zostanie wybrana "osoba prywatna" to mimo, ze pole "nazwa firmy" jest ukrywane za pomocą JS to walidacja nadal działa i domaga się wpisania czegoś w to niewidoczne pole.

1. Jedne co mi przychodzi do głowy to deaktywacja walidacji dla tego pola już w akcji wykonywanej po wysłaniu formularza, po bind() a przed if($this->form->isValid()). Jeżeli to jest prawidłowe podejście to w jaki sposób powinna wyglądać instrukcja dla przykładowego pola?

2. Czy jest jakaś bardziej elegancka metoda na zrobienie czegoś takiego?

Go to the top of the page
+Quote Post
toffiak
post 14.03.2011, 18:55:22
Post #2





Grupa: Zarejestrowani
Postów: 395
Pomógł: 80
Dołączył: 24.08.2009

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


Skoro dane firmy są w osobnej tabeli to przy wybranym typie "osoba prywatna" żadne dane/rekordy firmowe nie powinny być zapisywane a więc nazwa firmy nie musi być wymagana, podobnie jak imie i nazwisko, dzięki temu formularz przechodziłby walidację a następnie w metodzie doSave() formularza wystarczyłoby sprawdzić które pola zostały wybrane.

Czyli dla rejestracji osoby prywatnej wystarczyłoby wyczyścić zmienną łączącą formularze żeny nie tworzyć pustych rekordów a nastąpnie zapisać cały formularz a dla firmy tylko zapisać formularz, odpowiednie rekordy zostałyby dodane automatycznie.


--------------------
Go to the top of the page
+Quote Post
Foxx
post 14.03.2011, 18:59:59
Post #3





Grupa: Zarejestrowani
Postów: 896
Pomógł: 76
Dołączył: 15.11.2003
Skąd: Sosnowiec/Kraków

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


Ale zauważ, że w przypadku firmy muszę zlikwidować walidację imienia i nazwiska pozostawiając jednak resztę formularza użytkownika bo jest tam jego login i hasło. Zrobiłem to teraz za pomocą:

  1. public function executeRejestruj($request)
  2. {
  3. $this->form = new UzytkownikForm();
  4. $this->form->mergeForm(new FirmaForm());
  5.  
  6. # manipulacja walidacją
  7. $formularz = $request->getParameter('uzytkownik');
  8.  
  9. if($formularz['typ_id'] == 1) # firma
  10. {
  11. $this->form->getValidator('imie')->addOption('required', false);
  12. $this->form->getValidator('nazwisko')->addOption('required', false);
  13. }
  14. else # osoba
  15. {
  16. $this->form->getValidator('nazwa')->addOption('required', false);
  17. }
  18.  
  19. $this->form->bind($request->getParameter('uzytkownik'));


Czy to ujdzie?
Go to the top of the page
+Quote Post
bela
post 14.03.2011, 22:29:17
Post #4


Administrator PHPedia.pl


Grupa: Developerzy
Postów: 1 102
Pomógł: 2
Dołączył: 14.09.2003

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


To mówiąc szczerze mało eleganckie rozwiązanie. Myślałeś może o tym, żeby zrobić dwuetapowy formularz? (hasła: symfony multipage form, symfony form wizard)


--------------------
Go to the top of the page
+Quote Post
Foxx
post 14.03.2011, 22:52:04
Post #5





Grupa: Zarejestrowani
Postów: 896
Pomógł: 76
Dołączył: 15.11.2003
Skąd: Sosnowiec/Kraków

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


Dzielenie tak prostego formularza na dwa kroki nie będzie zbyt przyjemne dla użytkowników.
Popatrzę czym są multipage form i form wizard, dzięki.
Go to the top of the page
+Quote Post
Crozin
post 14.03.2011, 23:04:34
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Tak naprawdę to Ty tam masz dwa różne formularze, jeden dla firm, jeden dla osób prywatnych. Tak więc utwórz sobie dwa osobne formularze, ich część wspólną możesz wrzucić do jakiejś abstrakcyjnej klasy bazowej. Później to już jedynie:
  1. $form = $request->hasParameter('compay') ? new CompanyForm() : new IndividualForm();
  2. $form->bind($request->getParameter($form->getName()));
Go to the top of the page
+Quote Post
Foxx
post 14.03.2011, 23:47:34
Post #7





Grupa: Zarejestrowani
Postów: 896
Pomógł: 76
Dołączył: 15.11.2003
Skąd: Sosnowiec/Kraków

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


Dzięki.
Go to the top of the page
+Quote Post
Cysiaczek
post 15.03.2011, 08:20:38
Post #8





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Ja dość często nadpisuję metodę bind(), w której dokonuję modyfikacji walidatorów. Jeśli formularz posiada wiele różnych modyfikatorów walidacji to jest to dobra metoda.


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
evertras
post 27.03.2011, 12:23:27
Post #9





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 2.03.2011

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


Nadpisanie bind() jest chyba najlepszym rozwiązaniem w takim przypadku. Sprawdzisz sobie tylko typ wybranego konta i pozmieniasz opcje required w validatorach. Nie trzeba kombinować z dzieleniem formularza na dwuetapowe, a tym bardziej ustawianiem validacji w widoku.
Go to the top of the page
+Quote Post

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: 19.04.2024 - 12:35