Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] [html] Checkbox i wysyłka formularza
Forum PHP.pl > Forum > PHP
senior.pol
Witam,
Mam problem z checkboxem w formularzu, który domyślnie jest zaznaczony i nie zwraca prawidłowo wartości i błędu.
Docelowo chcę mieć następującą sytuację: Jeśli pole checkbox zostanie odznaczone, to wyświetli się komunikat z błędem i nie pozwoli
wysłać formularza (nie chcę korzystać z opcji blokowanie buttonu submit), jeśli pozostanie nie ruszone, to wyśle wartość np. value.

W html-u wygląda to następująco:
  1. <div class="checkbox">
  2. <label for="warunki">
  3. <input type="hidden" name="warunki" value="Nie">
  4. <input type="checkbox" checked="chcecked" class="form-control-warunki" id="warunki">Akceptuję warunki uczestnictwa *
  5. </label>
  6. </div>


, a w php:

  1. if (isset($warunki) == '') {
  2. echo '<div class="pi-alert-danger fade in"><button type="button" class="pi-close" data-dismiss="alert"><i class="icon-cancel"></i></button><p>Przykładowa treść błędu.</p></div>';
  3. exit();
  4. }


Zna ktoś może rozwiązanie tego problemu?

PS. W internecie przeczytałem już sporo na ten temat, ale rozwiązania dla mojego przypadku nie znalazłem wstydnis.gif
morthan
Hej,

nie znalazłeś rozwiązania bo to co proponujesz wydaje się niezgodne ze sztuką.
Do blokowania formularza używa się na codzień np. tego http://api.jquery.com/event.preventdefault/.
A odpowiadająć dokładnie na twoje pytanie to przepis na twoją bolączkę, wg. mnie wygląda tak:
1. wyświetl formularz
2. wciśnij submit
3. jQuery (czy innym prototype) blokujesz dalszą wysyłkę
4. za pomocą ajax przesyłasz form do walidacji (czy innych operacji)

4a. jak poszło nie tak podczas walidacji, logujesz błędy do pliku, zanim odeślesz info do przeglądarki i wykonasz pkt. 5 i 6 (to opcja, np. do formularza logowania)

5. jeśli przeszło walidację robisz http://api.jquery.com/submit/
6. a jeśli nie to robisz coś innego, np. wyświetlasz komunikaty błędów wink.gif (użytkownicy lubią wiedzieć co się stało że nie działa)


Tak z regóły działa większość formularzy.
ikssde
Kod poniżej zwraca tylko true lub false, więc nigdy się nie wykona.

  1. if (isset($warunki) == '')


Wyrzuć ten znak równości i będzie działało. Warunek wykona się gdy checkbox będzie zaznaczony.

  1. if (isset($warunki))


senior.pol
Cytat(ikssde @ 27.02.2015, 11:37:22 ) *
Kod poniżej zwraca tylko true lub false, więc nigdy się nie wykona.

  1. if (isset($warunki) == '')


Wyrzuć ten znak równości i będzie działało. Warunek wykona się gdy checkbox będzie zaznaczony.

  1. if (isset($warunki))


Teraz za każdym razem pokazuje mi błąd, nawet gdy pole jest zaznaczone.
phpion
No ale kolego - warunki to to Twoje ukryte pole, które zawsze ma tą samą wartość Nie, chyba, że zmieniasz ją jakoś w JS w momencie kliknięcia w checkbox. Daj tak:
  1. <input type="hidden" name="warunki" value="Nie">
  2. <input type="checkbox" checked="chcecked" class="form-control-warunki" id="warunki" name="warunki" value="Tak">Akceptuję warunki uczestnictwa *

a potem w PHP:
  1. if (isset($_POST['warunki']) && $_POST['warunki'] === 'Tak') {
  2. die('OK :)');
  3. }
  4. else {
  5. die('NIE OK :(');
  6. }
senior.pol
Cytat(phpion @ 27.02.2015, 13:37:51 ) *
No ale kolego - warunki to to Twoje ukryte pole, które zawsze ma tą samą wartość Nie, chyba, że zmieniasz ją jakoś w JS w momencie kliknięcia w checkbox. Daj tak:
  1. <input type="hidden" name="warunki" value="Nie">
  2. <input type="checkbox" checked="chcecked" class="form-control-warunki" id="warunki" name="warunki" value="Tak">Akceptuję warunki uczestnictwa *

a potem w PHP:
  1. if (isset($_POST['warunki']) && $_POST['warunki'] === 'Tak') {
  2. die('OK :)');
  3. }
  4. else {
  5. die('NIE OK :(');
  6. }


