eine Stückliste rekursiv anzeigen

Ein sehr schönes Anti Pattern 😉
Hier wird alles vermischt: HTML, CSS und PHP Ausgabe und Business Logik. Von diesem Code kann man Nichts wiederverwenden. Soll es in der Software einheitliche Farben geben und eine Farbe ändert sich, möchte kein Auftraggeber das bezahlen.
Am lustigsten finde ich, dass hier so etwas wie eine Artikel-Kalkulation mittendrin eingebaut ist. OK, wenn man sie sonst nirgends verwenden möchte ;).
Die Funktion $Kalkulation->loadELEMENT() macht nämlich genau Eins …eine Reihe aus der Datenbank holen. Das muss man mal sacken lassen: den Einzeiler „SELECT * FROM …“ lagert man aus und die komplizierte Logik klebt man in den bunten Haufen Code rein :).

    public function listELEMENT($arid, $prefix = "")
    {
        $DB = new DB_MySQLi();
        $DBi = new DB_MySQLi();
        $Artikel = new Artikel();
        $now = time();
        $DB->query("SELECT al.*, func_get_artikel_ag_zeit_sum(al.von_arid) as manpower FROM artikel_liste al WHERE al.zu_arid= $arid and al.gueltig_bis > $now order by al.position");
        $i = 1;
        if (!empty($prefix)) {
            echo '<div id="toggle' . $arid . '" class="toggle_me" style="display:none;">'; // auf zu klapp DIV
        }
        $summeSk = 0;
        while ($Feld = $DB->fetchRow()) {
            $Artikel->loadELEMENT($Feld['von_arid']);
            $arid = $Artikel->artikeldaten['arid'];
            if (!empty($Artikel->artikelextradaten["zeichnung_datei"])) {
                $Zeichnung = '<a target="_blank" href="../Zeichnungen/' . $Feld["von_arid"] . '_EXTRAS_' . $Artikel->artikelextradaten["zeichnung_datei"] . '">' . $Artikel->artikelextradaten["zeichnung"] . '</a>';
            } else {
                $Zeichnung = $Artikel->artikelextradaten["zeichnung"];
            }
            if ($Artikel->artikeldaten["status"] == "Freigegeben") {
                $Farbe = "#FFFFFF";
            } else {
                $Farbe = "#FF0000";
            }
            if ($Artikel->existSTL()) {
                $BauGruppen_Farbe = "#99CCFF";
                $toggleHtml01 = '<div id="' . $Artikel->artikeldaten["arid"] . '" data-nr="' . $arid . '" class="toggle" style="cursor: pointer; padding:4px;">'; // auf zu klapp Button
                $toggleHtml02 = '<div>'; // auf zu klapp Button
                $kurze_benennung = '<a target="_top" href="../Stueckliste.php?arid=' . $arid . '">' . $Artikel->artikeldaten["kurze_benennung"] . '</a>';
            } else {
                $BauGruppen_Farbe = "#99FF99";
                $toggleHtml01 = '';
                $toggleHtml02 = '';
                $kurze_benennung = '<font color="#FFFFFF">' . $Artikel->artikeldaten["kurze_benennung"] . '</font>';
            }

            echo '<table border="0" width="98%" cellspacing="1">';

            echo '<tr>';
            echo '<td rowspan="2" align="center" width="30" style="background-color: #143455" title="' . $Feld['stkid'] . ';' . $Feld['stckl_depth'] . '">'
                . '<b><font color="#FFFFFF">' . $prefix . $i . '</font></b>'
                . '</td>';
            echo '<td rowspan="2" align="center" width="30" style="background-color: ' . $BauGruppen_Farbe . '" title="' . $arid . '">' . $toggleHtml01;
            echo '<strong>' . $Feld['anzahl'] . '</strong>' . $toggleHtml02 . '</td>';
            echo '<td colspan="6" style="background-color: #808080">';

            echo '<table border="0" width="100%" cellspacing="0" cellpadding="0">';
            echo '<tr>';
            echo '<td width="148" style="background-color: #808080" align="right"><b><font color="' . $Farbe . '">'
                . '<a href="' . APP_ROOT_URL . '/Artikel/Artikel_edit.php?arid=' . $Artikel->artikeldaten['arid'] . '" target="_blank" style="color: ' . $Farbe . '">'
                . $Artikel->artikeldaten["a_nummer"]
                . '</a>'
                . '</font></b></td>';
            echo '<td style="background-color: #808080">&nbsp;<b>' . $kurze_benennung . '</b></td>';

            $Kalkulation = new Kalkulation();
            $Arbeitsplan = new Arbeitsplan();
            setlocale(LC_MONETARY, 'de_DE');
            $Kalkulation->loadELEMENT($Artikel->artikeldaten["arid"]);
            $calc = $calcDate = '';
            if (!empty($Kalkulation->daten)) { // Kalkulation ausschalten
                $MKn = $Kalkulation->daten["summe_materialkosten_stkl"];
                $MKb = $MKn + (($MKn / 100) * $Kalkulation->daten["zuschlag_mgk"]);
                $AKen = $Kalkulation->daten["summe_arbeitskosten_extern_stkl"];
                $AKn = $Kalkulation->daten["summe_arbeitskosten_stkl"];
                $AKb = $AKn + (($AKn / 100) * $Kalkulation->daten['zuschlag_fgk']) + (($AKen / 100) * $Kalkulation->daten['zuschlag_ext']);

                $HKb = $AKb + $MKb;
                $VVGKzuschlag = ($HKb / 100) * $Kalkulation->daten['zuschlag_vvgk'];
                $SKb = ($HKb + $VVGKzuschlag) * (float)$Feld['anzahl'];
                $calc = 'MatK:<strong>' . number_format($MKn, 2, ',', '.')
                    . '</strong>; ArbK:<strong>' . number_format($AKn, 2, ',', '.')
                    . '</strong>; SK:<strong>' . number_format($SKb, 2, ',', '.') . '</strong>';
                $calcDate = date('d.m.Y', $Kalkulation->daten['datum']);
            }
            $summeSk += $SKb * $Feld["anzahl"];
            echo '<td style="background-color: #808080; text-align: left; color: #fff; width: 300px;" title="Datum der Kalkulation: ' . $calcDate . '">' . $calc . " - $calcDate" . '</td>';
            echo '<td width="130" align="center" style="background-color: #808080" colspan="1"><b><font color="#FFFFFF">' . $Artikel->artikeldaten["a_art"] . '</font></b></td>';
            echo '</tr>';
            echo '</table>';
            echo '</td>';
            echo '<td rowspan="2" align="center" width="40" class="stl_c">'
                . '<a href="edit.php?stkid=' . $Feld["stkid"] . '" target="unten">Edit</a>'
                . '</td>';
            echo '</tr>';
            echo '<tr>';

            echo '<td width="150">Ma&szlig;: ' . $Artikel->artikeldaten['lange_benennung'] . '</td>';
            echo '<td width="150" title="Summe aller Minuten der Arbeitsgänge">AG Minuten: ' . floor($Feld['manpower']) . '</td>';
            echo '<td width="130">Gew. ME ' . $Artikel->artikeldaten['gewicht_netto'] . '</td>';
            echo '<td>Zg.:' . $Zeichnung . '</td>';
            echo '</tr>';
            echo '</table>';

            if ($Artikel->existSTL()) {
                echo '<table border="0" width="100%" cellspacing="0" cellpadding="0"><tr><td width="2%"></td><td>';
                $this->listELEMENT($Artikel->artikeldaten["arid"], $prefix . $i . ".");
                echo '</td></tr></table>';
            }
            echo "\n";
            $i++;
        }
        if (!empty($prefix)) {
            echo "</div>"; // auf zu klapp DIV
        }
        return $summeSk;
    }

In diesem Stückchen Code sieht man noch lauter weiteren Müll, auf den ich nicht weiter eingehen möchte.
Wenn wir aber von Code Wiederverwendung sprechen, sind wir schnell bei Modularität. Habe ich eine Software, die es mir erlaubt Dinge modular einzubauen, muss diese Software diverse Dinge erfüllen.
Die Trennung von Datenbank Abfragen, Business Logik, Ansicht Struktur, Ansicht Design und Schnittstelle nach Außen, etc. müssen getrennt sein. So etwas nennt man eine mehrschichtige Architektur. So kann man bei einer mehrschichtigen Architektur z.B. eine Business Logik unterschiedlich darstellen (als HTML Webseite oder PDF Dokument oder, oder, oder).
Hat man eine Software die so gebaut ist wie der obige Code, bleibt einem nichts Anderes übrig als alles komplett umzubauen. Das wäre höchst wahrscheinlich aufwändiger als alles neu zu entwerfen und neu zu implementieren. Oder man klebt immer mehr in diesen bunten Haufen Code rein, womit man sich einer Katastrophe Stück für Stück annähert.