Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][PHP]Podwójny checkbox
Forum PHP.pl > Forum > Przedszkole
senior.pol
Witam,

Mam formularz rezerwacji z m.in. dwoma polami checkbox. Wszystko fajnie śmiga, ale problem stanowi wysyłka wartości tych pól. Gdy np. jeden jest zaznaczony, a drugi nie to wysyła z obu pól wartość tego zaznaczonego. Jak rozwiązać ten problem co_jest.gif

  1. $regulamin = isset($_POST['regulamin']) ? 'Tak' : 'Nie';
  2. $zgoda = isset($_POST['zgoda']) ? 'Tak' : 'Nie';


  1. <div class="checkbox">
  2. <label for="regulamin">
  3. <input type="checkbox" checked="checked" class="form-control-regulamin" id="regulamin" name="regulamin">Akceptuję regulamin uczestnictwa *
  4. </div>
  5. <div class="checkbox">
  6. <label for="zgoda">
  7. <input type="checkbox" checked="checked" class="form-control-zgoda" id="zgoda" name="zgoda">Zgadzam się na przetwarzanie moich danych w procesie rezerwacji *
  8. </div>
tzm
ups, nie tu. sorki
SmokAnalog
Z formularzem jest wszystko w porządku, sprawdź dokładnie czy na pewno masz taki błąd.
senior.pol
Cytat(SmokAnalog @ 2.03.2015, 00:47:53 ) *
Z formularzem jest wszystko w porządku, sprawdź dokładnie czy na pewno masz taki błąd.


Niestety błąd dalej jest.

Sprawa obrazowo wygląda tak ( dla przykładu mam pole A i B )
opcja 1: A - zaznaczone, B niezaznaczone: po wysyłce wszystko pasuje: A "Tak", B "Nie"
opcja 2: A - niezaznaczone, B - zaznaczone: po wysyłce błąd: A "Tak", B "Nie" (powinno być na odwrót)
opcja 3: A - zaznaczone, B - zaznaczone: po wysyłce błąd: A "Tak", B "Nie" (powinno być w obu "Tak")
opcja 4: A - niezaznaczone, B - niezaznaczone: po wysyłce błąd: A "Tak", B "Nie" (powinno być w obu "Nie")
SmokAnalog
Pokaż cały formularz i cały skrypt PHP, gdzie testujesz te wartości.
senior.pol
Cytat(SmokAnalog @ 2.03.2015, 15:42:05 ) *
Pokaż cały formularz i cały skrypt PHP, gdzie testujesz te wartości.

  1. <?php
  2.  
  3. if(!$_POST) exit;
  4.  
  5. if (!defined("PHP_EOL")) define("PHP_EOL", "\r\n");
  6.  
  7. $regulamin = isset($_POST['regulamin']) ? 'Tak' : 'Nie';
  8. $zgoda = isset($_POST['zgoda']) ? 'Tak' : 'Nie';
  9.  
  10. $address = "xxx@xxx.pl";
  11.  
  12. $e_body = "$imie $nazwisko\n\nDane adresowe: $adres, $kod $miasto\nLiczba miejsc rezerwowanych: $liczba\nAkceptuję regulamin uczestnictwa: $regulamin\nZgadzam się na przetwarzanie danych w procesie rezerwacji: $zgoda\n";
  13.  
  14. $msg = wordwrap( $e_body . $e_content . $e_reply, 70 );
  15.  
  16. $headers = "From: $email" . PHP_EOL;
  17. $headers .= "Reply-To: $email" . PHP_EOL;
  18. $headers .= "MIME-Version: 1.0" . PHP_EOL;
  19. $headers .= "Content-type: text/plain; charset=utf-8" . PHP_EOL;
  20. $headers .= "Content-Transfer-Encoding: quoted-printable" . PHP_EOL;
  21.  
  22. if(mail($address, $e_subject, $msg, $headers)) {
  23.  
  24. 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 oddzielnej wiadomości e-mail.</p></div>';
  25.  
  26. } else {
  27.  
  28. echo 'ERROR!';
  29.  
  30. }
  31. ?>
  32.  

  1. <form role="form" action="rezerwacja.php" class="pi-contact-form" method="post">
  2. <div class="checkbox">
  3. <label for="regulamin">
  4. <input type="checkbox" checked="checked" class="form-control-regulamin" id="regulamin" name="regulamin">Akceptuję regulamin uczestnictwa *
  5. </label>
  6. </div>
  7. <div class="checkbox">
  8. <label for="zgoda">
  9. <input type="checkbox" checked="checked" class="form-control-zgoda" id="zgoda" name="zgoda">Zgadzam się na przetwarzanie moich danych w procesie rezerwacji *
  10. </label>
  11. </div>
  12. <div class="pi-error-container"></div>
  13. <p>
  14. <button class="btn pi-btn-base pi-btn-wide pi-uppercase pi-weight-700 pi-letter-spacing">
  15. Rezerwuję miejsce <i class="icon-check pi-icon-left"></i>
  16. </button>
  17. </p>
  18. </form>

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();

            var
                $regulamin = $form.find('.form-control-regulamin'),
                $zgoda = $form.find('.form-control-zgoda'),

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

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

        });

        return false;

    });

});
kamil_lk
Pobieranie statusu checkboxa (zamiast .val() użyj .prop('checked'))
  1. $regulamin.prop('checked');
  2. $zgoda.prop('checked');


