Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skomplikowana obsługa błędów w formularzu itd.
Forum PHP.pl > Forum > PHP
Vengeance
Witajcie.

Często zdaża się, iż aby uzyskać maksymalnie "user-friendly" interfejs robimy coś takiego:

Użytkownik wypełnia dane w formularzu i go wysyła.
Jeśli wystąpią jakieś błędy, nad formularzem zostaje wyświetlony odpowiedni
komunikat, lecz wszelkie wprowadzone przez usera dane pozostają wpisane w
pola formularza.

Jak Wy rozwiązujecie tego typy problem? Wspomne tylko, iż chodzi mi
o rozwiązania obiektowe i maksymalnie elastyczne... bo na if-ach to nie problem
coś takiego zrobić "by tylko działało".

Może posiadacie jakieś gotowe klasy / biblioteki?
Pozdrawiam.
wolguy
Mi się wydaje, że to jest najlepszy sposób, bo nawet Allegro.pl z niego korzysta (np. próba nieudanego logowania).
Vengeance
Że najlepszy to wiem :] Pytanie jak to szybko i łatwo implementować
bez 1000 zbędnych instrukcji warunkowych itd. :]
Major
A pokiego diobła instrukcje warunkowe?
<input type="text" name="username" value="$_POST['username']">

Czy Wy musicie do najmniejszego bzdetu tworzy klase?
wolguy
nie wiem już o co chodzi... to jest taka operacja że samo z siebie jest szybkie i łatwe biggrin.gif
serafin
Veng: Mozesz kazdy formularz reprezentowac za pomoca obiektu typu formInput itd. Wtedy kiedy istnieja dane z _POST automatycznie formularz jest wypelniany. Mozesz tworzyc te obiekty np w taki sposob:

$nazwisko = new formInput('username', array(NON_EMPTY));

Mozesz wtedy w jakims obiekcie reprezentujacym formularz zbierac dane o wymaganych przez form danych i walidowac je. W przypadku gdy walidator nie zwroci bledu wykonujesz operacje, inaczej wyswietlasz bledy a formularz jest wypelniany przez dane z _POST.

/ Sorry ze pisze tak niejasno ale malo spalem i nie chce mi sie myslec nad skladnia zdan tongue.gif
Vengeance
@Major: Gdy pisz się coś, co musisz powtarzać na kazdym kroku (przy wszystkich formularzach) to co widzisz złego w napisaniu klas?

Cytat
A pokiego diobła instrukcje warunkowe?
<input type="text" name="username" value="$_POST['username']">


Napisalem chyba jasno, iż najpierw ma pokazywać dane np. danego newsa, a potem pamiętać cały czas co user zmienił... np. gdyby w razie błędy konieczne było poprawnienie jednego pola forumularza.

Cytat
nie wiem już o co chodzi... to jest taka operacja że samo z siebie jest szybkie i łatwe

Owszem jest... ale w rpzypadku prostych skryptów! Gdy w gre wchodzi cały framework, obługa akcji/widoków, różne wersje językowe wyświetlanych komuniaktów ITD. takie "proste" rzeczy stają się coraz bardziej skompikowane.

Tworzenie odpowiednich klas / bibliotek ma nam oszczędzić czas i ułatwić takie operacje.
Major
Cytat
@Major: Gdy pisz się coś, co musisz powtarzać na kazdym kroku (przy wszystkich formularzach) to co widzisz złego w napisaniu klas?

Pomyślimy klasa zajmie moze 50lini maks, obiekt zajmie miejsce. Nie lepiej 'włozyc' to do istniejącej klasy ktora zajmuje sie generowaniem wszystkich formularzy?

Cytat
Napisalem chyba jasno, iż najpierw ma pokazywać dane np. danego newsa, a potem pamiętać cały czas co user zmienił... np. gdyby w razie błędy konieczne było poprawnienie jednego pola forumularza.

$username = !$_POST['username'] ? $row['username'] : $_POST['username'];
....
Cytat
takie "proste" rzeczy stają się coraz bardziej skompikowane.

