Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML]Wartość checkbox'ów na podstawie textarea
Forum PHP.pl > Forum > Przedszkole
pela222
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ę
Puszy
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. ?>
pela222
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.
Puszy
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.  
pela222
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>
Puszy
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. }
pela222
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. :-)
Puszy
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.  
pela222
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.:-)
Puszy
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));
pela222
@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.
Puszy
  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. }
pela222
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).
Puszy
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
pela222
  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 :-)
Puszy
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?
pela222
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.
Puszy
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);
pela222
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.
Puszy
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
pela222
W moim przypadku zastosowanie polega na tym, że użytkownik wypełnia formularza (krokowy) gdzie zaznacza predefiniowane rekordy (zdania). Efektem ostatecznym jest stworzenie za pomocą biblioteki OpenTBS dokument word / raportu. Edytowane textarea daje użytkownikowi możliwość modyfikowania predefiniowanych rekordów zanim zostanie stworzony ostateczny raport. Ot i taka idea i zastosowanie.
To co teraz jeszcze musze zrobić to w pliku checkbx.php rozdzielić zaznaczone checkbox i przypisać je do zmiennych np. $sekcja1, $sekcja2 etc. ale zakładam, że poradzę sobie z tym dodając waruneki tutaj:
  1. if($set['sent']){
  2. print_r('Zaznaczony zostal checkbox nr '.($cb_no+1).' w zestawie pytan "'.$prefix_name.'" a wartosc przypisanego do niego textarea to: '.$set['text'].'<br />');
  3. }


Jedyne co mi pozostaję na tym eptapie to przyznanie się, że jestem kompletnym brodzikiem intelektualnym...
Podane przez ciebie rozwiąznie:
  1. function getChecked($prepared_form_data){
  2. $output = array();
  3.  
  4. foreach($prepared_form_data as $prefix_name => $prefix){
  5. foreach($prefix as $cb_no => $set){
  6. if($set['sent']){
  7. $output[] = array(
  8. 'prefix' => $prefix_name,
  9. 'cb_no' => $cb_no+1,
  10. 'text' => $set['text']
  11. );
  12. }
  13. }
  14. }
  15.  
  16. return $output;
  17. }

zwraca tablicę wielowymiarową z zaznaczonymi checkbox i odpowiadającymi im polami textarea.
Jak pamiętasz (lub nie) ja potrzebuję otrzymać nie jedną tablicę a zestaw tablic dla kolejnych prefixów...
czyli
tablice:
$prefix_name = $set['text']
Czyli jako rezultat chciałbym otrzymać tutaj 3 tablice (odpowiedno qwer, asdf, zxcv), dla zaznaczonych dla nich checkboxów...

Niby mam wszystko na tacy, ale mój mały mózg nie obejmuje tych wszystkich tablic wielowymiarowych, funkcji i pętli...
Tutaj wymęczyłem takie coś
  1. function getChecked($prepared_form_data){
  2. $output = array();
  3.  
  4. foreach($prepared_form_data as $prefix_name => $prefix){
  5. foreach($prefix as $cb_no => $set){
  6. if($set['sent']){
  7. $output[$prefix_name] = array(
  8. 'text' => $set['text']
  9. );
  10. }
  11. }
  12. }
  13.  
  14. return $output;
  15. }

Co zwraca mi prawidłową liczbę tablic (to znaczy dla zaznaczonego conajmniej jednego checkbox z każdego prefixa) zwraca mi 3 tablice. Jednak nadpisują się checkboxy w poszczególnych tablicach i każda zawiera tylko jeden element.
Czyli dla zaznaczonego checkbox (pytanie 3, pytanie 4, pytanie 7, pytanie 8) otrzymuje:
  1. Array
  2. (
  3. [qwer] => Array
  4. (
  5. [text] => pytanie 3
  6. )
  7.  
  8. [asdf] => Array
  9. (
  10. [text] => pytanie 4.1
  11. )
  12.  
  13. [zxcv] => Array
  14. (
  15. [text] => pytanie 8
  16. )
  17.  
  18. )

brak w tablicy zxcv [text] => pytanie 7 (nadpisane pewnie przez pytanie 8)


