Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [HTML]Wartość checkbox'ów na podstawie textarea
pela222
post 2.10.2014, 12:54:37
Post #1





Grupa: Zarejestrowani
Postów: 85
Pomógł: 0
Dołączył: 17.04.2013

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


Pytanie dotyczy modyfikacji mojego formularza.
W tej chwili moje checkbox'y w formularzu wygladają tak:
  1. <p><input type="checkbox" name="check[]" value=" przykłądowy tekst z wartością">- przykłądowy tekst z wartością
  2. <p><input type="checkbox" name="check[]" value=" przykłądowy tekst z wartością nr2 ">- przykłądowy tekst z wartością nr2 </p>
  3. <p><input type="checkbox" name="check[]" value=" przykłądowy tekst z wartością nr3 ">- przykłądowy tekst z wartością nr3 </p>
  4. oraz mam dodatkowo jeszcze podkoniec sekcji jeden textarea:
  5. <p><textarea name="check[]"></textarea></p>

Chciałbym jednak dla części z checkbox uzyskać zwiększoną funkcjonalność. Chodzi o to. żeby użytkownik formularza mógł zmodyfikować domyślną wartość tego checkboxa "przykłądowy tekst z wartością" na inną.

Czyli chciałbym przesyłać wartość pola textarea, jeżeli odpowiadający mu checkbox został zaznaczony (przesłąć textarea jako wartość checkbox).

  1. <p><input type="checkbox" name="check[]"></p>
  2. <p><textarea name="textcheck[]" >przykłądowy tekst z wartością</textarea></p>
  3. <p><input type="checkbox" name="check[]"></p>
  4. <p><textarea name="textcheck[]" >przykłądowy tekst z wartością nr2</textarea></p>


Założenia:
1) Chciałbym, aby powiązane pary checkbox - textarea znalazły się w tablicy check[], aby uniknąć nadawania każdemy z checkboxów innej nazwy i niepotrzebnego zwielokrotnienia liczby danych przesyłąnych z formularza. Jeżeli nazwa musi być indywidualna dla kazdego checkbox to jak wstawić zaznaczone checkboxy do tabeli check[] przed wysłaniem danych z formularza.

Rozumiem że pary checkbox - textarea powinny być powiązane jakimś id questionmark.gif? aby stworzyć powiązanie tych dwóch elementów questionmark.gif

Proszę o podpowiedź jak to zrealizować.
Dziekuję
Go to the top of the page
+Quote Post
Puszy
post 2.10.2014, 14:21:26
Post #2





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


Nie wiem czy o to Ci chodzi ale naskrobałem coś takiego. Poza tym nie rozumiem dlaczego porostu nie prześlesz wszystkich pól i nie obrobisz ich w PHP.

