Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Formularze - pola wymagane
Forum PHP.pl > Forum > PHP
deha21
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?
markonix
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.
modern-web
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 wink.gif
krowal
Najprościej i chyba najbezpieczniej jest użyć jakiegoś frameworka który ma wbudowaną obsługę formularzy z validatorami. Osobiście polecam Symfony smile.gif
thek
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 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 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 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łę" biggrin.gif
deha21
God bless you thek! Jeszcze całego kodu nie przeanalizowałem ale na pewno coś z niego wyciągnę wink.gif
thek
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ć 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 smile.gif
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.