Sven Rautenberg: vlibTemplate vs. smarty

Beitrag lesen

Moin!

<?php
while($row = mysql_fetch_assoc) {
?>
<tr>
  <td><?php echo $row['entry'] ?></td>
<tr>
<?php
}
?>


> >   
> > Das mischt Datenbankabfrage und HTML-Ausgabe im PHP-Code. Funktioniert, klar. Hat aber den entschiedenen Nachteil, dass man sowohl die Struktur des HTML-Codes aus den Augen verliert, wenn es komplizierter wird, als auch die Struktur des PHP-Codes.  
>   
> Zugegeben ist es ein schlechtes Beispiel. Die DB-Abfrage selbst würde ich in einer seperaten Logik-Datei packen und die while-Schleife bekäme ihre Daten dort heraus.  
  
Wenn du es "vernünftig" machen wolltest (und bei größeren Projekten ist das nun mal der Fall), würdest du OOP anwenden (damit kriegst du schon direkt schönen Kontakt zu den Template-Engines, die auch alle OOP sind), und die Businesslogik-Klasse würde von der Datenbankklasse ein Abfrageergebnisobjekt bekommen, welches an die Ausgabelogik-Klasse weitergereicht wird, welche entscheidet, dass aktuell gerade HTML-Ausgabe gewünscht ist (im Gegensatz zu XML, RSS oder Atom, welches auch ginge, wenn eine andere Factory genutzt würde), und daraufhin die entsprechende Template-Engine mit den HTML-Templates befüllt.  
  
Irgendwo in diesen Konstruktionen ist mit Sicherheit auch eine While-Schleife enthalten, die dafür da ist, solange die Datenbank abzufragen, bis keine Ergebnisse mehr da sind. Aber diese Schleife hat mindestens mal in der Businesslogik nichts verloren.  
  

> Die Struktur geht bei PHP-Code genauso schnell verloren wie bei Smarty-Code. Zumindest habe ich diese Erfahrung bei größeren Projekten gemacht. Die Ausgabe bzw. der Code ist der Gleiche nur die Verpackung ist anders.  
  
Ich habe ja auch nicht Smarty empfohlen, sonder vlibTemplate. Smarty scheinr mir tatsächlich die Reimplementation von PHP mit anderen Mitteln (PHP ist ja selbst mal als Template-Engine gestartet und wurde dann immer mehr aufgerüstet).  
  

> > Der Unterschied ist: Mit einer Templateengine trennst du HTML und PHP. Und erleichterst dir damit das Programmieren, weil die Trennung von HTML und PHP auch eine Trennung der Zuständigkeiten ist, und durch die Template-Engine dazu führt, dass es ein eindeutig definiertes Interface gibt, welches die Aufgabe hat, zwischen Datenverarbeitung (PHP) und Datendarstellung (Templateengine) zu vermitteln.  
>   
> Und das ist, was die meisten missverstehen. Es geht IMHO nicht um die Trennung der einzelnen Sprachen sondern um die Trennung von Design, Inhalt und Logik. Und wenn man das geschickt anstellt, beispielsweise über eine Logik-Datei für Abfragen und Ähnliches, gepaart mit dem Design; reines HTML, in das Logik und Inhalt eingebunden wird, kann man sich den Umweg über Template-Engines sparen.  
  
Oder du missverstehst das Prinzip. Es geht um Trennung und Kapselung, und damit um Eindämmung und Beschränkung.  
  
Design, Inhalt und Logik zu trennen ist die eine Sache. Sprachen zu Trennen ist dieselbe Sache.  
  
Natürlich kannst du eine "Template-Datei" schreiben, die anstelle der diversen Engine-Befehle eben aus HTML plus ausgebendem PHP besteht, und die an der passenden Stelle includen.  
  
Aber wie groß ist die Sicherheit, dass du in solchen Dateien wirklich nur ausgebendes PHP schreibst. Wieviel einfacher wären doch Dinge, die man, weil man es mit PHP kann, dann eben doch in diese "Templates" reinschreibt.  
  
Mit einer Template-Engine besteht zunächst einfach nur eine extreme Beschränkung auf sehr simple Dinge: Variablen an bestimmten Stellen ausgeben, dabei eventuell Output-Filter anwenden zur Maskierung, und eventuell noch konditionale Konstrukte. Mehr benötigt man im Grundsatz für eine Ausgabe nicht.  
  
Aber im PHP-Template direkt auf mysql-Funktionen zuzugreifen hielte ich für extrem böse und hinderlich. Man stelle sich nur mal vor, dass irgendwann auf mysqli umgeschwenkt werden muß.  
  

> > Ich bin sicher, man kann Smarty einfach das DB-Handle mit dem Ergebnis übergeben, und Smarty wird sich einfach alle Datensätze aus der Datenbank ziehen und darstellen. Ein zwischengeschobenes Array o.ä. ist nicht notwendig.  
>   
> Doch. IMHO muss man Smarty ein Array übergeben, das dann in einer Schleife ausgegeben wird. Aber genau kann ich mich daran nicht mehr erinnern. Auf alle Fälle war es für meine Ansprüche absurd umständlich.  
  
vlib kann das jedenfalls, auch wenn ich es noch nie genutzt habe, weil ich es unnötig fand. Meine Klassen geben komplette Arrays zurück, keine DB-Handles. Und die Arrays sind direkt passend gestrickt, um vlibTemplate befüllen zu können.  
  

> > Die Heredoc-Syntax ist so ziemlich das schreckliste, was man sich antun kann.  
>   
> Nicht unbedingt. Wenn man es richtig macht, kommt eine Syntax, ähnlich der von Smarty, heraus.  
  
Also benutzt du doch Template-Engines. ;->  
  
 - Sven Rautenberg

-- 
"Love your nation - respect the others."