JS - generuje ci automatycznie n-elementowy formularz [ustaw zmienne checkboxex_qty oraz name_prefix

  1. <script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
  2.  
  3. <form method="POST" action="">
  4.  
  5. <div id="multi_cb"></div>
  6.  
  7.  
  8. <br />
  9.  
  10. <input type="submit" value="przeslij" />
  11. </form>
  12.  
  13. <script type="text/javascript">
  14.  
  15. var checkboxex_qty = 5;
  16. var name_prefix = 'opinie';
  17.  
  18. $(document).ready(function(){
  19.  
  20. for(i=0;i<checkboxex_qty;i++){
  21. var html = '<input name="cb_' + name_prefix + '_' + i + '" type="checkbox" /><textarea name="ta_' + name_prefix + '_' + i + '"></textarea><br />';
  22.  
  23. $('#multi_cb').append(html);
  24. }
  25.  
  26. $('#multi_cb').append('<input type="hidden" name="qty" value="' + checkboxex_qty + '" />');
  27. $('#multi_cb').append('<input type="hidden" name="prefix" value="' + name_prefix + '" />');
  28.  
  29. });
  30.  



PHP - przekazuje Ci tablicę checkboxów
indexem jest lp. w formularzu
'sent' - boolean czy checkbox został zaznacozny
'text' - wartość <textarea>
pominąłem sprawdzanie poprawności danych i bezpieczeństwo

  1. <?php
  2.  
  3. for($i=0;$i<$_POST['qty'];$i++){
  4. if(isset($_POST['cb_'.$_POST['prefix'].'_'.$i])){
  5. $checkboxes[$i] = array(
  6. 'sent' => true,
  7. 'text' => $_POST['ta_'.$_POST['prefix'].'_'.$i]
  8. );
  9. }else{
  10. $checkboxes[$i] = array(
  11. 'sent' => false,
  12. 'text' => $_POST['ta_'.$_POST['prefix'].'_'.$i]
  13. );
  14. }
  15. }
  16.  
  17. print_r($checkboxes);
  18.  
  19. ?>
Go to the top of the page
+Quote Post
pela222
post 2.10.2014, 15:22:21
Post #3





Grupa: Zarejestrowani
Postów: 85
Pomógł: 0
Dołączył: 17.04.2013

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


Super to napisałeś tylko, że ja potrzebuje podać domyślną wartość wpisaną już w każdy z tych textarea i każda z tych wartości będzie inna.
Chodzi o to, że to jest formularz, gdzie ja podaje pewne zdania/opcje do zaznaczenia poprzez checkbox, a uzytkownik klika sobie wybrane checkboxy i wynikiem jest raport zawierający wybrane przez użytkownika checkboxy (zdania).
Teraz chodziło mi o to, żeby dać użytkownikowi jeszcze wieksza dowolność i moc zmodyfikować podane przeze mnie przykładowe zdania.

W tym co ty zrobiłeś mam za pomocą pętli stworzone 5 checkbox (lub wiecej) i przypisne im textarea (puste). I to jest to o co prosiłem. Jednak w moim przypadku nie może to być tworzone za pomocą pętli, bo każdy ma mieć inne zdanie już wpisane ...
//EDIT// (oczywiście że nie mam racji, bo może, a nawet powinno być tworzone za pomocą pętli - patrz niżej )

Teraz sobie główkuje że było by super jak bym miał zrobioną tablicę od 1 do 10 tych zdan i one byly by przyporządkowywane i wstawiane w kolejne textarea...To by był wypas.
//EDIT// czyli żeby wstawić moje zdania umieszczone w tablicy tutaj
  1. var html = '<input name="cb_' + name_prefix + '_' + i + '" type="checkbox" /><textarea name="ta_' + name_prefix + '_' + i + '">TUTAJ</textarea><br />';


Bede wdzieczny za pomoc Puszy.

----
Ps.
Część z danych do formularza ciągne z bazy danych i wstawiam do formularza. Już kiedyś myślałem nad tym żeby zbudować bazę w której kolejne rekordy były by moimi wartościami dla checkbox. Tym bardziej, że chciałem dodać możliwość tworzenia tego raportu w innym jezyku i wtedy w bazie miałbym pod kolejnymi Lp odpowiedniki zdań dla różnych języków.

Ten post edytował pela222 2.10.2014, 15:42:49
Go to the top of the page
+Quote Post
Puszy
post 2.10.2014, 15:33:42
Post #4





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


W takim razie dorzuciłem tablicę Twoich wartości, co najlepsze nie musisz podawać ilości checkboxów, wystarczy że wypełnisz tablicę. Dodatkowo bezpieczniej jest przerzucić JS na PHP czyli wygenerować HTML z poziomu PHP, nie wiem dlaczego zrobiłem to w JS o.O

W zależności ile podasz tekstów w tablicy ta_defaults tyle checkboxów się pojawi, jeżeli chces zjakiś <textarea> mieć pusty, wstaw pusty string.

  1. <script type="text/javascript">
  2.  
  3. var ta_defaults = new Array('abc', 'qwe', 'sdsd');
  4.  
  5. var name_prefix = 'opinie';
  6. var checkboxex_qty = ta_defaults.length;
  7.  
  8. $(document).ready(function(){
  9.  
  10. for(i=0;i<checkboxex_qty;i++){
  11. var html = '<input name="cb_' + name_prefix + '_' + i + '" type="checkbox" /><textarea name="ta_' + name_prefix + '_' + i + '">' + ta_defaults[i] + '</textarea><br />';
  12.  
  13. $('#multi_cb').append(html);
  14. }
  15.  
  16. $('#multi_cb').append('<input type="hidden" name="qty" value="' + checkboxex_qty + '" />');
  17. $('#multi_cb').append('<input type="hidden" name="prefix" value="' + name_prefix + '" />');
  18.  
  19. });
  20.  
Go to the top of the page
+Quote Post
pela222
post 2.10.2014, 16:07:23
Post #5





Grupa: Zarejestrowani
Postów: 85
Pomógł: 0
Dołączył: 17.04.2013

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


Cytat(Puszy @ 2.10.2014, 15:33:42 ) *
  1. <script type="text/javascript">
  2. var ta_defaults = new Array('abc', 'qwe', 'sdsd');


Powiedz mi jeszcze jak mam takie coś rozwiązać dla zmiennej ta_defaults.

  1. //mieszkasz
  2. if ($type == "single") {
  3. echo '<p><input type="checkbox" name="check1[]" checked="checked" value="Mieszkasz w '.$town.', '.$county.' pod adresem '.$area.'. "> Mieszkasz w '.$town.', Co. '.$county.' pod adresem '.$area.'.</p>';
  4. }
  5. elseif ($type == 'dual') {
  6. echo '<p><input type="checkbox" name="check1[]" checked="checked" value="Mieszkacie w '.$town.', '.$county.' pod adresem '.$area.'. "> Mieszkacie w '.$town.', Co. '.$county.' pod adresem '.$area.'.</p>';
  7. }


Czyli jak wprowadzić warunek że np. Zdanie pierwsze jest "abc" gdy zmienna $type == 'single' ale "ABC" gdy zmeinna $type == 'dual'

EDIT --- Resolved
mam teraz takie coś i działa ;-) wiec chyba sam sobie odpowiedziałem na pytanie pierwsze (chyba że jest jakiś bład lub lepszy sposób to czekam na info):
  1. var type = 1;
  2. var zm1 = ' Ryszard ';
  3. var ch1 = (type == 1) ? "Tutaj jestem:" + zm1 + "koniec." : "a tutaj mnie nie ma:" +zm1+ "koniec.";
  4. var ta_defaults = [ch1,
  5. 'abc',
  6. 'qwe',
  7. 'sdsd'];

