Claudius L.: Umsetzung der Trennung von PHP- und HTML-Code / des EVA-Prinzips

Beitrag lesen

Hallo!

Ok, so habe ich es noch nie betrachtet. Nach dieser Definition ist mein obiges Codebeispiel (zumindest das obere) also eigentlich ein Stück reiner Ausgabelogik, richtig?

Nein, denn es enthält eine DBMS-Abfrage inklusive einer rudimentären Fehlerbehandlung […] Im Prinzip sollte auch das Fetchen zur Verarbeitungslogik gehören. Vor allem dann, wenn die Daten vor der Ausgabe noch weiter bearbeitet werden sollen. Wenn sie nur abzulegen wären, um sie 1:1 der Ausgabe zu übergeben, könnte der Pragmatiker sagen: "EVA ist kein bindendes Gesetz, fetch ich die Daten lieber später, als sie einfach nur in ein Zwischenarray zu kopieren". Besser wäre es, ein Lazy-Fetch zu implementieren und den eigentlichen Fetch-Vorgang vor der Ausgabelogik in einer foreach-Schleife zu verstecken, indem man die Interfaces Iterator (und ggf. IteratorAggregate) implementiert. Aber das fängt dann schon langsam an, höhere Kunst zu werden.

Also zu früh früh gefreut …
Ich fürchte, darüber muss ich erstmal ein bisschen nachdenken. Mit so etwas habe ich mich bisher leider noch nie beschäftigt. Aber vielen Dank für den Tipp.
Dass die DBMS-Abfrage und die Verarbeitung des Ergebnisses nicht in die Ausgabe gehören ist mir noch einleuchtend. Für den Rest werde ich mich wohl erstmal über Lazy-Fetch und die Verwendung der von dir verlinkten Interfaces informieren müssen, momentan geht das noch deutlich über meinen Horizont hinaus.

(die() ist Mist, weil es eine unfertige Seite hinterlässt. Zudem ist der ausgegebene Text für den Anwender nicht nützlich. Die genaue Fehlerursache ist auch nichts, was die Öffentlichkeit angeht.)

Ja, ich weiß. Wie aber schon im ersten Posting erwähnt ist dieses Projekt für die Nutzung durch mich selbst ausgelegt. Und sollte dann mal was nicht klappen, bin ich eigentlich ganz froh, die genauer Fehlerursache sofort zu Gesicht zu bekommen. Aber sauber ist anders, das gebe ich zu.

Bei mir beginnt die Ausgabe eines HTML-Dokuments mit dem Doctype und <html> usw. Da ist also noch einiger Abstand zwischen der Erzeugung des Flags $account_selected_to_delete und der Auswertung in der Ausgabe.

Ja. Jain. Bei mir auch.
Was ich bisher nicht erwähnt habe, ist dass die hier erzeugten Ausgaben zunächt in einem Ausgabepuffer landen und später an der richtigen Stelle im Dokument eingefügt werden.
Ich habe also ein Template mit einigen einfachen Platzhaltern, die nur ersetzt werden müssen. Einer dieser Platzhalter befindet sich im Body und wird durch den Output meiner „Ausgabe“ ersetzt. Blöde Idee?

In zehbaehs Version ist meiner Meinung nach das HTML besser les- und durchschaubar, meine Version legt das Augenmerk mehr auf die technische Seite. Dafür habe ich aber auch das ganze HTML mit Platzhaltern kompakt in einem String. Gibt es hier ein objektives „Besser“?

PHP ist ja schon ein Template-System, also kann man auch seine Fähigkeiten nutzen, statt sie anderweitig nachzubilden. (Sie trotzdem nachzubilden kann gewichtigere Gründe haben, als so basisnah wie möglich zu sein.) Ich nehme gern reines HTML gespickt mit der alternativen Syntax von Kontrollstrukturen und statt dem länglichen <?php echo htmlspecialchars($foo) ?> nehme ich eine Helper-Funktion: <?php h($foo) ?>. Diese enthält noch etwas mehr Logik, die man manchmal braucht, damit es nicht nur ein Quasi-Alias ist.

Ich glaube, ich muss jetzt mal noch umfassender verraten, wie ich eigentlich vorgehe:

* zu beginn des Skripts lege ich ein leeres Arry $out an.
* ob_start()
* je nach anzuzeigender Seite inkludiere ich eine Datei, die alles Seitenspezifische enthält. Die ganz oben geposteten Codefragmente sind Auszüge aus einer solchen Datei - innerhalb der ich momentan versuche/versuchen möchte, Verarbeitung und Ausgabe möglichst sauber zu trennen.
* $out['maincontent'] = ob_get_contents();
* inkludieren der Template-Datei, die dann z.B. folgendes enthält:

<!-- […]statisches HTML[…] -->  
<?php echo $out['maincontent']; ?>  
<!-- weitere HTML-Fragmente und PHP-Ausgaben aus $out -->

Ist das komplett unsinnig?
Wenn ich so darüber nachdenke, wäre es vermutlich zumindest ein Ansatz, das Konzept aus der Template-Datei konsequent anzuwenden und die „Datei für’s Seitenspezifische“ möglichst unter der Verwendung der von dir verlinkten alternativen Syntax nach Eingabe und Verarbeitung zu trennen. Klingt das vernünftig?
Entschuldige bitte, wenn ich so „unmündige“ Fragen nach richtigem und falschem Vorgehen stelle, aber ich habe das Gefühl, noch einige grundlegend falschen Vorstellungen über eine ordentliche Struktur zu haben …
Vor allem frage ich mich immer wieder Folgendes: Im Moment reden wir nur über die Ausgabe von HTML - ein Kontext, in dem es mich auch überzeugt, dass eben PHP- und HTML-Code nicht völlig zu trennen sind. Aber angenommen (rein hypothetisch, habe ich nicht vor), ich wollte mir genauso die Möglichkeit offen halten, zur Ausgabe beispielsweise ein Bild zu erzeugen. Das würde doch bedeuten, dass das, was mein Verarbeitungs-Part an die Ausgabe weitergibt, völlig frei von jeglicher HTML-Auszeichnung sein müsste. Allerdings ist doch genau das scheinbar weder sinnvoll noch unbedingt notwendig.
Ich hoffe, ich rede keinen völligen Blödsinn - bin in dieser Hinsicht etwas verwirrt.

Jedenfalls vielen Dank an dich für deine Unterstützung, du hilfst mir sehr weiter!

Viele Grüße,

Claudius