in Schleife Variable setzen hochzählen und an Script übergeben

  • PHP

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Runshak.

    in Schleife Variable setzen hochzählen und an Script übergeben

    Neu

    Hallo,

    ich fülle mit PHP und einer Foreachschleife eine Tabelle aus (Daten werden aus einer Datenbank abgeholt und mit Hilfe der Item-ID in die Tabelle richtig zugeordnet)

    Beim Befüllen wird auch jedem Tabelleneintrag ein Button zugeordnet. Der Button hat eine ID, welche bei jedem button identisch ist.

    Die Funktion des Buttons wird von einem Java Script gemacht, welche auf die Button ID zugreift.

    Der Button funktioniert auch wie er soll, aber nur beim ersten Tabelleneintrag. Bei den folgenden passiert nichts.

    Liege ich mit der Vermutung richtig, dass es an der gleichen Button-ID liegt?

    Wenn ja, wie kann ich eine ID als Variable in dem ID Feld des Buttons (id="mbtn") so deklarieren, dass beim Durchlauf der Schleife diese hochgezeählt wird UND dann von dem Spript aus auf diese jeweilige Variable zugegriffen werden kann?

    PHP-Quellcode

    1. <?php
    2. foreach($_SESSION["shopping_cart"] as $keys => $values)
    3. {
    4. ?>
    5. <tr>
    6. <td><?php echo $values["item_name"]; ?></td>
    7. <td>
    8. <button class="buttonLog" id="mybtn">Info</button>
    9. </td>
    10. </tr>
    11. <?php
    12. }
    13. ?>



    im Script ist dann der Zugriff auf diese Variable wie folgt:

    Quellcode

    1. var btn = document.getElementById("mybtn");


    Wäre cool wenn mir jemand auf die Sprünge helfen könnte.

    Grüße
    Runshak
    Genitiv ins Wasser, weil es Dativ ist!
    Rettet den Regenwald

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Runshak“ ()

    Neu

    Zeile 11 ist scheinbar nicht Teil des PHP-Skript, oder übersehe ich da ein erneutes <?php?

    EDIT: Aber offenbar ist das, wenn ich dich richtig verstehe, gar nicht das Problem (alle Buttons werden bereits ausgegeben, oder?). Um deine Frage zu beantworten: Zwei Elemente dürfen natürlich nicht dieselbe ID haben.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    Neu

    nein, hast du schon richtig erkannt. (hab den Code nochmal bearbeitet, hatte das <?php ausversehen geloescht)

    Mit der Schleife wird eine Tabelle befüllt. Die Anzahl variiert von 1-viele. Jedem Eintrag wird ein Button zugeordnet. Jeder dieser Buttons soll aber eine eigene ID bekommen. Und ich komm nicht drauf wie ich da ne variable einbauen kann, die auch noch hochgezählt wird.

    Meine Frage ist eigentlich nur auf das "id" in Button gerichtet. Weil ich nicht weiterkomme, wie ich dort ne Variable hochzählen kann, die dann zeitgleich auch von Java script gelesen werden kann.

    Ich hab es mit

    PHP-Quellcode

    1. ​id="<?php echo $values["item_id"]; ?>"
    probiert. da die item_id eindeutig ist. aber dann wüsste ich nicht, wie ich in Java Script auf das zugreifen kann.
    Genitiv ins Wasser, weil es Dativ ist!
    Rettet den Regenwald

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Runshak“ ()

    Neu

    Da ich dein ganzes JS nicht kenne, finde ich die Frage sehr schwer zu beantworten.

    Wenn du machst:

    PHP-Quellcode

    1. <button class="buttonLog" id="mybtn<?php echo $values["item_id"]; ?>">Info</button>

    so könntest du die Elemente abfragen, deren IDs mit "mybtn" anfangen.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    Neu

    Liege ich mit der Vermutung richtig, dass es an der gleichen Button-ID liegt?

    Die Funktion document.getElementById("mybtn"); liefert dir nur den ersten fund zurück, daher funktioniert das nur mit dem 1. Button.

    Buttons nummerieren:

    PHP-Quellcode

    1. $html = '';
    2. for($i = 0; $i < count($_SESSION['shopping_cart']); $i++)
    3. $html .= "<button class='buttonLog' id='mybtn-{$i}'>Info-{$i}</button>";


    Button dessen ID mit mybtn- beginnt ermitteln:
    document.querySelectorAll('[id*="mybtn-"]');

    Neu

    Danke für eure Antworten.

    ich hab mal mit der Antwort von @Fakiz gespielt aber es nicht wie gewünscht hinbekommen.

    wenn ich die for-Schleife von @Fakiz einbaue bekomme ich keinen Button. Ich hänge mal den Code an und auch vom Script

    PHP-Quellcode

    1. <?php
    2. if(!empty($_SESSION["shopping_cart"]))
    3. {
    4. $total = 0;
    5. foreach($_SESSION["shopping_cart"] as $keys => $values)
    6. {
    7. ?>
    8. <tr>
    9. <td><?php echo $values["item_name"]; ?></td>
    10. <td>
    11. <?php
    12. $btnvar = '';
    13. for($i = 0; $i < count($_SESSION['shopping_cart']); $i++)
    14. $btnvar .= "<button class='buttonLog' id='mybtn-{$i}'>Info</button>";
    15. ?>
    16. <!-- The Modal -->
    17. <div id="myModal" class="modal">
    18. <!-- Modal content -->
    19. <div class="modal-content">
    20. <div class="modal-header">
    21. <span class="close">&times;</span>
    22. <h2>Detailed information about <?php echo $values["item_name"]; ?> </h2>
    23. </div>
    24. <div class="modal-body">
    25. <p><?php echo $values["item_description"]; ?></p>
    26. <p>Some other text...</p>
    27. </div>
    28. <div class="modal-footer">
    29. <h3>COPYRIGHT © 2020 </h3>
    30. </div>
    31. </div>
    32. </div>
    33. </td>
    34. <td><?php echo $values["item_quantity"]; ?></td>
    35. <td>RMB <?php echo $values["item_price"]; ?></td>
    36. <td>RMB <?php echo number_format($values["item_quantity"] * $values["item_price"], 2);?></td>
    37. <td><a href="Warenkorb.php?action=delete&id=<?php echo $values["item_id"]; ?>"><span style="color: #EC6B0D; text-decoration: none;">Remove</span></a></td>
    38. </tr>
    39. <?php
    40. $total = $total + ($values["item_quantity"] * $values["item_price"]);
    41. }
    42. ?>


    Quellcode

    1. ​// Get the modal
    2. var modal = document.getElementById("myModal");
    3. // Get the button that opens the modal
    4. //var btn = document.getElementById("myBtn");
    5. var btn = document.querySelectorAll('[id*="mybtn-"]');
    6. // Get the <span> element that closes the modal
    7. var span = document.getElementsByClassName("close")[0];
    8. // When the user clicks the button, open the modal
    9. btn.onclick = function() {
    10. modal.style.display = "block";
    11. }
    12. // When the user clicks on <span> (x), close the modal
    13. span.onclick = function() {
    14. modal.style.display = "none";
    15. }
    16. // When the user clicks anywhere outside of the modal, close it
    17. window.onclick = function(event) {
    18. if (event.target == modal) {
    19. modal.style.display = "none";
    20. }
    21. }
    Genitiv ins Wasser, weil es Dativ ist!
    Rettet den Regenwald

    Neu

    Runshak schrieb:

    bekomme ich keinen Button

    Logisch, denn du gibst $btnvar nicht aus. Irgendwann nach der for-Schleife muss natürlich ein echo $btnvar; stehen.

    Nachtrag: Allerdings hast du jetzt zwei Schleifen, beide über alle Elemente von $_SESSION["shopping_cart"]. Das ist natürlich falsch, jetzt bekommst du deutlich zu viele Buttons.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    Neu

    Basierend auf dem letzten Snippet sehe ich jetzt keinen Grund warum du die Button´s nummerieren wills/musst. Ebenso verhält es sich mit dem geposteten JavaScript.
    Nahe zu alle HTML Elemente können mit dem onclick Attribut ausgestattet werden das ist nichts anderes als den Click Event des buttons zu abonieren. Kleineren Dingen wie das einblenden eines Dialogs/Popups lassen sich so einfach realisieren z.B. so:

    HTML-Quellcode

    1. <button class="buttonLog" id="mybtn-1" onclick="document.getElementById('myModal-1').style.display = 'block';">Info</button>
    2. <span class="close" onclick="document.getElementById('myModal-1').style.display='none';">&times;</span>


    In Zeile 42 könntest du dem Link direkt einen Style Attribute verpassen und würdest dir dann den Span sparen.

    Wie Markus bereits erwähnte hast du jetzt 2 schleifen die Schleife von mir ist aber überflüssig. Es empfiehlt sich auch, meiner Meinung nach zumindest, wenn möglich auf ein Templatesystem zurückzugreifen damit erleichterst du dir das Warten und erweitern deiner Programme erheblich.

    "Template Beispiel"

    Dialog Template, binhaltet 3 "Textmarken" {ID}, {ITEM_NAME}, {ITEM_DESCRIPTION} (modal.tpl)

    HTML-Quellcode

    1. <!-- The Modal -->
    2. <div id="myModal-{ID}" class="modal" style="display: none;">
    3. <!-- Modal content -->
    4. <div class="modal-content">
    5. <div class="modal-header">
    6. <span class="close" onclick="document.getElementById('myModal-{ID}').style.display='none';">&times;</span>
    7. <h2>Detailed information about {ITEM_NAME}</h2>
    8. </div>
    9. <div class="modal-body">
    10. <p>{ITEM_DESCRIPTION}</p>
    11. <p>Some other text...</p>
    12. </div>
    13. <div class="modal-footer">
    14. <h3>COPYRIGHT © 2020 </h3>
    15. </div>
    16. </div>
    17. </div>


    HTML Grundgerüst, beinhaltet einen "Textmarke" {TABLE_ROWS} (html.tpl)

    HTML-Quellcode

    1. <!DOCType html>
    2. <html lang="en">
    3. <head>
    4. <title>MyExampleScript</title>
    5. </head>
    6. <body>
    7. <!-- Content table -->
    8. <table>
    9. <thead>
    10. <tr>
    11. <td>ItemName</td>
    12. <td>InfoButton</td>
    13. <td>Modal</td>
    14. </tr>
    15. </thead>
    16. <tbody>
    17. {TABLE_ROWS}
    18. </tbody>
    19. </table>
    20. </body>
    21. </html>


    Script zum erstellen der Tabelle

    PHP-Quellcode

    1. // Testseite erstellen
    2. // Tabellenzeilen erstellen
    3. $tblRows = createTableRows();
    4. // Html Template laden
    5. $html = file_get_contents('html.tpl');
    6. // Html ausgeben
    7. echo str_replace('{TABLE_ROWS}', $tblRows, $html);
    8. /**
    9. * Create shopping cart table rows
    10. * @return string
    11. */
    12. function createTableRows() {
    13. // Session variable validieren
    14. //...
    15. // Tabellenzeilen
    16. $rows = '';
    17. // Html Template für Dialog laden
    18. $modalTpl = file_get_contents('modal.tpl');
    19. foreach($_SESSION["shopping_cart"] as $values)
    20. {
    21. $id = $values["item_id"];
    22. $name = $values["item_name"];
    23. // Hier wird das onclick Attribute genutzt um den dazugehörigen Dialog zu öffnen
    24. $btn = "<button class='buttonLog' id='mybtn-{$id}' onclick='document.getElementById(\"myModal-{$id}\").style.display = \"block\";'>Info</button>";
    25. // Das HTML ist in einer seperaten Template Datei ausgelagert und mit 3 "Textmarken" versehen, diese werden mit den aktuellen Werten ersetzt
    26. $modal = str_replace(array('{ID}', '{ITEM_NAME}', '{ITEM_DESCRIPTION}'), array($id, $name, 'Ich beschreibe einen Artikel...'), $modalTpl);
    27. // Zuguter letzt wird dann noch die Tabellenzeile erstellt
    28. $rows .= "<tr><td>{$name}</td><td>{$btn}</td><td>{$modal}</td></tr>\n";
    29. }
    30. // Rückgabe der erstellten Tabellenzeilen
    31. return $rows;
    32. }

    Neu

    Danke für eure Antworten.

    Ich habe mir jetzt mal das mit den "On-Click-Events" angeschaut und ja es funktioniert nun so, dass alle Buttons eine Aktion ausführen. Allerdings führt jeder Button nun exakt das selbe aus. Sprich ich sehe immer nur die Information von dem zuletzt hinzugefügten Produkt. Aber genau deswegen, dachte ich, dass ein nummerierter Button das Problem dahin gehend löst, dass ich bei jedem Button, dann auch das angezeigt bekomme, was ich möchte - nämlich die Information des jeweiligen Produkts. Weil jedes Produkt natürlich seine eigenen Informationen hat. Ich schau mal ob ich das mit den Templates so hinbekomme, aber ich vermute, dass ich dann das selbe Problem wieder habe.
    Genitiv ins Wasser, weil es Dativ ist!
    Rettet den Regenwald

    Neu

    Die Templates sind super! Wusste bis dahin nicht was man damit so machen kann =O

    Mit Hilfe von deinem Beispiel konnte ich jetzt meinen Code soweit gestalten, dass es wie gewünscht funktioniert. Nur eine letzte Sache weiß ich nicht wie ich das jetzt umsetzen kann.

    Wie bekomme ich

    PHP-Quellcode

    1. <a href="Warenkorb.php?action=delete&id=<?php echo $values["item_id"]; ?>"><span style="color: #EC6B0D; text-decoration: none;">Remove</span></a>


    in meinen Template Code?

    also quasi sowas

    PHP-Quellcode

    1. $remove = " <a href="Warenkorb.php?action=delete&id=<?php echo $values["item_id"]; ?>"><span style="color: #EC6B0D; text-decoration: none;">Remove</span></a> "
    falls sowas von php vorgesehen ist...

    PHP-Quellcode

    1. $rows .= "<tr><td>{$name}</td><td>{$btn}</td><td>{$quant} {$modal}</td><td>RMB {$price}</td><td>RMB {$sum}</td><td>{$remove}</td></tr>\n";
    2. }
    3. // Rückgabe der erstellten Tabellenzeilen
    4. return $rows;


    Wenn das mit dem $remove klappt, dann bin ich happy :thumbsup:
    Genitiv ins Wasser, weil es Dativ ist!
    Rettet den Regenwald