Nie prawda jeśli ma sie dobrze zaprojektowaną klase, to mozna takie coś z łatwością 'wsadzic' bez zajmowania miejsca kolejnym obiektem...
Cytat
Tworzenie odpowiednich klas / bibliotek ma nam oszczędzić czas i ułatwić takie operacje.

Ja jednak wole dłuzej posiedziec, ale by skrypt sie szybko wykonywał.
Vengeance
Cytat
Pomyślimy klasa zajmie moze 50lini maks, obiekt zajmie miejsce. Nie lepiej 'włozyc' to do istniejącej klasy ktora zajmuje sie generowaniem wszystkich formularzy?

A czy napisałem gdzieś, że takową klasę mam?!

Cytat
$username = !$_POST['username'] ? $row['username'] : $_POST['username'];

Tak, znam to i stosuje... ale jak powiedziałem wcześniej nie chodzi tu tylko o sprawdzenie czy dane zostały nadesłane!

Cytat
Nie prawda jeśli ma sie dobrze zaprojektowaną klase, to mozna takie coś z łatwością 'wsadzic' bez zajmowania miejsca kolejnym obiektem...

Przed chwilą byłeś jeszcze wielkim przeciwnikiem klas a teraz mówisz o "dobrze zaprojektowanych klasach". Chwila, chwila, może czas na zdecydowanie? Pisząc swoją wypowiedź miałem na myśli proste Skrypty w któych nie ma mowy o klasach czy obiektach (tak tak, nawet napisalem wyraz skrypty wielkimi literami, ale widocznie nie zauważyłeś)

Cytat
Ja jednak wole dłuzej posiedziec, ale by skrypt sie szybko wykonywał.

A ja wole dłużej posiedzieć, abym mógł w przyszłości napisać 10 formularzy w czasie w którym ty napiszesz 2.
A twierdzenie że jedna klasa więcej zwiększa drastycznie czas wykonywania jest mylne!

ps. Chłopaki, skończcie wreszcie po części ten OffTop...

@serafin: Dzięki za pierwszą rzeczową odpowiedź
Major
Cytat
A czy napisałem gdzieś, że takową klasę mam?!

Nie no załamałeś mnie, ja tu siedze w przekonaniu że macie do wszystkiego klase :F
Cytat
Przed chwilą byłeś jeszcze wielkim przeciwnikiem klas a teraz mówisz o "dobrze zaprojektowanych klasach"

Jestem przeciwnikiem tworzeniu wielu nie potrzebnych klas, jeżeli klasa jest dobrze zrobiona. To nei będzie trza dopisywać różnych pobocznych klas.
Powiedz po co mi czemu tworzyć 10 klas, jak wszystko może być w jednej połączone i spójnie działające?
Cytat
(tak tak, nawet napisalem wyraz skrypty wielkimi literami, ale widocznie nie zauważyłeś)

Chyba Ty zapomniałeś napisać tongue.gif
Cytat
A ja wole dłużej posiedzieć, abym mógł w przyszłości napisać 10 formularzy w czasie w którym ty napiszesz 2.

Czemu dwie, taki bzdet umnie jest zawarty w klasie MultiText manipulująca wszystkimi tekstami w systemie(generowanie/wyswietlanie/dodawanie/update)
Cytat
A twierdzenie że jedna klasa więcej zwiększa drastycznie czas wykonywania jest mylne!

Czy ja to powiedziałem?
FiDO
Cytat
A po kiego diobła instrukcje warunkowe?
<input type="text" name="username" value="$_POST['username']">

Czy Wy musicie do najmniejszego bzdetu tworzy klase?

To nie jest najmniejszy bzdet wg mnie, tylko calkiem ambitne zadanie, zeby zrobic to naprawde dobrze i moc pozniej bardzo szybko stworzyc dowolny formularz z walidacja kazdego pola i wyswietlaniem bledow o jakim pisal Vengeance


