Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Formularze - pola wymagane
deha21
post
Post #1





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

Ostrzeżenie: (0%)
-----


Jakie macie sposoby na sprawdzanie wymaganych pól w formularzu? Kombinuje i nie wiem czy dobrze robię - już nawaliłem stado IF'ów ale wydaje mi sie to mało optymalne i pewnie jest jakiś lepszy sposób.

Chodzi mi tu konkretnie o sprawdznie typu:
tytuł jest wymagan -> jeśli cena jest podana to musi być numeryczna -> musi być podana forma kontaktu (jesli mail to musi być poprawny - jeśli telefon to musi być numeryczny) -> w treści musi być znaków max 500 -> itd. itd.
A jeśli któryś warunek jest niespełniony to pokazuje mi który i przekazuje mi zmienną z konkretnym nieprawidłowo wypełnionym polem abym mógł wyświetlić użytkownikowi info.

Macie jakieś swoje sposoby?
Go to the top of the page
+Quote Post
markonix
post
Post #2





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Tak na szybko to błędy zapisuje do tablicy np. $errors i potem za pomocą while je wyświetlam.
Tak na porządnie to można napisać sobie klasę do walidacji - jest tutaj na forum bo się na niej wzorowałem przy pisaniu swojej.
Go to the top of the page
+Quote Post
modern-web
post
Post #3





Grupa: Zarejestrowani
Postów: 763
Pomógł: 117
Dołączył: 15.03.2010
Skąd: void

Ostrzeżenie: (0%)
-----


