[Symfony] modyfikacja walidatora z poziomu szablonu |
[Symfony] modyfikacja walidatora z poziomu szablonu |
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? |
|
|
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. -------------------- |
|
|
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ą:
Czy to ujdzie? |
|
|
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)
-------------------- |
|
|
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. |
|
|
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:
|
|
|
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.
|
|
|
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. |
|
|
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.
|
|
|
Wersja Lo-Fi | Aktualny czas: 19.04.2024 - 12:35 |