Walczę dalej, ale oczywiście, będe wdzieczny za pomoc.
Puszy
Jeżeli potrzebujesz trzech tablic zamiast jednej wielowymiarowej to sobie to rozdziel, choć ja nie widzę sensu

  1. $tablica_1 = $tablica_wielowymiarowa[0]
  2. $tablica_2 = $tablica_wielowymiarowa[1]
  3. $tablica_3 = $tablica_wielowymiarowa[2]
  4.  


ale osobiście nie mam pojęcia w czym przeszkadza Ci jedna tablica zawierająca inne tablice. Łatwiej się operuje na takich danych.
pela222
Tak jak pisałem kiedyś. Potrzebuje zmienne $tablica1, $tablica2 bo te dane wstawiam szablonu Word (tworzenie doc z wykorzystaniem biblioteki openTBS). I tam potrzebuje już te dane mieć w osobnych tablicach bo są wystawiane w różnym miejscu w dokumencie Word.
Jak wrócę do domu zobaczę czy to co napisałeś jest dla mnie zrozumiałe.
Dzieki
Puszy
No to w czym problem.

$tablica_wielowymiarowa <- tablica wielowymiarowa
$tablica_wielowymiarowa[0] <- to również jest tablica, jedna z wielu w tablicy wielowymiarowej
$tablica_wielowymiarowa[1] <- kolejna tablica

więc jeżeli (zakładam tak to działa) korzystając z tej biblioteki wywołujesz funkcję która za parametr przyjmuje tablicę to nie podawaj głównej tablicy ale jej element który jest tablicą

wersja dla noworodka:

funkcja($tablica_wielowymiarowa) <- NIE
funkcja($tablica_wielowymiarowa[0]) <- TAK
pela222
No tak ale:
  1. function getChecked($prepared_form_data){
  2. $output = array();
  3.  
  4. foreach($prepared_form_data as $prefix_name => $prefix){
  5. foreach($prefix as $cb_no => $set){
  6. if($set['sent']){
  7. $output[] = array(
  8. 'prefix' => $prefix_name,
  9. 'text' => $set['text'],
  10. );
  11. }
  12. }
  13. }
  14.  
  15. return $output;
  16. }


za pomocą
  1. print_r('<pre>');
  2. print_r(getChecked(getFormData($prefixes)));


zwraca:
  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [prefix] => qwer
  6. [text] => pytanie 1
  7. )
  8.  
  9. [1] => Array
  10. (
  11. [prefix] => qwer
  12. [text] => pytanie 3
  13. )
  14.  
  15. [2] => Array
  16. (
  17. [prefix] => asdf
  18. [text] => pytanie 4.1
  19. )
  20.  
  21. [3] => Array
  22. (
  23. [prefix] => zxcv
  24. [text] => pytanie 7
  25. )
  26.  
  27. [4] => Array
  28. (
  29. [prefix] => zxcv
  30. [text] => pytanie 8
  31. )
  32.  
  33. )

a ja potrzebuje coś na kształt:
  1. Array
  2. (
  3. [qwer] => Array
  4. (
  5. [text] => pytanie 1
  6. [text] => pytanie 3
  7. )
  8.  
  9. [asdf] => Array
  10. (
  11. [text] => pytanie 4.1
  12. )
  13.  
  14. [zxcv] => Array
  15. (
  16. [text] => pytanie 7
  17. [text] => pytanie 8
  18. )
  19.  
  20. )

czyli potrzebuje te dane pogrupować w tablicach po nazwie prefiksu. I jeżeli dobrze rozumiem zapis dla noworotka to odwoływał bym się do tablicy1 za pomocą:
  1. print_r('<pre>');
  2. print_r(getChecked(getFormData($prefixes[0])));


Dodam że:
  1. function getChecked($prepared_form_data){
  2. $output = array();
  3.  
  4. foreach($prepared_form_data as $prefix_name => $prefix){
  5. foreach($prefix as $cb_no => $set){
  6. if($set['sent']){
  7. $output[$prefix_name] = array(
  8. 'prefix' => $prefix_name,
  9. 'text' => $set['text'],
  10. );
  11. }
  12. }
  13. }
  14.  
  15. return $output;
  16. }