Najprościej?
Dla każdego pola robisz sprawdzenie (instrukcje warunkowe) według określonych zasad...
Mało optymalne rozwiązanie na większą skalę ale wygląda chyba najlogiczniej (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
krowal
post
Post #4





Grupa: Zarejestrowani
Postów: 561
Pomógł: 72
Dołączył: 15.11.2006

Ostrzeżenie: (0%)
-----


Najprościej i chyba najbezpieczniej jest użyć jakiegoś frameworka który ma wbudowaną obsługę formularzy z validatorami. Osobiście polecam Symfony (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
thek
post
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Najszybciej? Uzywaj frameworków z wbudowaną obsługą walidacji. Możesz też przeglądać klasy obsługi formularzy typu Formo w Kohanie. A możesz także wszystko zrzucić na swoją klasę. Ja to przykładowo robię podobnie nieco do Formo. Tworzę obiekt/tablicę, w którym przechowuję elementy formularza i dotyczy to także elementów walidacji. Przykład?
  1. $register_form = array(
  2. 'login' => array(
  3. 'label' => 'Email/login',
  4. 'value' => '',
  5. 'error' => '',
  6. 'type' => 'text',
  7. 'info' => 'Tutaj wpisz email, którego będziesz używał do logowania. Jest on także domyślnym kontaktowym do biura prasowego (może zostać zmieniony w wizytówce po zalogowaniu)',
  8. 'required' => true,
  9. 'filters' => array('strip_tags' => true, 'regexp' => '/[^a-z0-9$-_\.+!*\'(),{}|\\^~\[\]`<>#%";\/?:@&=]/i'),
  10. 'validators' => array( 'email' => true, 'exists_in_db' => array( 'field' => 'email', 'table' => 'auth_users') )
  11. ),
  12. 'haslo' => array(
  13. 'label' => 'Hasło',
  14. 'value' => '',
  15. 'error' => '',
  16. 'type' => 'password',
  17. 'info' => 'Hasło do logowania.',
  18. 'required' => true,
  19. 'filters' => array('strip_tags' => true),
  20. 'validators' => array()
  21. )
  22. }
Zobacz sobie jak definiuję pola, co one zawierają. Potem już "tylko" w pętli każde pole podesłane POSTem sprawdzam. Jeśli jest 'required' => true, to musi być wypełnione, bo inaczej leci info do errors tego pola. Z filtrami i validatorami jest podobnie. Jeśli tablica ta coś zawiera dla danego pola... wykonuję to. Nie będę tu całego kodu wrzucał. To co interesuje Ciebie, mieści się pod fragmentem, który u mnie jest mniej więcej tutaj.
  1. foreach( $register_form AS $k => $v ) {
  2. if( $v['required'] && (!isset( $_POST[ $k ] ) || empty( $_POST[ $k ] ) ) ) {
  3. if( $register_form[$k]['type'] == 'checkbox' ) {
  4. if( array_key_exists( $k, $_POST ) ) {
  5. $register_form[$k]['value'] = true;
  6. } else {
  7. $register_form[$k]['value'] = false;
  8. }
  9. }
  10. $register_form[$k]['error'] = 'Pole wymagane! Uzupełnij je.';
  11. }
  12. }
Wyświetlenie całości elementów to po prostu w takim układzie bajka (IMG:style_emoticons/default/smile.gif)
  1. <?php foreach( $register_form AS $elem_n => $elem_v ) { ?>
  2. <div<?php echo ($elem_v['required'] ? ' class="required"' : ''); ?>>
  3. <label for="<?php echo $elem_n; ?>"><?php echo $elem_v['label']; ?></label>
  4. <?php
  5. switch( $elem_v['type'] ) {
  6. case 'text':
  7. case 'submit':
  8. ?>
  9. <input type="<?php echo $elem_v['type']; ?>" name="<?php echo $elem_n ?>" value="<?php echo htmlspecialchars( $elem_v['value'] ); ?>" />
  10. <?php
  11. break;
  12. case 'password':
  13. ?>
  14. <input type="password" name="<?php echo $elem_n ?>" value="" />
  15. <?php
  16. break;
  17. case 'checkbox':
  18. ?>
  19. <input type="checkbox" name="<?php echo $elem_n; ?>"<?php echo ($elem_v['value'] ? ' checked="checked"' : '' ) ?> />
  20. <?php
  21. break;
  22. case 'select':
  23. ?>
  24. <select name="<?php echo $elem_n ?>">
  25. <?php foreach( $elem_v['values'] AS $k => $v ) { ?>
  26. <option value="<?php echo $k; ?>"<?php echo ( $elem_v['value'] == $k ? ' selected="selected"' : '' ); ?>><?php echo $v; ?></option>
  27. <?php } ?>
  28. </select>
  29. <?php
  30. break;
  31. default:
  32. }
  33. ?>
  34. <p class="komunikat <?php echo( !empty( $elem_v['error'] ) ? 'error' : 'info' ); ?>"><?php echo( !empty( $elem_v['error'] ) ? $elem_v['error'] : $elem_v['info'] ); ?></p>
  35. </div>
  36. <?php } ?>

EDIT: Jedynie nie robiłem w kodzie obsługi RADIO, bo nie używam niemal nigdy tej kontrolki (wolę SELECT). Ale mając to co dałem, dopisanie obsługi jest już dziecinnie proste. I nie dałem oczywiście tego jak waliduje czy filtruję dane. Jednak na podstawie kodu chyba nie jest potrzebne to... Łatwo wywnioskować co robię... Oczywiście chętni mogą zmodyfikować to pod obsługę multi-checkbox i multi-select do własnych potrzeb.

Byłbym zapomniał... Mam w kodzie kilka klas CSS, które określająpewne właściwości. required to oczywiście oznaczenie diva z polem jako wymagane (ja ustawiam kolor tła), a w dodatkowym akapicie, obok kontrolki, mam komunikat z systemu generowania, który pokazuje albo błąd pola w wyniku walidacji, albo informację o nim, czyli co to za pole i informacje co można tam dać itp.

Jako optymalizację można oczywiście "required" z osobnego pola przrzucić do "validation", ale to zależy od wygody (IMG:style_emoticons/default/smile.gif)

Całość jest zresztą prosta do modyfikacji i szczerze mówiąc to jest tylko kawałek szkieletu skryptu, który cały czas u mnie "mutuje". Tu dodam obsługę klas do pól w generowaniu kodu html, tutaj jakąś inna kontrolkę (właśnie dodaję textarea, którego braku nie zauważyłem (IMG:style_emoticons/default/wink.gif) ), tam nieco zmodyfikuję coś innego. Ostatecznie tak naprawdę to co dałem jest tylko szkicem większym, z którego nieco już kumający koderzy sobie i tak zrobia co chcą, obudują ładnie w klasy, dopiszą metody obiektowe i wstrzykną klasy filtrów oraz walidatorów, zamiast tak jak ja "na pałę" (IMG:style_emoticons/default/biggrin.gif)
Powód edycji: [thek]: A taki drobiazg dopisać :)
Go to the top of the page
+Quote Post
deha21
post
Post #6





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

Ostrzeżenie: (0%)
-----


God bless you thek! Jeszcze całego kodu nie przeanalizowałem ale na pewno coś z niego wyciągnę (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
thek
post
Post #7





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Poanalizuj, bo kod jest mocno uproszczony i nie wszystko mi się chciało wklejać. Poza tym jak wspomniałem, jest to zaledwie szkic rozwiązania. Wiele rzeczy można w nim dopisać, uzupełnić, poprawić. To co Ci potrzebne, to zliczanie na samym końcu ilości pól z errorami i od tego uzależniać czy formularz wysyłamy, czy może walimy informację o poprawieniu błedów. Najprościej można to zrobić dodając sobie jeszcze zmienną licznika, początkowo ustawionego na 0 i zwiększanego o 1 tam, gdzie do $register_form[$k]['error'] coś przypisujemy. Ale można też po prostu zliczać ile pól ma zmienną $register_form[$k]['error'] niepustą. Efekt ten sam. Pobaw się ze szkieletem tego co dałem, bo to naprawdę prosty do edycji i w miarę elastyczny kod strukturalny. Jego edycja powinna Ci nieco rozjaśnić jak prosto można swój własny systemik obsługi formularzy w ten sposób zrobić (IMG:style_emoticons/default/smile.gif) Zauważ, że nawet submit jest polem formularza i on też jest dodawany jako kontrolka, przykładowo w postaci:
  1. 'register_send' => array(
  2. 'label' => '',
  3. 'value' => 'Zapisz wiadomość',
  4. 'error' => '',
  5. 'type' => 'submit',
  6. 'info' => 'Po wypełnieniu wymaganych pól formularza zatwierdź go',
  7. 'required' => false,
  8. 'filters' => array(),
  9. 'validators' => array()
  10. )
Bawcie sie ile chcecie ludziska, bo młodym stażem się zapewne taki kod "poligonowy" do testowania przyda (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 15:53