![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 375 Pomógł: 20 Dołączył: 28.07.2006 Ostrzeżenie: (0%) ![]() ![]() |
Zobaczmy przykładowy kontroler:
Przykładowa klasa formularza - nieobowiązkowa Za dużo kodu w kontrolerze? Za bardzo skomplikowany? Tak. Musimy osobno sprawdzać poprawność danych w formularzu i modelu. Prowadzi to do sytuacji, że wiele pól sprawdzamy 2 razy - najpierw w formularzu, a potem w modelu. Nie możemy pominąć walidacji w modelu - przecież błędne dane mogą doprowadzić do destabilizacji systemu! Zazwyczaj jeśli pole ma mieć określony format, musi taki mieć niezależnie, czy dane wejściowe pochodzą z formularza, czy z innego źródła. Gdzie przeprowadzać walidację? Czy wszystko sprawdzać w modelu? Tak byłoby najwygodniej i bez powtórzeń. Mamy formularz rejestracji. Trzeba powtórzyć hasło. Gdzie sprawdzimy, czy oba hasła zgadzają się? Jeśli przekażemy całą tablicę $_POST do modelu, możemy tam odczytać pole "confirm". Niektórzy powiedzą, że tak nie wolno, bo wychodzimy poza kompetencje modelu, a ten przypadek powinien sprawdzić kontroler. Co o tym myślicie? Gdzie przeprowadzać kontrolę poprawności danych? Kolejne zagadnienie to... formularze. Czysta klasa Form w Phalconie jest bez sensu. Żadnych korzyści. Więcej problemów. Pola możemy sprawdzić w akcji kontrolera, cały kod HTML napisać ręcznie (metoda render() jedynie wypluje kod pojedynczej kontrolki), funkcję pomocniczą {{select()}} wywołać w widoku, kilka plików mniej. Jedyna zaleta to możliwość większej automatyki po rozszerzeniu klasy Form inną klasą bazową lub stworzenie uniwersalnego szablonu formularza (niektóre i tak będą wymagać osobnego kształtu): LOL ![]() -------------------- „Jesteśmy różni, pochodzimy z różnych stron Polski, mamy różne zainteresowania, ale łączy nas jeden cel. Cel ten to Ojczyna, dla której chcemy żyć i pracować.” Roman Dmowski
|
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Formularz bardzo często nie operuje bezpośrednio na modelu aplikacji, a na swoim własnym, stąd wymaga on innego zestawu reguł walidacji. Przykład z podwójnym hasłem jest całkiem dobrym przykładem. Z punktu widzenia logiki aplikacji nie istnieje coś takiego jak "powtórzone hasło użytkownika" - istnieje jedynie hasło. W dodatku taki formularz zainteresowany jest jedynie małym fragmentem danych dot. użytkownika.
Jeżeli całą walidację przeniósłbyś do warstwy modelu, skończyłbyś z czymś tak bezsensownym w przykładowym mechanizmie tworzenia nowego konta z losowym hasłem: Trochę bez sensu, prawda? Takie coś jak komunikaty błędów, faktycznie powinno zostać zrealizowane przez widok/szablon. Generując każdy z elementów formularza mogący posiadać jakieś błędy (formularz sam w sobie, grupy pól czy w końcu pojedyncze pola) powinieneś generować jego: - nazwę, - listę błędów, jeżeli jakieś wystąpiły, - kontrolę formularza. Taki schemat generowania zapewnia pewnie klasa ...\Form z frameworka. Wtedy Twój kontroler będzie wyglądać tak: Teraz jest już znacznie prościej i wygodniej. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 375 Pomógł: 20 Dołączył: 28.07.2006 Ostrzeżenie: (0%) ![]() ![]() |
Czyli ostateczny kształt akcji jak poniżej?
Odczyt błędów formularza przenosimy do widoku jak w pierwszym poście. Może odczyt błędów modelu też da się przenieść do widoku, bo można odczytać błędy dla konkretnego pola. Na razie zostawmy tak jak powyżej. Niestety, nie działa to prawidłowo - field.hasMessages() zwraca fałsz, a field.getMessages() pustą tablicę. Błąd w Phalconie lub coś mam nie tak. Pozostaje kwestia klucza CSRF. Też sprawdzamy go w kontrolerze? Ten post edytował WebCM 26.12.2013, 21:36:39 -------------------- „Jesteśmy różni, pochodzimy z różnych stron Polski, mamy różne zainteresowania, ale łączy nas jeden cel. Cel ten to Ojczyna, dla której chcemy żyć i pracować.” Roman Dmowski
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
1. Nigdy nie korzystałem z Phalcona, nie znam go więc ciężko mi się tutaj wypowiadać.
2. Sprawdzanie tokena CSRF powinno zostać obsłużone przez samą bibliotekę zajmującą się formularzami. Jednak z tego co widzę w dokumentacji chyba trzeba to robić ręcznie. 3. Jeżeli dane przeszły pomyślnie walidację formularza model nie powinien już wyrzucić żadnych błędów-komunikatów dla użytkownika - dane powinny być w pełni poprawne. Tutaj powinien już raczej lecieć wyjątek wywalający całą aplikację. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 375 Pomógł: 20 Dołączył: 28.07.2006 Ostrzeżenie: (0%) ![]() ![]() |
Ad 2. Formularze w Phalconie to poczwarka. Może kiedyś wyrośnie motyl. Tak, aktualnie trzeba generować klucz CSRF ręcznie. Można napisać nakładkę i dodawać pole w initialize().
Ad 3. Można ustawić tryb, aby model wyrzucał wyjątek. Czy to rzeczywiście lepsze wyjście? Ten post edytował WebCM 26.12.2013, 22:44:46 -------------------- „Jesteśmy różni, pochodzimy z różnych stron Polski, mamy różne zainteresowania, ale łączy nas jeden cel. Cel ten to Ojczyna, dla której chcemy żyć i pracować.” Roman Dmowski
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 1 333 Pomógł: 137 Dołączył: 25.03.2008 Skąd: jesteś?? Ostrzeżenie: (0%) ![]() ![]() |
Korzystałem w kilku apkah z phalcona, z punktu widzenia mojego klasy formularzy są odpowiedzialne za filtrowanie danych, a nie modele. Przykład jest banalny, admin ma często większe możliwości edycji jakiś danych niż user, a fizycznie korzystają z jednego modelu.
Jeśli chodzi o stwierdzenie, że formy to poczwarka to się zgodzę, moja tymaczasowa mam nadzieje rezygnacja z phalcona jest podyktowana wieloma niedoróbkami jakie ten FW aktualnie posiada, a z klasą formów szybciej jest podciąć sobie żyły z złości niż zbódować jakiś większy form. Aczkolwiek Framework jest na prawdę domry i miejmy nadzieje, że wersja 2 będzie już czymś bardziej dopracowanym. ;-) -------------------- Mój blog - o wszystkim i niczym ale zazwyczaj związane z informatyką! ;-)
Githube Usługi spawalnicze i monterskie | Park linowy Lublin i Okunince |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 375 Pomógł: 20 Dołączył: 28.07.2006 Ostrzeżenie: (0%) ![]() ![]() |
Programiści Phalcona wymyślili normalizację wartości pól formularzy do UTF-32. Niestety w PHP funkcja mb_convert_encoding psuje kodowanie.
Zepsute są litery Ó i ó, ale po wielokrotnym wysyłaniu formularza psują się wszystkie polskie znaki. Czy znacie rozwiązanie tego problemu? Można całkowicie wyłączyć funkcję autoescape, ale wtedy kod staje się podatny na XSS. Kod źródłowy: https://github.com/phalcon/cphalcon/blob/ma.../escaper.c#L261 Jeśli nie da się z tym nic zrobić, usunę wspólny szablon do generowania formularzy i powrócę do osobnych widoków dla każdego formularza, gdzie wstawię <input> ręcznie. Jaki ma sens wspólny szablon z tysiącami IF-ów, aby obejść problem? PS. Forum zamienia encje na znaki, ale w rzeczywistości polskie znaki są zakodowane, np. & # x105; Ten post edytował WebCM 6.01.2014, 16:35:56 -------------------- „Jesteśmy różni, pochodzimy z różnych stron Polski, mamy różne zainteresowania, ale łączy nas jeden cel. Cel ten to Ojczyna, dla której chcemy żyć i pracować.” Roman Dmowski
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 10:06 |