czyli że jak zastąpie var type = 1; takim czymś var type = "<?php echo $type; ?>"; to pewnie bedzie git
----
EDIT
I na koniec jeszcze jedno lamerskie pytanie. Do tej pory wyświetlałem moje zmienne poprzez:
$str = implode($check);
echo $str;

A jak to bedzie teraz? To znaczy wyświetl te <textarea> dla których sent = 1 ?
-----
EDIT --- Resolved :-)
No to jeszcze na koniec jeszcze jedno pytanko:
Czy nie moge tego zrealizować w całości w php zamiast z wykorzystaniem js?

no to chyba z tym też sobie poradziłem :-)
  1. <form method="POST" action="checkbx.php">
  2. <?php
  3. $type = "single";
  4. $zm1 = ' Ryszard ';
  5. //$ch1 = ($type == single) ? "Tutaj jestem:" .$zm1. "koniec." : "a tutaj mnie nie ma:" .$zm1. "koniec.";
  6. if ($type == single) {$ch1 = 'abc' .$zm1. 'a tutaj leci dalej';} else {$ch1 = 'asdf' .$zm1. 'i koniec.';};
  7.  
  8. $ta_defaults = array($ch1,
  9. 'abc',
  10. 'qwe',
  11. 'sdsd');
  12.  
  13. $name_prefix = 'opinie';
  14. $checkboxex_qty = count($ta_defaults);
  15. //echo $checkboxex_qty;
  16.  
  17. for($i=0;$i<$checkboxex_qty;$i++){
  18. echo '<input name="cb_'.$name_prefix.'_'.$i.'" type="checkbox" /><textarea name="ta_'.$name_prefix.'_'.$i.'">'.$ta_defaults[$i].'</textarea><br />';
  19. }
  20. echo '<input type="hidden" name="qty" value="'.$checkboxex_qty.'" />';
  21. echo '<input type="hidden" name="prefix" value="'.$name_prefix.'" />';
  22. ?>
  23. <input type="submit" value="przeslij" />
  24. </form>


Ten post edytował pela222 3.10.2014, 00:21:18
Go to the top of the page
+Quote Post
Puszy
post 3.10.2014, 08:53:01
Post #6





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


Nie wiem do końca o co chodzi z tym Ryszardem, więc raczej nie pomogę. Nie widzę zastosowania tego co napisałeś.

Cytat
EDIT
I na koniec jeszcze jedno lamerskie pytanie. Do tej pory wyświetlałem moje zmienne poprzez:
$str = implode($check);
echo $str;

A jak to bedzie teraz? To znaczy wyświetl te <textarea> dla których sent = 1 ?


nie wiem czy Ci o to chodzi: przeleć foreachem i sprawdź czy check był zaznacozny

  1. foreach($checkboxes as $index => $checkbox){
  2. if($checkbox['sent']){
  3. // akcja gdy checkbox został zaznaczony
  4. }else{
  5. // akcja gdy checkbox nie został zaznaczony
  6. }
  7. }
Go to the top of the page
+Quote Post
pela222
post 3.10.2014, 09:32:48
Post #7





Grupa: Zarejestrowani
Postów: 85
Pomógł: 0
Dołączył: 17.04.2013

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


No i o to chodziło mistrzu ;-) Ryszard to tylko przykładowa zmienna którą dla potrzeb testów sobie stworzyłem.

  1. foreach($checkboxes as $index => $checkbox){
  2. if($checkbox['sent']){
  3. // akcja gdy checkbox zostal zaznaczony
  4. $list = ($checkbox['text']. '</br>');
  5. $string = ($checkbox['text']. ' ');
  6. echo $list;
  7. //echo $string;
  8. }else{
  9. // akcja gdy checkbox nie zostal zaznaczony
  10. }
  11. }


