checkbox anhand von IDs auslesen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • checkbox anhand von IDs auslesen

    Hi!

    Seit Gründung des Board bin ich stiller Leser, benötige aber jetzt mal Hilfe für meine kleinen Shop.
    Dabei geht es darum die Optionen für ein Produkt auszuwählen.

    Tabelle product_features
    id option
    20 Option A
    21 Option B
    22 Option C
    23 Option D

    Tabelle product
    id product option
    1 Produkt 20,21
    2 Produkt 20,23
    3 Produkt 20,21,22,23
    4 Produkt 23

    In der product Taballe in der Spalte option sind die ids aus der product_features Tabelle eingetragen.

    Das Produkt rufe ich auf mit

    Quellcode

    1. $DB->set_sql('SELECT * FROM ' . PRODUCT . ' WHERE id =:1');
    2. $DB->execute($_POST['id']);
    3. $product = $DB->fetch_assoc();


    und die Features mit

    Quellcode

    1. $DB->set_sql('SELECT * FROM ' . PRODUCT_FEATURES);
    2. $DB->execute();
    3. while ($row = $DB->fetch_assoc()) {
    4. $features[] = $row;
    5. }


    In Smarty sieht es so aus

    Quellcode

    1. {foreach from=$FEATURES item=list}
    2. <label class='checkbox'>
    3. <input type="checkbox" name="option"> {$list.option}
    4. </label>
    5. {/foreach}


    Nun hätte ich gerne das die entsprechenden Optionen in der Checkbox bereits ausgewählt sind sofern die IP in der Tabelle product vorkommt.

    Andersrum genau so, klicke ich mehrere Optionen an so sollen diese wieder durch komma getrennt in der Product Tabelle eingetragen werden.

    Ich hoffe das war verständlich und jemand kann dies für mich vervollständigen oder mir einen Lösungsansatz bieten.
  • Wenn ich das mal kurz überdenke müsste es doch folgendermaßen gehn:
    Einen Tabelleninhalt liest du in einen Array ein. Den zweiten lässt du durch eine Schleife laufen und schaust, ob das akt. Produkt in dem Arry vorhanden ist (in_array()). Wenn ja, kannst du einen zweiten Array anlegen ($array[$produkt_id] = TRUE;) und dann mit diesem bei der Checkbox schaun, ob bei der richtigen ID-Gruppierung TRUE steht und fügst den haken dann mittels dieser if-abfrage ein:

    Quellcode

    1. {foreach from=$FEATURES item=list}
    2. <label class='checkbox'>
    3. <input type="checkbox" name="option"
    4. <?php
    5. if ($array[$produkt_id] == TRUE)
    6. {
    7. echo " checked=\"checked\"";
    8. }
    9. ?>
    10. > {$list.option}
    11. </label>
    12. {/foreach}
    Alles anzeigen
  • Einen Tabelleninhalt liest du in einen Array ein. Den zweiten lässt du durch eine Schleife laufen und schaust, ob das akt. Produkt in dem Arry vorhanden ist (in_array()).


    Nein, den ersten lese ich in ein Array ein. Den 2 in einer Schleife ohne Prüfung da es genau dort hängt.
    Dein Beispiel bezog sich nun auf HTML in PHP. Ich nutze Smarty und trenne diese beiden. Es ist aber auch kein Problem die Checkboxen in PHP zu generieren und dann in Smarty ausgeben zu lassen.
  • GXH schrieb:

    Den 2 in einer Schleife ohne Prüfung da es genau dort hängt.


    Versteh nicht ganz, was du damit meinst.. was hängt.


    GXH schrieb:

    Dein Beispiel bezog sich nun auf HTML in PHP. Ich nutze Smarty und trenne diese beiden. Es ist aber auch kein Problem die Checkboxen in PHP zu generieren und dann in Smarty ausgeben zu lassen.


    Ich benutz keine fertigen Code's, deswegen kann ich mich da nich so aus.. sry^^
  • OK, mein Fehler.
    Dein Prinzip habe ich verstanden


    Quellcode

    1. $DB->set_sql('SELECT * FROM ' . PRODUCT . ' WHERE id =:1');
    2. $DB->execute($_POST['id']);
    3. $product = $DB->fetch_assoc();
    4. $groupselector = '';
    5. $perm_grps = explode(',', $product['id']);
    6. // Alle Features auflisten
    7. $DB->set_sql('SELECT * FROM ' . PRODUCT_FEATURES);
    8. $DB->execute();
    9. while ($row = $DB->fetch_assoc()) {
    10. $selstat = '';
    11. if ( in_array($row['parent_id'], $perm_grps) )
    12. {
    13. $selstat = ' " checked="checked"';
    14. }
    15. $groupselector .= '<label class="checkbox">
    16. <input type="checkbox" ' . $selstat . ' name="checkbox"> ' . $row['option'] . '
    17. </label>';
    18. }
    Alles anzeigen


    $perm_grps enhällt die produkt ID
    $row['parent_id'] enthällt alle IDs der Produkte. Sprich, in der Features Tabelle sind in parrent_id alle IDs der Produkte eingetragen die das Features enthalten sollen.

    Mir werden zwar jetzt alle Features ausgegeben aber leider nicht die ausgewählten markiert. Ich vermute ich habe da irgendwas durch einander gebracht

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von GXH ()

  • WTF, ich bin das ganze von Anfang an falsch angegangen.
    Ich hätte nicht in der Features Tabelle die IDs der Produkte durch komma getrennt einfügen sollen sondern umgekehrt, in der Produkt Tabelle die IDs der Features. Dann klappt auch der Code von oben.

    Nun heist es alles umschreiben -.-

    Nachtrag:

    Quellcode

    1. while ($row = $DB->fetch_assoc()) {
    2. $perm_grps = explode(',', $row['parrent_id']);
    3. $selstat = '';
    4. if ( in_array($product['id'], $perm_grps) )


    so klappt es nun auch

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von GXH ()

  • Fipsi schrieb:

    Der Code ist ja relativ klein, is ja dann nicht viel^^


    *g* das war nur für den Adminbereich für die Ausgabe. Im Frontend des Shops sieht das ganze wieder anders aus.

    Fipsi schrieb:

    Wie bist da jetzt drauf gekommen?


    Durch diesen Code

    Quellcode

    1. $DB->set_sql('SELECT * FROM ' . PRODUCT . ' WHERE id =:1');
    2. $DB->execute($_POST['id']);
    3. $product = $DB->fetch_assoc();
    4. $groupselector = '';
    5. $perm_grps = explode(',', $product['id']);


    den ich habe in der Product Tabelle keine IDs die durch komma getrennt sind. Musste also die 2 Werte nur umdrehen und schauen das

    Quellcode

    1. $perm_grps = explode(',', $row['parrent_id']);


    gefüllt ist. Dies geht nur wenn ich den Absatz in die While Schleife setze.

    Fipsi schrieb:

    Edit: Blöde Frage: wo geht den die While-Schleife jetzt zu? Darf ich mal kurz nochmal den ganzen Code sehen?


    Klar

    Quellcode

    1. // Server informationen aufrufen
    2. $DB->set_sql('SELECT * FROM ' . DEDICATED_PRODUCT . ' WHERE id =:1');
    3. $DB->execute($server_id);
    4. $server = $DB->fetch_assoc();
    5. // Radio Button vorwählen
    6. if ( $server['activ'] == 1 ) {
    7. $checked = 'checked="checked"';
    8. }
    9. else
    10. {
    11. $checked_checked = 'checked="checked"';
    12. }
    13. $groupselector = '';
    14. // Alle Server Features auflisten
    15. $DB->set_sql('SELECT * FROM ' . DEDICATED_PRODUCT_FEATURES);
    16. $DB->execute();
    17. while ($row = $DB->fetch_assoc()) {
    18. $perm_grps = explode(',', $row['parrent_id']);
    19. $selstat = '';
    20. if ( in_array($server['id'], $perm_grps) )
    21. {
    22. $selstat = 'checked="checked"';
    23. }
    24. $groupselector .= '<label class="checkbox">
    25. <input type="checkbox" ' . $selstat . ' name="checkbox"> ' . $row['option'] . '
    26. </label>';
    27. }
    Alles anzeigen


    Die Ausgabe geschieht dann mit Smarty

    Quellcode

    1. $Smarty->assign(array(
    2. 'SELECTGROUPS' => $groupselector,
    3. ));


    Quellcode

    1. {$SELECTGROUPS}

    PS: Das Einrückenhier im Board ist grausam ;)
  • Die zweite While-Schleife kannst du dir sparen.. da wird nur alles 1000x eingelesen: Bei jedem durchlaufen der While-Schleife wird $perm_grps neu beschrieben und dann in einen Array geändert. Allerdings entsteht durch fetch_assoc() bereits ein Array.
    Sprich: Änder es dazu:

    Quellcode

    1. $row = $DB->fetch_assoc()
    2. $perm_grps = explode(',', $row['parrent_id']);
    3. $selstat = '';
    4. if ( in_array($server['id'], $perm_grps) )
    5. {
    6. $selstat = 'checked="checked"';
    7. }
    8. $groupselector .= '<label class="checkbox">
    9. <input type="checkbox" ' . $selstat . ' name="checkbox"> ' . $row['option'] . '
    10. </label>';


    Zum Einrücken: Japp, hast recht.
  • Soweit ich weiss nicht.

    aber die ganze Lösung ist mist.
    Ich habe nun der Features Tabelle die ids der Produkte eingetragen

    4,6,9,77,11

    Will ich nun das Produkt Updaten, muss ich Praktisch in der Features Tabelle die ids neu schreiben OHNE alle Produkt IDs daraus zu löschen.

    Der einfachste Weg ist wohl die Features IDs mit in die Produkt Tabelle zu schreiben.
  • Da hätte ich eine andere Idee:

    Leg eine weitere Tabelle mit folgenden Spalten an:

    id_feat | id_prod

    Dann ordnest du sie folgendermaßen zu: Du suchst in der Tabelle nach der Zeile mit der Produkt-id. Ist eine (oder mehrere) vorhanden, dann liest du die Feature-id mit aus.
    Mit SQL á la:

    Quellcode

    1. SELECT feat_id FROM xy WHERE prod_id = '$produkt_id'