Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] modyfikacja walidatora z poziomu szablonu
Forum PHP.pl > Forum > PHP > Frameworki
Foxx
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?

toffiak
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.
Foxx
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?
bela
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)
Foxx
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.
Crozin
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()));
Foxx
Dzięki.
Cysiaczek
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.
evertras
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.
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.