Ja poki co mam tylko zalazek takiego systemu walidacji, ale ostatnio nie ma czasu na jego rozwijanie... W kazdym razie wyglada to mniej wiecej tak, ze mam klase abstrakcyjna, ktora ma troche predefiniowanych popularnych metod walidacji (sprawdzanie czy niepusty, dlugosc wieksza/mniejsza/rowna danej liczbie, dozwolone znaki, dopasowanie do regexpa itp) i zawarta w sobie obsluge owej walidacji. Gdy tworze formularz to robie klase dziedziczaca po niej. Jesli korzystamy tylko z predefiniowanych sposobow walidacji to napisanie tego to jest chwilka, a klasa zajmuje kilka(nascie) linijek w zaleznosci od ilosci pol.. mozna tez zdefiniowac zewnetrzna metode walidacji, np. jesli trzeba sprawdzic cos w bazie itp. . Do obiektu tej klasy przekazuje pola z formularza.
Jesli walidacja sie nie powiedzie to zapisuje sobie do sesji (dane te "zyja" w sesji jescze tylko przez kolejnego requesta a potem sa usuwane) stan formularza pobrany z tego obiektu (lacznie z informacja o tym, ktore pola zostaly blednie wypelnione) i wracam do strony z formularzem (redirect), gdzie przy wyswietlaniu sa odczytywane te dane z sesji (nie musze pisac tego odczytu osobno dla kazdego formularza) i wyswietlany formularz z odpowiednimi komunikatami.
Zrobilem to kiedys na szybko jak juz "znudzila" mi sie tradycyjna metoda klepania wszystkiego od nowa za kazdym razem, ale to jeszcze wymaga wielu usprawnien, zanim bede z tego zadowolony smile.gif
Vengeance
Cytat
Jestem przeciwnikiem tworzeniu wielu nie potrzebnych klas, jeżeli klasa jest dobrze zrobiona. To nei będzie trza dopisywać różnych pobocznych klas.
Powiedz po co mi czemu tworzyć 10 klas, jak wszystko może być w jednej połączone i spójnie działające?


I tym uświadamiasz nam wszystkim, że piszesz wyłącznie Klasy i korzystasz z obiektów... To nie równa się pisaniu Obiektowego kodu!

Gdybyś chciał wiedzieć, zadaniem OOP jest właśnie rozbicie wszystkiego na małe, niepodzielne zadania. Zadania te mają spełniać poszczególne klasy tak by kod był możliwy do łatwej edycji czy też wykorzystania w innych projektach!

Pisanie wszystkiego w jednej klasie jest największą głupotą jaka może być wg mnie!


Wiele osób korzysta właśnie z gotowych bibliotek czy własnych klas do Walidacji, Systemu Szablonów, Genrowania Formularzy (w tym wielostronicowych). Zadaniem tego wątku miało być wspólne obmyślenie optymalnej metody połączenia wszystkich tych zadań. Jeśli więc nadal nie masz nic sensowengo do powiedzenia w temacie, prosze pozostań obserwatorem.
serafin
Veng: u mnie zajmuje sie tym validationService, dziala prawie tak jak opisal to Fido, jednakze z kilkoma roznicami...

W akcji ktora wyswietla formularz tworze instancje validationService, przekazuje jej nazwe nastepnej akcji (jesli dane sa poprawne) reguly walidacji i nazwe zmiennej do ktorej przypisac bledy...

I teraz zalozmy taki scenariusz: user zle wpisal haslo uzytkownika, validator zwraca bledy, nie redirectuje...

User dobrze wpisal haslo: validator nie zwraca bledow, zamraza (Freeze) Context (a konkretnie tylko POST), redirectuje do nastepnej akcji... W miedzyczasie Context stwierdza obecnosc zamrozonego stanu aplikacji, ustawiajac dane z POST na miejscu nowych POST ( o ile istnieja ). W nowej akcji latwo mozna sprawdzic czy nie nastapilo naduzycie - sprawdzajac z contextu czy akcja ta zostala przekierowana z poprzedniej akcji.
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.