Nie działa. Zwraca mi ciągle "OK"
phpion
Zapewniam Cię, że działa. Skleiłem kod w całość:
  1. <form method="post">
  2. <input type="hidden" name="warunki" value="Nie">
  3. <input type="checkbox" checked="chcecked" class="form-control-warunki" id="warunki" name="warunki" value="Tak">Akceptuję warunki uczestnictwa *
  4.  
  5. <input type="submit">
  6. </form>
  7.  
  8. <?php
  9. if (isset($_POST['warunki']) && $_POST['warunki'] === 'Tak') {
  10. die('OK :)');
  11. }
  12. else {
  13. die('NIE OK :(');
  14. }
senior.pol
Cytat(phpion @ 27.02.2015, 14:27:26 ) *
Zapewniam Cię, że działa. Skleiłem kod w całość:
  1. <form method="post">
  2. <input type="hidden" name="warunki" value="Nie">
  3. <input type="checkbox" checked="chcecked" class="form-control-warunki" id="warunki" name="warunki" value="Tak">Akceptuję warunki uczestnictwa *
  4.  
  5. <input type="submit">
  6. </form>
  7.  
  8. <?php
  9. if (isset($_POST['warunki']) && $_POST['warunki'] === 'Tak') {
  10. die('OK :)');
  11. }
  12. else {
  13. die('NIE OK :(');
  14. }


Nie wiem czemu, ale dalej nie działa. Może to wina czegoś innego:

  1. <?php
  2.  
  3. if(!$_POST) exit;
  4.  
  5. if (!defined("PHP_EOL")) define("PHP_EOL", "\r\n");
  6.  
  7. $warunki = isset($_POST['warunki']) ? $_POST['warunki'] : '';
  8.  
  9. $address = "abc@abc.pl";
  10.  
  11. if (isset($_POST['warunki']) && $_POST['warunki'] === 'Tak') {
  12. die('OK :)');
  13. }
  14. else {
  15. die('NIE OK :(');
  16. }
  17.  
  18.  
  19. $e_subject = "$rejs - rezerwacja miejsca";
  20.  
  21. $e_body = "$imie $nazwisko\n\nDane adresowe: $adres, $kod $miasto\nLiczba miejsc rezerwowanych: $liczba\nAkceptacja warunków uczestnictwa: $warunki\nZgoda na przetwarzanie danych w procesie rezerwacji: $zgoda\nFaktura: $faktura\n";
  22.  
  23.  
  24. $msg = wordwrap( $e_body . $e_content . $e_reply, 70 );
  25.  
  26. $headers = "From: $email" . PHP_EOL;
  27. $headers .= "Reply-To: $email" . PHP_EOL;
  28. $headers .= "MIME-Version: 1.0" . PHP_EOL;
  29. $headers .= "Content-type: text/plain; charset=utf-8" . PHP_EOL;
  30. $headers .= "Content-Transfer-Encoding: quoted-printable" . PHP_EOL;
  31.  
  32. if(mail($address, $e_subject, $msg, $headers)) {
  33.  
  34. echo '<div class="pi-alert-success fade in"><button type="button" class="pi-close" data-dismiss="alert"><i class="icon-cancel"></i></button><p><strong>Gratulacje!</strong> Instrukcję finalizacji rezerwacji otrzymasz w wiadomości e-mail.</p></div>';
  35.  
  36. } else {
  37.  
  38. echo 'ERROR!';
  39.  
  40. }
  41. ?>
  42.  


  1. <form role="form" action="rezerwacja.php" class="pi-contact-form">
  2. <div class="checkbox">
  3. <label for="warunki">
  4. <input type="hidden" name="warunki" value="Nie">
  5. <input type="checkbox" checked="chcecked" class="form-control-warunki" id="warunki" name="warunki" value="Tak">Akceptuję warunki uczestnictwa *
  6. </label>
  7. </div>
  8. <div class="pi-error-container"></div>
  9. <p>
  10. <button class="btn pi-btn-base pi-btn-wide pi-uppercase pi-weight-700 pi-letter-spacing">
  11. Rezerwuję miejsce <i class="icon-check pi-icon-left"></i>
  12. </button>
  13. </p>
  14. </form>


Zależy mi na powiadamianiu użytkownika, gdy odznaczy pole akceptacji, w przeciwnym razie formularz nie zostanie wysłany.

I tu jeszcze js

Kod
jQuery(function($){

    $('.pi-contact-form').submit(function(){

        var $form = $(this),
            $error = $form.find('.pi-error-container'),
            action  = $form.attr('action');

        $error.slideUp(750, function() {
            $error.hide();

                $warunki = $form.find('.form-control-warunki'),

            $.post(action, {
                    warunki: $warunki.val(),
                },
                function(data){
                    $error.html(data);
                    $error.slideDown('slow');

                    if (data.match('success') != null) {
                        $warunki.val('');
                    }
                }
            );

        });

        return false;

    });
    //endregion

});


PS. Zamieszczam kody w odniesieniu tylko do pola "warunki".
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.