Ustawianie statusu checkboxa
  1. $regulamin.prop('checked', false);
  2. $zgoda.prop('checked', false);
senior.pol
Cytat(kamil_lk @ 2.03.2015, 19:51:21 ) *
Pobieranie statusu checkboxa (zamiast .val() użyj .prop('checked'))
  1. $regulamin.prop('checked');
  2. $zgoda.prop('checked');


Ustawianie statusu checkboxa
  1. $regulamin.prop('checked', false);
  2. $zgoda.prop('checked', false);

Niestety nie działa wstydnis.gif
SmokAnalog
Osobiście nie lubię w checkboxach tego, że w formularzach niezaznaczone checkboxy nie są wysyłane wcale. Ale jak wysyłasz je jQuery, to możesz to zrobić po swojemu. Popieram kolegę kamil_lk, fajnie byłoby użyć do tego .prop("checked"), który zawsze zwraca true albo false. Może idź tym tropem i właśnie w takiej formie wysyłaj te wartości? Wtedy będziesz musiał zmienić swój skrypt PHP i operować na true/false zamiast na isset.
senior.pol
Cytat(SmokAnalog @ 2.03.2015, 21:19:07 ) *
Osobiście nie lubię w checkboxach tego, że w formularzach niezaznaczone checkboxy nie są wysyłane wcale. Ale jak wysyłasz je jQuery, to możesz to zrobić po swojemu. Popieram kolegę kamil_lk, fajnie byłoby użyć do tego .prop("checked"), który zawsze zwraca true albo false. Może idź tym tropem i właśnie w takiej formie wysyłaj te wartości? Wtedy będziesz musiał zmienić swój skrypt PHP i operować na true/false zamiast na isset.

W takim razie jak powinien wyglądać kod w php? Nie jestem mocny w nim.
SmokAnalog
Jeśli pominiemy walidację póki co, to wystarczy że zamienisz:
  1. $regulamin = isset($_POST['regulamin']) ? 'Tak' : 'Nie';

na:
  1. $regulamin = $_POST['regulamin'] ? 'Tak' : 'Nie';
senior.pol
Cytat(SmokAnalog @ 2.03.2015, 21:27:23 ) *
Jeśli pominiemy walidację póki co, to wystarczy że zamienisz:
  1. $regulamin = isset($_POST['regulamin']) ? 'Tak' : 'Nie';

na:
  1. $regulamin = $_POST['regulamin'] ? 'Tak' : 'Nie';