Super dzieki za pomoc. Naprawdę dużo się nauczyłem. Najbardziej byłem w szoku, jak sam zrobiłem (przerobiłem z twojego js) pętle dla php. Znaczy że coś sie nauczyłem, bo rok temu, to nie wiedziałem nic na temat php, a jak łątwo się domyślić nie zajmuję się tematem zawodowo, a hobbystycznie. :-)

Ten post edytował pela222 3.10.2014, 09:34:09
Go to the top of the page
+Quote Post
Puszy
post 3.10.2014, 09:49:08
Post #8





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


Nie musisz łączyć stringów w nawiasach i nie ma tagu </br> (teoretycznie byłoby to zamknięcie tagu <br>), stosuje się <br />, podobnie jest z <input /> czy <img />

  1.  
  2. $list = $checkbox['text']. '<br />';
  3.  


Ten post edytował Puszy 3.10.2014, 09:56:39
Go to the top of the page
+Quote Post
pela222
post 3.10.2014, 16:51:15
Post #9





Grupa: Zarejestrowani
Postów: 85
Pomógł: 0
Dołączył: 17.04.2013

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


Dzięki za kolejną wskazówkę.

Na koniec (chyba już ostatnie pytanie).

Czy jak chcę użyc tablicy 2 krotnie (chcę mieć 2 zestawy zmiennych) to należy to zrobić w taki sposób?
  1. <form method="POST" action="checkbx.php">
  2. <?php
  3. $ch1 = 'Ryszard';
  4. //itd dla kolejnych $ch do 99
  5. $ch100 = 'Krystyna';
  6. //itd dla kolejnych $ch do 199
  7. ?>
  8.  
  9. <?php
  10. //TABLICA CHECKBOXOW SEKCJA 1
  11. $ta_defaults = array($ch1,$ch2,'Uwagi');
  12. $name_prefix = 'opinie';
  13. $checkboxex_qty = count($ta_defaults);
  14. //PETLA
  15. for($i=0;$i<$checkboxex_qty;$i++){
  16. echo '<input name="cb_'.$name_prefix.'_'.$i.'" type="checkbox" /><textarea name="ta_'.$name_prefix.'_'.$i.'">'.$ta_defaults[$i].'</textarea><br />';
  17. }
  18. echo '<input type="hidden" name="qty" value="'.$checkboxex_qty.'" />';
  19. echo '<input type="hidden" name="prefix" value="'.$name_prefix.'" />';
  20. ?>
  21.  
  22. <?php
  23. //TABLICA CHECKBOXOW SEKCJA 2
  24. $ta_defaults2 = array($ch100,$ch101,$ch102,$ch103,'Uwagi2');
  25. $name_prefix2 = 'opinie2';
  26. $checkboxex_qty2 = count($ta_defaults2);
  27. //PETLA
  28. for($i=0;$i<$checkboxex_qty2;$i++){
  29. echo '<input name="cb2_'.$name_prefix2.'_'.$i.'" type="checkbox" /><textarea name="ta2_'.$name_prefix2.'_'.$i.'">'.$ta_defaults2[$i].'</textarea><br />';
  30. }
  31. echo '<input type="hidden" name="qty2" value="'.$checkboxex_qty2.'" />';
  32. echo '<input type="hidden" name="prefix2" value="'.$name_prefix2.'" />';
  33. ?>
  34. <input type="submit" value="przeslij" />
  35. </form>


a plik z rezultatami będzie wygladał tak:

  1. <?php
  2. //Pierwszy zestaw
  3. for($i=0;$i<$_POST['qty'];$i++){
  4. if(isset($_POST['cb_'.$_POST['prefix'].'_'.$i])){
  5. $checkboxes[$i] = array(
  6. 'sent' => true,
  7. 'text' => $_POST['ta_'.$_POST['prefix'].'_'.$i]
  8. );
  9. }else{
  10. $checkboxes[$i] = array(
  11. 'sent' => false,
  12. 'text' => $_POST['ta_'.$_POST['prefix'].'_'.$i]
  13. );
  14. }
  15. }
  16. //print_r ($checkboxes);
  17.  
  18. foreach($checkboxes as $index => $checkbox){
  19. if($checkbox['sent']){
  20. // akcja gdy checkbox zostal zaznaczony
  21. $list = $checkbox['text']. '<br/>';
  22. $string = $checkbox['text']. ' ';
  23. echo $list;
  24. //echo $string;
  25. }else{
  26. // akcja gdy checkbox nie zostal zaznaczony
  27. }
  28. }
  29. //drugi zestaw
  30. for($i=0;$i<$_POST['qty2'];$i++){
  31. if(isset($_POST['cb2_'.$_POST['prefix2'].'_'.$i])){
  32. $checkboxes2[$i] = array(
  33. 'sent' => true,
  34. 'text' => $_POST['ta2_'.$_POST['prefix2'].'_'.$i]
  35. );
  36. }else{
  37. $checkboxes2[$i] = array(
  38. 'sent' => false,
  39. 'text' => $_POST['ta2_'.$_POST['prefix2'].'_'.$i]
  40. );
  41. }
  42. }
  43. //print_r ($checkboxes2);
  44.  
  45. foreach($checkboxes2 as $index2 => $checkbox2){
  46. if($checkbox2['sent']){
  47. // akcja gdy checkbox zostal zaznaczony
  48. $list2 = $checkbox2['text']. '<br/>';
  49. $string2 = $checkbox2['text']. ' ';
  50. echo $list2;
  51. //echo $string2;
  52. }else{
  53. // akcja gdy checkbox nie zostal zaznaczony
  54. }
  55. }
  56.  
  57. ?>



