![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Hej,
mam małą zagwozdkę logiczną w tworzeniu klasy generującej formularz. Teoretycznie takową klasę napisałem, ale mam kilka wątpliwości. Od razu dodam, że aplikacja oparta jest o MVC. Skrócony kod klasy:
Formularz generuję w widoku, np.
Tutaj mam taką rozkminę, czy formularz lepiej generować w widoku jak powyżej, czy w osobnej klasie, np. application/forms/RegisterForm.php Pierwsze rozwiązanie widziałem w Yii, a drugie w Zendzie. A teraz sprawa najważniejsza. Posiadam osobną klasę walidującą pola formularza wg. zasad ustalonych w modelu. Tego nie będę pokazywał, bo nie ma związku. Chcę mieć dostęp do informacji o wszystkich walidujących polach w klasie walidacyjnej. Kontroler: Jeżeli naciśnięto przycisk, zbieram dane z formularza, pobieram reguły walidacji i przekazuję to do klasy walidującej np. $this->validate($data, $rules) $data zawiera tablicę $_POST. W klasie walidacyjnej następuje sprawdzenie poprawności przesłanych danych wg. $rules. W tejże klasie muszę mieć dostęp do tego jaki dane pola ma $label - i to jest cały problem. Nie mam za bardzo pomysłu jak się do tego dostać. Podejrzewam, że w klasie MyForm i metodzie createElement() muszę zapisywać dane każdego tworzonego pola i zapisywać np. w statycznej własności klasy $formData. To nie jest problem. Tylko odwołanie się do np. MyForm::$formData z klasy walidacyjnej przecież nie pobierze tych danych, bo już ich tam nie "będzie". A po co mi wiedzieć jaki label ma dane pole? Ano po to, że jak nie przejdzie walidacji to do tablicy KlasaWalidacyjna->errors mogę dodać $label.' can not be empty' Ten post edytował Turson 24.08.2014, 11:23:12 |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
Wypluwasz errory w tablicy z kluczami z name pola i w widoku robisz coś na zasadzie
IHMO startForm powinno zbierać wszystkie opcje włącznie z method i action, skoro już robisz przypisanie po tablicy. Do tego robisz małe sprawdzanie: jeżeli brak to nic nie ustawiasz w action, a method domyślnie POST |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Z walidacją i wyświetleniem komunikatów nie mam problemu, tylko klasa walidacyjna otrzymuje tablicę $_POST nazwa_pola=>wartość, a potrzebuję dodatkowo na podstawie nazwa_pola pobrać jego label.
Czyli np. w MyFrom->createElement()
gdzieś to przechować, żebym mógł z poziomu klasy walidacyjnej się do tego odwołać <- i to nie wiem jak. |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
A na co Ci to? Do reguł validujących dodajesz sobie tekst w przypadku błędu i po problemie.
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
To jest jakieś rozwiązanie, ale chciałbym, żeby w aplikacji były defaultowe komunikaty, a jak się doda w regułach customowy komunikat to wtedy on się wyświetli.
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
No to dodajesz sobie w klasie Validującej odwołanie do jakiejś tablicy z tekstami (klucz nazwa pola) i sprawdzasz czy jest customowy tekst w rules a jak nie to z tłumaczeń.
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Tablicę rules mam zbudowaną w sposób:
czyli namespace formularza (tak sobie wszystko definiuję takim słowem kluczem, ale mniejsza o to) -> name pola -> reguły Tutaj nie mam żadnego problemu jak już wspomniałem. Chcę gdzieś zapisać do każdego nowego elementu tablicę $tablica[name_pola]=>[label_pola] I nie wiem gdzie to zapisać, żeby potem z klasy walidacyjnej odwołać się do tablicy, jeżeli mam regułę z name_pola w paremetrze, to odwołam się do $tablica[name_pola] i mam jego label. Chodzi tylko i wyłącznie o to. |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
No to jedno rozwiązanie z ... :
- Robisz sobie Interface Input - Implementujsz każdy z inputów nadając im atrybuty publiczne Klasa Form tworzy nowe obiekty typu Input i wrzuca do jakiejś kolekcji. W klasie validującej robisz coś na zasadzie: $label = Form::get('email')->label; lub coś w ten deseń. Ten post edytował Pyton_000 25.08.2014, 08:43:31 |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Dobrze rozumiem?
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
Cos w ten deseń
![]() |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Już próbowałem już takiego rozwiązania i jak z klasy Validation odwoływałem się do Form::get(), to zwracało mi zawsze pustą tablicę. Dlaczego?
Wydaje mi się, że przy odwołaniu statycznym tablica $data klasy Form się czyściła. Ba, kombinowałem z Singletonem, bo myślałem że to kwestia instancji. Ten post edytował Turson 25.08.2014, 09:14:49 |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
Czysta bo to kolejny request a więc dane nie są znane.
Przy odbieraniu danych z $_POST wrzuć to w Form, wygeneruj formularz na nowo ale wstawiając value dla inputów i zadziała. Chociaż i tak uważam że to już kombinowania. Najprościej jak mówiłem, olej label i podziałaj z tekstami validacji |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Pisanie własnego komunikatu o błędzie dla każdej reguły jest jak dla mnie średnim pomysłem, dlatego wolałbym sobie ułatwić życie i wprowadzić automatyczne teksty, jeżeli nie podano własnego. Jak będę miał czas to wrócę do tego kodu i napiszę w tym temacie, gdyby jeszcze coś było
![]() |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 616 Pomógł: 84 Dołączył: 29.11.2006 Skąd: bełchatów Ostrzeżenie: (0%) ![]() ![]() |
Może coś w ten deseń
Ten post edytował memory 25.08.2014, 11:21:46 |
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
@memory, ale co z "{label}" ? Nie stosujesz tutaj żadnej podmiany {label}=>$label
|
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 97 Pomógł: 45 Dołączył: 5.05.2010 Ostrzeżenie: (0%) ![]() ![]() |
Może zamiast metody z 6 argumentami lepiej będzie przekazać do niej 1 argument w postaci tablicy w której będą się znajdowały wszystkie niezbędne informacje. Bo co w przypadku jeśli chce dodać klasę albo ID do pola tekstowego? Który parametr za to odpowiada? Ostatni? A jak będę chciał dodać klasę do label to też ostatni?
Lepszym wyjściem moim zdaniem byłoby:
Następnie przekazujesz ten formularz do widoku i w widoku Dekorator odpowiada za poprawne wyświetlenie.
W renderLabel() dajesz input i tworzysz label na podstawie klucza label. W renderInput() tworzysz input na podstawie klucza input. A podczas walidacji dodajesz klucz error i jeżeli nie jest pusty to wyświetlasz błedy pod polem w którym się pojawiły. W $rules przydałoby się jeszcze przekazać informację z jakiego validatora chcesz skorzystać bo może się zdarzyć tak że dwa validatory będą miały dwa takie same klucze np. min_length albo pattern w którym będzie wyrażenie Regexp i co wtedy? Skąd wiadomo z jakiego validatora skorzystać? |
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 616 Pomógł: 84 Dołączył: 29.11.2006 Skąd: bełchatów Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 556 Pomógł: 40 Dołączył: 20.07.2012 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
imo klasa generująca formularz to w ogóle zła praktyka, od tego są widoki w Twigu, Smarty etc. ale ..... oto mój burdelik
![]()
jak widać dobra praktyka to raczej unikać takich leniwców ![]() Ten post edytował kayman 25.08.2014, 15:34:51 |
|
|
![]()
Post
#19
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#20
|
|
![]() Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Co myślicie o rozwiązaniu: w $form->createElement() w argumencie przekazuję tablicę $rules = array('required' => true), w klasie Form następuje zapisanie w sesji reguł walidujących przy konkretnych polach. Z sesji odczytam, sprawdzę i czyszczę sesję.
Zapiszę w sesji: reguły walidujące i dane pola (label, name, value itd) Ten post edytował Turson 8.09.2014, 14:25:43 |
|
|
![]()
Post
#21
|
|
![]() Grupa: Zarejestrowani Postów: 340 Pomógł: 46 Dołączył: 31.07.2009 Skąd: A Ostrzeżenie: (0%) ![]() ![]() |
moim zdaniem możesz sobie tworzyć formularze dynamicznie w widoku, ale jeżeli chcesz do nich bindować dane to już nie tedy droga.
|
|
|
![]()
Post
#22
|
|
![]() Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
To jakie rozwiązanie, żeby budować formularz obiektem mniej więcej jak podałem, a dodatkowo po wysłaniu formularza mieć dostęp m.in. do labela podając np. jego 'name' ?
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 29.06.2025 - 11:32 |