Poprawiłem kod, ale nie wiele to dało sad.gif Może mam gdzieś błąd.
Kod teraz wygląda następująco:
Kod
$.post(action, {
                    regulamin: $regulamin.val(),
                    zgoda: $zgoda.val(),
                },
                function(data){
                    $error.html(data);
                    $error.slideDown('slow');

                    if (data.match('success') != null) {
                        $regulamin.prop('checked');
                        $zgoda.prop('checked');
                    }
                }

  1. $regulamin = $_POST['regulamin'] ? 'Tak' : 'Nie';
  2. $zgoda = $_POST['zgoda'] ? 'Tak' : 'Nie';

  1. <div class="checkbox">
  2. <label for="regulamin">
  3. <input type="checkbox" checked="checked" class="form-control-regulamin" id="regulamin" name="regulamin">Akceptuję regulamin uczestnictwa *
  4. </label>
  5. </div>
  6. <div class="checkbox">
  7. <label for="zgoda">
  8. <input type="checkbox" checked="checked" class="form-control-zgoda" id="zgoda" name="zgoda">Zgadzam się na przetwarzanie moich danych w procesie rezerwacji *
  9. </label>
  10. </div>
SmokAnalog
Bo dalej wysyłasz tak samo te wartości. Poprawiłem i skomentowałem Twój JS:
[JAVASCRIPT] pobierz, plaintext
  1. $.post(
  2. action, {
  3. regulamin: $regulamin.prop("checked"), // tu wysyłasz true / false
  4. zgoda: $zgoda.prop("checked"), // i tu też
  5. },
  6. function(data){
  7. $error.html(data);
  8. $error.slideDown('slow');
  9.  
  10. if (data.match('success') != null) {
  11. $regulamin.prop('checked'); // co to ma robić? bo w tej chwili nic nie robi
  12. $zgoda.prop('checked'); // jak wyżej, tutaj sprawdzasz sobie czy jest zaznaczone i nic z tą informacją nie robisz
  13. }
  14. }
  15. );
[JAVASCRIPT] pobierz, plaintext
senior.pol
Cytat(SmokAnalog @ 2.03.2015, 21:41:59 ) *
Bo dalej wysyłasz tak samo te wartości. Poprawiłem i skomentowałem Twój JS:
[JAVASCRIPT] pobierz, plaintext
  1. $.post(
  2. action, {
  3. regulamin: $regulamin.prop("checked"), // tu wysyłasz true / false
  4. zgoda: $zgoda.prop("checked"), // i tu też
  5. },
  6. function(data){
  7. $error.html(data);
  8. $error.slideDown('slow');
  9.  
  10. if (data.match('success') != null) {
  11. $regulamin.prop('checked'); // co to ma robić? bo w tej chwili nic nie robi
  12. $zgoda.prop('checked'); // jak wyżej, tutaj sprawdzasz sobie czy jest zaznaczone i nic z tą informacją nie robisz
  13. }
  14. }
  15. );
[JAVASCRIPT] pobierz, plaintext


Poprawiłem i dalej to samo co_jest.gif
SmokAnalog
To zdebugguj to. Zobacz czy te zmienne $zgoda i $regulamin na pewno wskazują na odpowiednie elementy itd. Bo kod wysyłający jest taki jaki powinien być.
senior.pol
Cytat(SmokAnalog @ 2.03.2015, 21:54:07 ) *
To zdebugguj to. Zobacz czy te zmienne $zgoda i $regulamin na pewno wskazują na odpowiednie elementy itd. Bo kod wysyłający jest taki jaki powinien być.


Niby jest wszystko w porządku, ale nie działa tak jak powinno.
Cały formularz znajduje się tutaj
SmokAnalog
A gdzie masz ten skrypt podpięty?
senior.pol
Cytat(SmokAnalog @ 2.03.2015, 22:16:01 ) *
A gdzie masz ten skrypt podpięty?

tutaj
SmokAnalog
To co mogę doradzić to żebyś się nauczył debuggować kod, bo raczej nikt Ci takiej ilości kodu nie będzie analizował. Krok po kroku sprawdzaj co się dzieje, rób console.log z róznymi wartościami.
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.