Czy istnieje jakieś porostsze rozwiązanie. Jako efert ostateczny czcę otrzymać 2 zestawy zmiennych $list i $list2. ...
chyba że można puścić to raz (jedna tablica) i na końcu rozdzielić na 2 tablice...??dla przykładu pierwszy zestaw od $ch1 do $ch99, drugi od $ch100 do $ch199 itd.

Piszę 2 choć tak naprawdę potrzebuję 4, no ale zasada działania taka sama.:-)

Ten post edytował pela222 3.10.2014, 16:59:22
Go to the top of the page
+Quote Post
Puszy
post 7.10.2014, 15:21:45
Post #10





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


Wrzuć to sobie w funkcję, stwórz jakąś klasę. Podany przeze mnie skrypt nei zawiera filtrowania danych oraz sprawdzania ich poprawności, co jest wymagane w przypadku korzystania z funkcji, inaczej możesz sobie namieszać

funkcja do tworzenia:

  1. function createForm($prefix, $defaults){
  2. $checkboxes_qty = count($defaults);
  3.  
  4. for($i=0;$i<$checkboxes_qty;$i++){
  5. echo '<input name="cb_'.$prefix.'_'.$i.'" type="checkbox" /><textarea name="ta_'.$prefix.'_'.$i.'">'.$defaults[$i].'</textarea><br />';
  6. }
  7. echo '<input type="hidden" name="'.$prefix.'_qty" value="'.$checkboxes_qty.'" />';
  8. echo '<input type="hidden" name="'.$prefix.'_prefix" value="'.$checkboxes_qty.'" />';
  9. }



funkcja do sczytywania:

  1. function getFormData($prefixes_list){
  2. $output = array();
  3.  
  4. foreach($prefixes_list as $prefix){
  5.  
  6. for($i=0;$i<$_POST[$prefix.'_qty'];$i++){
  7.  
  8. if(isset($_POST['cb_'.$prefix.'_'.$i])){
  9. $output[$prefix][$i]['sent'] = true;
  10. }else{
  11. $output[$prefix][$i]['sent'] = false;
  12. }
  13.  
  14. $output[$prefix][$i]['text'] = $_POST['ta_'.$prefix.'_'.$i];
  15. }
  16.  
  17. }
  18.  
  19. return $output;
  20. }



przykładowe odpalenie:

  1. $prefixes = array('qwer', 'asdf', 'zxcv');
  2.  
  3. createForm($prefixes[0], array('pytanie 1', 'pytanie 2', 'pytanie 3'));
  4. createForm($prefixes[1], array('pytanie 4'));
  5. createForm($prefixes[2], array('pytanie 5', 'pytanie 6', 'pytanie 7', 'pytanie 8'));
  6.  
  7. print_r('<pre>');
  8. print_r(getFormData($prefixes));


Ten post edytował Puszy 7.10.2014, 15:25:33
Go to the top of the page
+Quote Post
pela222
post 7.10.2014, 19:03:42
Post #11





Grupa: Zarejestrowani
Postów: 85
Pomógł: 0
Dołączył: 17.04.2013

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


@Puszy Strasznie doceniam twoj czas i pomoc... niestety jeszcze raz muszę prosić o pomoc.