przy użyciu
  1. print_r('<pre>');
  2. print_r(getChecked(getFormData($prefixes)));


zwraca:
  1. Array
  2. (
  3. [qwer] => Array
  4. (
  5. [prefix] => qwer
  6. [text] => pytanie 3
  7. )
  8.  
  9. [asdf] => Array
  10. (
  11. [prefix] => asdf
  12. [text] => pytanie 4.1
  13. )
  14.  
  15. [zxcv] => Array
  16. (
  17. [prefix] => zxcv
  18. [text] => pytanie 8
  19. )
  20.  
  21. )


Czyli że nadpisuje zmienna 'text' i zawsze jest tylko jedna ostatnia wartość zmiennej.
Puszy
W fanej tablicy na jednym poziomie nie możesz mieć więcej indeksów niż jeden.

Nie istnieje coś jak

Array(
[text] => 'abc'
[text] => 'def'
)

W takim przypadku tworzy się tablicę wartości i wrzuca pod indeks 'text'
pela222
Ja nie potrzebuję nic innego niż:
$qwer = array ('abc', 'def', 'kolejny text z qwer')
$asdf = array ('cos', 'kolejny text z asdf')
...
Oczywiście tylko dla zaznaczonych checkbox.

======EDIT=======
No to mam takie coś. Mogę to powtórzyć cztery razy (4 kolejne funkcje - getChecked1, getChecked2 etc.) i w ten soposób osiągnę (prawie ;-) ) zamierzony efekt.
  1. function getChecked($prepared_form_data){
  2. foreach($prepared_form_data as $prefix_name => $prefix){
  3. foreach($prefix as $cb_no => $set){
  4. if($set['sent'] && $prefix_name == 'qwer'){
  5. $text = $set['text'];
  6. echo $text. '<br/>';
  7. }
  8. }
  9. }
  10. }
  11. print_r(getChecked(getFormData($prefixes)));


Napisałem że prawię bo mi chodziło o przypisanie wyniku do zmiennej np.
  1. $qwer = 'getChecked(getFormData($prefixes))';

a nie wyświetlenie wyniku funkcji na ekran.


======EDIT========
Ok to poradziłem sobie tak:

  1. //PIERWSZY ZESTAW ZMIENNYCH
  2. function getChecked1($prepared_form_data){
  3. foreach($prepared_form_data as $prefix_name => $prefix){
  4. foreach($prefix as $cb_no => $set){
  5. if($set['sent'] && $prefix_name == 'qwer'){
  6. $text = $set['text'];
  7. echo $text. ' ';
  8. }
  9. }
  10. }
  11. }
  12. getChecked1(getFormData($prefixes));
  13. $content1 = ob_get_clean();
  14.  
  15. //DRUGI ZESTAW ZMIENNYCH
  16. function getChecked2($prepared_form_data){
  17. foreach($prepared_form_data as $prefix_name => $prefix){
  18. foreach($prefix as $cb_no => $set){
  19. if($set['sent'] && $prefix_name == 'asdf'){
  20. $text = $set['text'];
  21. echo $text. ' ';
  22. }
  23. }
  24. }
  25. }
  26. getChecked2(getFormData($prefixes));
  27. $content2 = ob_get_clean();


Może to nie jest zbyt elaganckie rozwiązanie ale działa i uzyskałem poszukiwaną funkcjonalność. Jeżeli, ktoś ma pomysł na lepsze rozwiązanie jak zawszę słucham z uwagą.

Dzięki wszystkim szczególnie tobie Puszy za pomoc.
Puszy
Nie potrzebujesz dwóch funkcji które robią to samo. Po to tworzy się funkcje aby nie powielać kodu (m.in.):
  1. function getChecked($prepared_form_data, $q_prefix_name){
  2. foreach($prepared_form_data as $prefix_name => $prefix){
  3. foreach($prefix as $cb_no => $set){
  4. if($set['sent'] && $prefix_name == $q_prefix_name){
  5. $text = $set['text'];
  6. echo $text. ' ';
  7. }
  8. }
  9. }
  10. }


Wywołujesz:
  1. getChecked1(getFormData($prefixes, $szukany_prefix));
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.