Rolf B: Wert an einer anderen Stelle zusammenrechnen

Beitrag lesen

Hallo Bernd,

wenn dein Code so aussieht wie andere Fragmente von Dir, die wir hier schon gesehen haben, dann verstehe ich deine Sorge.

Aber ich kann mir nicht vorstellen, wie Du eine in PHP verknäuelte Verarbeitung mit Ajax retten können solltest. Und was genau willst Du mit Ajax erreichen? Ajax ist JavaScript, das Daten vom Server nachlädt und irgendwie ins DOM praktiziert. Was machst Du bei Usern die kein JavaScript einschalten? Sehen die dann bestimmte Daten nicht oder falsch?

Aber wenn Du Ajax erwägst, dann ist dieses Risiko für Dich wohl irrelevant. Und dann KÖNNTEST du die oben befindlichen Datenfeldern, die ihre Werte erst nach Berechnung der schwarzen Felder bekommen können, erstmal leer lassen. Und Du generierst hinter die Tabelle einen Script-Block, der die richtigen Werte nachträglich dort hinschreibt. Das ist nicht ganz trivial, aber durchaus machbar.

Ich mach mal ein Beispiel - bei Dir wird das sicher anders aussehen.

<table>
<tr id="k4711" class="kategorie">
                   <td>Reihe 1</td> <td class="x1"></td><td class="x2"></td>
</tr>
<tr class="detail"><td>- Test 1</td><td>123</td>        <td>456</td></tr>
<tr class="detail"><td>- Test 2</td><td>234</td>        <td>111</td></tr>
<tr class="summe"> <td></td>        <td>357</td>        <td>567</td></tr>
</table>

Wie gesagt, es geht nur um's Prinzip. Ich nehme mal an, dass Du aus den Werten in der Summenzeile irgendwas berechnen musst, was in die Überschrift gehört, also in die td, die mit den Klassen x1 und x2 markiert sind. Ob das so der beste Weg ist, hängt vom Einzelfall ab.

Mal angenommen, du hast deine Kategorie mit ihren Details ausgegeben. In einer Variablen $rowid steht die ID, die Du der Kategorie-Row gegeben hast. Die ist wichtig, damit ein Script die richtige Row finden kann - es könnte ja z.B. sein, dass Du auf der Seite mehr als eine Kategorie hast. Und dann baust Du in PHP einen String auf, der ein JavaScript-Objektliteral darstellt, mit den Werten die Du nachträglich einbauen willst. Dein Script erzeugst Du so, dass das im JavaScript verwendet wird.

   $data = "{ x1: '$wert_für_x1', x2: '$wert_für_x2' }";
?>
     <script>
        fillFields("<?= $rowid ?>", <?= $data ?>);
     </script>
<?php

fillFields ist eine JavaScript-Funktion, die Du anderswo hinschreibst (z.B. in einen Scriptblock im head-Bereich). Sie sieht so aus:

function fillFields(rowid, data) {
   let row = document.getElementById(rowid);
   let cellNames = Object.getOwnPropertyNames(data);
   for (let i=0; i<cellNames.length; i++) {
      let cell = row.querySelector("."+cellNames[i]);
      if (cell)
         cell.textContent = data[cellNames[i]];
   }
}

Die Funktion erwartet als zweiten Parameter ein Objekt, dessen Keys Klassennamen der Elemente sind, deren Text zu ersetzen ist. Das kann man sicherlich auch anders und universeller bauen, aber ich möchte es hier kompakt halten.

getOwnPropertyNames ermittelt die Schlüssel, die im data-Objekt vorhanden sind. Die Schleife geht diese Schlüssel durch, sucht in der row das Element mit dem Klassennamen, der dem Schlüssel entspricht (beachte, dass ich einen Punkt vor das cellNames[i] setze).

Statt getOwnPropertyNames könnte man auch eine for (... of ...) Schleife nehmen, ich weiß aber nicht welche Browser Du unterstützen musst. Ein IE würde das nicht können, ein IE würde auch var statt let brauchen.

Komplett ungetestet, keine Ahnung ob's funktioniert, aber das wäre ein Weg wie Du mit wenig Aufwand dein 5000er Trumm retten könntest. Viel Fehlertoleranz ist auch nicht drin, d.h. wenn es nicht funktioniert guck in die Console der Browserentwicklerwerkzeuge, ob da ein Error steht.

Disclaimer: Wenn's nicht funktioniert, bist Du auf Dich gestellt. Ich kann das nicht remote debuggen. Es korrekt auf deine Anwendung zu übertragen, das ist jetzt deine Sache.

Rolf

--
sumpsi - posui - clusi
0 46

Wert an einer anderen Stelle zusammenrechnen

  1. 0
    1. 0
      1. 0
        1. 0
          1. 0
        2. 0
          1. 0
      2. 0
        1. 0
        2. -2
          1. 1
            1. 0
            2. 0
          2. 3
            1. -1
            2. 0
            3. 0
              1. 2
                1. 0
                  1. 0
                    1. 0
                      1. 0
                        1. 0
                          1. 0
                            1. 0
                              1. 0
                      2. 0
                        1. 0
                          1. 1
          3. 0
    2. 0
      1. 0
        1. 0
    3. 0
      1. 0
        1. 0
        2. 0
      2. 0
        1. 0
          1. 0
            1. 0
              1. 0
                1. 0
      3. 0
  2. 0