Mam teraz takie dwa pliki
form.php
  1. <form method="POST" action="checkbx.php">
  2. <?php
  3. //TABLICA CHECKBOXOW
  4. $prefixes = array('qwer', 'asdf', 'zxcv');
  5.  
  6. createForm($prefixes[0], array('pytanie 1', 'pytanie 2', 'pytanie 3'));
  7. createForm($prefixes[1], array('pytanie 4'));
  8. createForm($prefixes[2], array('pytanie 5', 'pytanie 6', 'pytanie 7', 'pytanie 8'));
  9.  
  10. //print_r('<pre>');
  11. //print_r(getFormData($prefixes));
  12. //PETLA
  13. function createForm($prefix, $defaults){
  14. $checkboxes_qty = count($defaults);
  15.  
  16. for($i=0;$i<$checkboxes_qty;$i++){
  17. echo '<input name="cb_'.$prefix.'_'.$i.'" type="checkbox" /><textarea name="ta_'.$prefix.'_'.$i.'">'.$defaults[$i].'</textarea><br />';
  18. }
  19. echo '<input type="hidden" name="'.$prefix.'_qty" value="'.$checkboxes_qty.'" />';
  20. echo '<input type="hidden" name="'.$prefix.'_prefix" value="'.$checkboxes_qty.'" />';
  21. }
  22. var_dump ($prefixes);
  23. ?>
  24. <input type="submit" value="przeslij" />
  25. </form>


oraz plik checkbx.php
  1. <?php
  2. function getFormData($prefixes_list){
  3. $output = array();
  4.  
  5. foreach($prefixes_list as $prefix){
  6.  
  7. for($i=0;$i<$_POST[$prefix.'_qty'];$i++){
  8.  
  9. if(isset($_POST['cb_'.$prefix.'_'.$i])){
  10. $output[$prefix][$i]['sent'] = true;
  11. }else{
  12. $output[$prefix][$i]['sent'] = false;
  13. }
  14.  
  15. $output[$prefix][$i]['text'] = $_POST['ta_'.$prefix.'_'.$i];
  16. }
  17.  
  18. }
  19.  
  20. return $output;
  21. }
  22. ?>


Plik form.php prawidłowo generuje formularz z 8 checkbox + 8 textarea. var_dump ($prefixes); zwraca prawidłowo:
array(3) { [0]=> string(4) "qwer" [1]=> string(4) "asdf" [2]=> string(4) "zxcv" }

Nie rozumiem do czego służy to??:
  1. echo '<input type="hidden" name="'.$prefix.'_prefix" value="'.$checkboxes_qty.'" />';

bo zmienna '.$prefix.'_prefix nie jest przetwarzana w pliku docelowym.

