Hallo!
Beim mitlesen hier im Forum ist mir neulich dieser Thread aufgefallen, der mir mal wieder vor Augen geführt hat, wie „schön“, sinnvoll und nützlich die Anwendung des EVA-Prinzips und die Trennung von HTML- und Programm-Code sein kann.
Im Moment bastle ich an einem kleinen Projekt, in welchem ich diese Prinzipien gerne anwenden möchte. Allerdings habe ich große Probleme bei der Umsetzung, insbesondere, wenn Datenbankabfragen zu verarbeiten sind. Dabei ist mir nicht klar, wie ich die Verarbeitung des Querys von der Ausgabe des resultierenden HTML-Codes sinnvoll trennen könnte.
Um meine Probleme zu verdeutlichen, hier ein Stück aus meinem Code[1]:
// Auflistung aller Konten
$sql = 'SELECT id, konten.name AS konto_name, konten.besitzerid, besitzer.name AS besitzer_name FROM konten LEFT JOIN besitzer ON konten.besitzerid = besitzer.besitzerid ORDER BY besitzer_name';
$result = $mysqli->query($sql) or die ('Abfrage der Konten nicht möglich: '.$mysqli->error);
if ($result->num_rows == 0)
{
echo "<p>Keine Konten</p>";
}
else
{
echo "<table>";
$format = '<tr>
<td>%1$s</td>
<td>%3$s (%4$s)</td>
<td>
<form action="index.php?view=manage_accounts" method="post">
<input type="hidden" name="delete_account_id" value="%2$s" />
<input type="hidden" name="delete_account_name" value="%1$s" />
<input type="hidden" name="delete_account_owner_name" value="„%4$s“" />
<input type="submit" value="entfernen" />
</form>
</td>
</tr>';
while ($row = $result->fetch_assoc())
{
printf($format, htmlspecialchars($row['konto_name']), htmlspecialchars($row['id']), htmlspecialchars($row['besitzerid']), htmlspecialchars($row['besitzer_name']));
}
echo "</table>";
}
Würde ich versuchen, hier Verarbeitung und Ausgabe zu trennen - was käme da dann raus?
Ich müsste doch $result
bzw. die einzelnen Zeilen zwischenspeichern, um dann die while-Schleife mit $format
und printf
in einen Ausgabe-Teil zu verschieben. Wobei ich dann dort $result
verarbeiten müsste, was doch ziemlich nach „Verarbeitung“ und nicht nur nach “Ausgabe“ riecht (mein Problem dann also nichtmehr Ausgabe während der Verarbeitung sondern Verarbeitung während der Ausgabe wäre …).
Als Alternative könnte ich auch $format
auslagern (in ein Array, Objekt, eine externe Datei), aber wenn ich diese Daten dann verwende, vermische ich doch wieder Verarbeitung und Ausgabe. Der HTML-Code stünde zwar nicht direkt im PHP-Code, aber der Vorgang des Ausgebens würde wieder während der Verarbeitung geschehen.
Ähnlich schwer tue ich mich an dieser Stelle des Codes[2]:
// Abfrage der Bestätigung, falls ein Konto zum Löschen markiert wurde
if (set_not_empty('post', 'delete_account_id') && set_not_empty('post', 'delete_account_name') && set_not_empty('post', 'delete_account_owner_name'))
{
$format = '<p>Wirklich das Konto %1$s löschen? (Besitzer: %2$s)</p>
<form action="index.php?view=manage_accounts" method="post">
<fieldset>
<input type="hidden" name="account_id" value="%3$s" />
<button name="confirm" value="ok" type="submit">Ja</button>
<button name="confirm" value="" type="submit">Nein</button>
</fieldset>
</form>';
printf($format, htmlspecialchars($_POST['delete_account_name']), htmlspecialchars($_POST['delete_account_owner_name']), htmlspecialchars($_POST['delete_account_id']));
}
Da ich hier nicht wie oben mehrere Zeilen auszugeben habe ($row
), wäre es hier natürlich noch eher denkbar $format
und printf
an eine andere Stelle zu verschieben. Allerdings müsste ich dann an dieser Stelle nochmals prüfen, ob die Bedingung aus dem if ()
erfüllt wäre. Dies stellt in meinen Augen aber eine Art Redundanz dar, da ich die gleiche Bedingung zwei Mal prüfen würde und obiges Codefragment dann eigentlich keinerlei Funktion mehr hätte - oder sehe ich das falsch?
Irgendwie habe ich das Gefühl, völlig auf dem Holzweg zu sein. Daher meine Frage: Wie macht man’s richtig? Wie stelle ich es an, dass ich meinen HTML-Code nicht in den PHP-Code mische, wenn es nicht nur um die bloße Ersetzung von Platzhaltern im HTML durch Textfragmente geht (wie etwa hier diskutiert), sondern ich wie in meinen Beispielen oben HTML-Code tatsächlich generieren muss? Mir scheint es fast widersprüchlich, zu versuchen, HTML- und PHP-Code voneinander zu trennen, wenn mein Ziel doch ist, mit Hilfe von PHP HTML zu generieren.
Ich würde mich über Tipps, wie man es besser machen könnte, sehr freuen!
Danke schon jetzt und einen schönen Abend noch,
Claudius
[1]: Ich weiß, dass die „Fehlerbehandlung“ mit die()
nicht optimal ist. Allerdings handelt es sich bei dem Projekt aus dem der Code stammt um nichts, dass jemals auf einem öffentlichen Server laufen wird, sondern es wird nur von mir verwendet werden - und für diesen Fall scheint es mir zweckmäßig.
[2]: Die Funktion set_not_empty()
ist eine vorher im Programmablauf definierte Funktion, die im Prinzip nur isset()
und $foo != ''
zusammenfasst.