dedlfix: Umsetzung der Trennung von PHP- und HTML-Code / des EVA-Prinzips

Beitrag lesen

Hi!

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 (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.) 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.

Soweit kann ich das im Prinzip nachvollziehen. Das ist im Prinzip die Art „redundater Prüfung“, von der ich nach dem zweiten Codebeispiel gesprochen habe.

Redundant im Ganzen gesehen. Aber manchmal muss man solche Zwischenschritte einfügen, damit man eine Trennung und damit eine leichtere Wartung und andere Vorteile nutzen zu können.

Und genau das scheint mir in meinem Fall so seltsam, da der oben zitierte Code der letzte meiner Verarbeitungsschritte ist. Folglich ergäbe sich bei Verwendung einer boolschen Kontrollvariablen für die Ausgabe:

// Abfrage der Bestätigung, falls ein Konto zum Löschen markiert wurde

$account_selected_to_delete = false;

if (set_not_empty('post', 'delete_account_id') && set_not_empty('post', 'delete_account_name') && set_not_empty('post', 'delete_account_owner_name'))
{
$account_selected_to_delete = true;
}

  
Kann man zusammenfassen, indem man notiert:  
  
  $account\_selected\_to\_delete = !empty(...) and !empty(...) ...  
  

> // Beginn der Ausgabe  
>   
> if ($account\_selected\_to\_delete)  
> 	{  
> 		$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>  
> 		<!--<input type="submit" name="confirm" value="ok" />  
> 		<input type="submit" name="confirm" value="" />-->  
> 	</fieldset>  
> </form>';  
> 		  
> 		printf($format, htmlspecialchars($\_POST['delete\_account\_name']), htmlspecialchars($\_POST['delete\_account\_owner\_name']), htmlspecialchars($\_POST['delete\_account\_id']));  
> 	}  
  
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.  
  

> Ist zwar vermutlich Ansichtssache, aber welches Vorgehen ist deiner Meinung nach empfehlenswerter: das von mir oben gezeigte, oder so, wie es [zehbaeh](https://forum.selfhtml.org/?t=205988&m=1398068) macht?  
  
Ich leg mich da nicht allgemein fest sondern entscheide das von Fall zu Fall, was mir grad einfacher verständlich oder einfacher zu implementieren scheint.  
  

> 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](http://www.php.net/manual/en/control-structures.alternative-syntax.php) 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.  
  
  
Lo!