Przechodząc do pliku checkbx.php to tutaj już rozumiem niewiele :-(

Podam co moge odczytać:
  1. print_r ($_POST['qwer_prefix']);
zwraca "3"
  1. print_r ($_POST['cb_qwer_0']);
zwraca "on" dla zaznaczonego pierwszego checkboxa, zwraca "" gdy niezaznaczony
  1. print_r ($_POST['ta_qwer_0']);
zwraca "pytanie 1"
  1. print_r ($_POST['qwer_qty']);
zwraca "3"

ale jak wylistować zaznaczone checkbox i odpowiadające im textarea to juz nie wiem.

Z góry dziękuję za pomoc.

Ten post edytował pela222 7.10.2014, 19:05:11
Go to the top of the page
+Quote Post
Puszy
post 10.10.2014, 09:25:59
Post #12





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


  1. echo '<input type="hidden" name="'.$prefix.'_prefix" value="'.$checkboxes_qty.'" />';


Tak, tego fragmentu nie powinno być, pozostałość po starym kodzie. Linijka do wyrzucenia.



Wyjaśnienie funkcji getFromData

  1. function getFormData($prefixes_list){
  2. $output = array();
  3.  
  4. foreach($prefixes_list as $prefix){ // "przechodzisz" przez wszystkie prefixy
  5.  
  6. for($i=0;$i<$_POST[$prefix.'_qty'];$i++){ // "przechodzisz" przez wszystkie zestawy checkbox+<textarea>
  7.  
  8. if(isset($_POST['cb_'.$prefix.'_'.$i])){ // sprawdzasz czy dany checkbox jest zaznaczony
  9. $output[$prefix][$i]['sent'] = true; // jeżeli tak, ustawiasz wartość (bool) true
  10. }else{
  11. $output[$prefix][$i]['sent'] = false; // jeżeli nie, ustawiasz wartość (bool) false
  12. }
  13.  
  14. $output[$prefix][$i]['text'] = $_POST['ta_'.$prefix.'_'.$i]; // przypisujesz do checkboxa wartość <textarea>
  15. }
  16.  
  17. }
  18.  
  19. return $output; // funkcja zwraca przejrzystą, gotową do edycji tablicę danych formularza
  20. }



ostateczna tablica wygląda tak:
  1. (
  2. [qwer] => Array
  3. (
  4. [0] => Array
  5. (
  6. [sent] => 1
  7. [text] => pytanie 1
  8. )
  9.  
  10. [1] => Array
  11. (
  12. [sent] => 1
  13. [text] => pytanie 2
  14. )
  15.  
  16. [2] => Array
  17. (
  18. [sent] =>
  19. [text] => pytanie 3
  20. )
  21.  
  22. )
  23.  
  24. [asdf] => Array
  25. (
  26. [0] => Array
  27. (
  28. [sent] =>
  29. [text] => pytanie 4
  30. )
  31.  
  32. )
  33.  
  34. [zxcv] => Array
  35. (
  36. [0] => Array
  37. (
  38. [sent] => 1
  39. [text] => pytanie 5
  40. )
  41.  
  42. [1] => Array
  43. (
  44. [sent] =>
  45. [text] => pytanie 6
  46. )
  47.  
  48. [2] => Array
  49. (
  50. [sent] =>
  51. [text] => pytanie 7
  52. )
  53.  
  54. [3] => Array
  55. (
  56. [sent] => 1
  57. [text] => pytanie 8
  58. )
  59.  
  60. )
  61.  
  62. )


W zależności co chcesz z nią zrobić możesz użyć np foreach i wybrać tylko interesujące Cię checkboxy czy też znaleźć konkretną wartość <textarea> i sprawdzić przy jakim checkbox się znajdowała. Dla przykładu tak jak napisałeś, wylistujemy checkboxy które zostały zaznaczone i pobierzemy nową tablicę, tylko zaznaczonych checkboxów:

  1. function listChecked($prepared_form_data){
  2. foreach($prepared_form_data as $prefix_name => $prefix){
  3. foreach($prefix as $cb_no => $set){
  4. if($set['sent']){
  5. print_r('Zaznaczony zostal checkbox nr '.($cb_no+1).' w zestawie pytań "'.$prefix_name.'" a wartosc przypisanego do niego textarea to: '.$set['text'].'<br />');
  6. }
  7. }
  8. }
  9. }
  10.  
  11. function getChecked($prepared_form_data){
  12. $output = array();
  13.  
  14. foreach($prepared_form_data as $prefix_name => $prefix){
  15. foreach($prefix as $cb_no => $set){
  16. if($set['sent']){
  17. $output[] = array(
  18. 'prefix' => $prefix_name,
  19. 'cb_no' => $cb_no+1,
  20. 'text' => $set['text']
  21. );
  22. }
  23. }
  24. }
  25.  
  26. return $output;
  27. }
Go to the top of the page
+Quote Post
pela222
post 10.10.2014, 09:47:59
Post #13





Grupa: Zarejestrowani
Postów: 85
Pomógł: 0
Dołączył: 17.04.2013

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


To co robisz to jest dla mnie inna liga...
Powiem tak potrafię w dużej mierze czytać napisany przez ciebie kod. Szczególnie jak już wszystko działą.
Niestety, ale na ten moment w pliku checkbx.php dla
  1. var_dump ($output);
mam NULL czyli, że tam się żadna tablica nie tworzy (przynajmniej u mnie).

Ten post edytował pela222 10.10.2014, 09:49:13
Go to the top of the page
+Quote Post
Puszy
post 10.10.2014, 10:36:35
Post #14





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


W którym miejscu uzywasz var_dump?

Jeżeli w funkcji to jest to niemożliwe bo na starcie $output jest zdefiniowany jako pusta tablica. Jeżeli poza funkcją to nie robisz var_dump ($output); tylko var_dump (getFormData($list_prefixow));

Zmienne wewnątrz funkcji są osiągalne tylko i wyłącznie wewnątrz funkcji. Jedyne "wyjście" zmiennej wykonuje się poprzez return $zmienna, ale wtedy zmienna nie posiada tej samej nazwy jaką posiadała wewnątrz funkcji.

  1. function foo(){
  2. $zmienna = 'Ciag';
  3.  
  4. return $zmienna;
  5. }
  6.  
  7. print_r($zmienna); // wyrzuci Ci blad, bo zmienna $zmienna nieistnieje, jest ona dostepna tylko wewnatrz funkcji foo()
  8.  
  9. $inna_zmienna = foo(); // przypisujesz do zmiennej $inna zmienna wartosc funkcji foo(), w tym przypadku jest to 'Ciag'
  10. print_r($inna_zmienna); // wyswietlisz napis: Ciag


Ten post edytował Puszy 10.10.2014, 10:37:11
Go to the top of the page
+Quote Post
pela222
post 10.10.2014, 11:05:24
Post #15





Grupa: Zarejestrowani
Postów: 85
Pomógł: 0
Dołączył: 17.04.2013

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


  1. function getFormData($prefixes_list){
  2. $output = array();
  3.  
  4. foreach($prefixes_list as $prefix){ // "przechodzisz" przez wszystkie prefixy
  5.  
  6. for($i=0;$i<$_POST[$prefix.'_qty'];$i++){ // "przechodzisz" przez wszystkie zestawy checkbox+<textarea>
  7.  
  8. if(isset($_POST['cb_'.$prefix.'_'.$i])){ // sprawdzasz czy dany checkbox jest zaznaczony
  9. $output[$prefix][$i]['sent'] = true; // jezeli tak, ustawiasz wartosc (bool) true
  10. }else{
  11. $output[$prefix][$i]['sent'] = false; // jezeli nie, ustawiasz wartosc (bool) false
  12. }
  13.  
  14. $output[$prefix][$i]['text'] = $_POST['ta_'.$prefix.'_'.$i]; // przypisujesz do checkboxa wartosc <textarea>
  15. }
  16.  
  17. }
  18.  
  19. return $output; // funkcja zwraca przejrzysta, gotowa do edycji tablice danych formularza
  20. }
  21.  
  22. var_dump (getFormData($prefixes_list));


zwraca array(0) { }

czyli chyba dobrze...questionmark.gif dobrze questionmark.gif :-)
Go to the top of the page
+Quote Post
Puszy
post 10.10.2014, 11:34:39
Post #16





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


I tak i nie, funkcja działa poprawnie, ale widocznie podajesz puste dane. Tutaj jest ten sam problem z zasięgiem, parametr funkcji czyli funkcja($parametr) jest również dostępny tylko wewnątrz funkcji.
Analizując ogólnie:

1. Plik form.php generuje formularz
2. Plik checkbx.php pracuje na danych z forumlarza

Lista prefixów musi w w obu plikach być taka sama, ewentualnie listę prefixów musisz przekazać z form.php do checkbx.php. Rozumiesz w czym rzecz?
Go to the top of the page
+Quote Post
pela222
post 10.10.2014, 13:14:57
Post #17





Grupa: Zarejestrowani
Postów: 85
Pomógł: 0
Dołączył: 17.04.2013

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


Już rozumiem dlaczego nie wyświetlało mi struktury tabeli...
Po dodaniu do pliku checkbx.php tablicy z listą prefixów
  1. $prefixes = array('qwer', 'asdf', 'zxcv');

otrzymałem wyświetloną prawidłowo strukturę...(tak jak już raz wrzuciłeś więc nie będę przyklejał).

Co do ostatecznego rozwiązania (wyświetlenia zaznaczonych checkboxów (tradycyjnie już) mam problem.
  1. function listChecked($prepared_form_data){
  2.  
  3. foreach($prepared_form_data as $prefix_name => $prefix){
  4. foreach($prefix as $cb_no => $set){
  5. if($set['sent']){
  6. print_r('Zaznaczony zostal checkbox nr '.($cb_no+1).' w zestawie pytan "'.$prefix_name.'" a wartosc przypisanego do niego textarea to: '.$set['text'].'<br />');
  7. }
  8. }
  9. }
  10. }
  11.  
  12. //print_r('<pre>');
  13. print_r(listChecked($prepared_form_data));


Nic mi nie wyświetla. Niestety.

Ten post edytował pela222 10.10.2014, 13:16:44
Go to the top of the page
+Quote Post
Puszy
post 10.10.2014, 13:29:25
Post #18





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


Znowu podajesz jako parametr zmienną która nie istnieje, funkcja musi przyjąć za parametr istniejące dane:

  1. listChecked(getFormData($zmienna_zawierajaca_liste_prefixow));




może tak będzie dla Ciebie czytelniej

  1. $przygotowane_dane = getFormData($zmienna_zawierajaca_liste_prefixow);
  2.  
  3. listChecked($przygotowane_dane);
Go to the top of the page
+Quote Post
pela222
post 10.10.2014, 13:43:31
Post #19





Grupa: Zarejestrowani
Postów: 85
Pomógł: 0
Dołączył: 17.04.2013

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


Ok...mam to :-)
Na koniec jeszcze raz super dziękuje za pomoc. Twoją cierpliwość mocno nadwyrężyłem i następnym razem, chyba się dwa razy zastanowisz, zanim komuś pomożesz :-)
Tak jak pisałem jesteśmy na dwóch rożnych poziomach. Uwierz, że jak widzę takie rozwiązanie jak to, to mam banan na tworzy od ucha do ucha...coś co ja bym skrobał 200 linijkami kodu ty rozwalasz systemem w 10 linijkach.

Pozdrawiam i dziękuje.
Go to the top of the page
+Quote Post
Puszy
post 10.10.2014, 13:46:34
Post #20





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


Nie ma problemu. Nie jestem specjalistą. Jakbyś szczegółowo przedstawił o co chodzi w tym skrypcie to można by zrobić tego ładną klasę ale nie wiem jak u Ciebie z OOP. Szczerze to nie widzę zastosowania checkboxów z edytowalnymi textarea, ale czy to ważne biggrin.gif
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 12.05.2025 - 07:14