PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie programmiert Ihr PHP? Trennt Ihr PHP und HTML?



ClausVB
12-11-2005, 11:32
Inline Code - 2 Beispiele:

echo "<table width='80%'>\n\t<tr bgcolor='$farbe'>";
oder mit der Heredoc-Syntax (http://php.net/manual/de/language.types.string.php)


echo<<<tabellenanfang
<table width="80%">
<tr bgcolor="$farbe">
tabellenanfang;

Template Engines trennen HTML und PHP. In unserem Beispiel zum Beispiel so:

<table width="80%">
<tr bgcolor="{tmpl_var name='farbe'}">
mit folgender Anweisung im PHP-Skript


$tmpl->setvar('farbe', '#FFFAFA');

Es wäre schön, wenn Ihr einen Post macht, warum Ihr Eure Lösung ausgewählt habt. Ich überlege nämlich für die Zukunft zu wechseln und evtl. auf XSLT umzusteigen. Im Moment bin ich mit vLIB (http://lamp.clausvb.de/index.php?menuid=138) und TBS (http://lamp.clausvb.de/index.php?menuid=144) ganz zufrieden.

Gruß
Claus

nEox
12-11-2005, 14:04
Hallo Claus,

meine Antwort war "ja, mit einer Eigenentwicklung", dieses ist allerdings nicht ganz korrekt aber dazu komme ich gleich.

Bisher konnte ich nur mit Smarty praktische "Templateerfahrung" machen, allerdings sind die restlichen Templatesysteme meines Wissens nach recht ähnlich aufgebaut. Bei allen genannten Templatesystemen handelt es sich um Systeme die die Syntax von PHP durch eigene Platzhalter ersetzen.

Überzeugt haben mich diese Systeme allerdings nicht, da bis auf sicherheitstechnische Gründe alle "Vorteile" im praktischen Einsatz nichts bringen.

Oft wird als Vorteil der Templatesysteme genannt, dass sie Design und Logik trennen. Dem stimme ich auch zu, allerdings braucht man dazu kein System welches die PHP-Syntax ersetzt.

Weiterhin muss bei den Templatesystemen eine neue Sprachsyntax gelernt werden bevor man sie verwenden kann.

Als weiteres Argument für Templatesysteme gilt, dass dadurch Designer einfacher an Webseiten arbeiten können, da kein PHP-Code vorhanden ist.
Allerdings besitzt das Templatesystem (zumindest Smarty) oft soviel Möglichkeiten die bereits Programmlogik darstellen das es für den Designer keinen Verständinsvorteil bringt und schneller hat der Programmierer die "Programmlogik" auch nicht wieder eingebaut falls sich das Design komplett ändert.

Wie angedeutet sind solche Systeme nur sinnvoll wenn aus Gründen der Sicherheit, also z. B. ein Zugriff auf die Templates von einer unbekannten Person nötig ist, und im Template nur auf gewisse Bereiche der Programmlogik zugegriffen werden darf.

Nun zu der Lösung die mir besser gefällt. Dabei wird eine Klasse verwendet die ein Objekt "Page" erzeugt. Nun können in der PHP-Programmlogik (Logik und Ansicht getrennt) Inhalte und weitere Objekte diesem "Page"-Objekt zugewiesen werden.

Code-Beispiel:


// Beispiel für Inhalt
$Page->addVar("Title", "Seitentitel");

// Beispiel für Objekte
$Page->registerObject( "ShoppingCard", new ShoppingCard );

Diese Inhalte können nun im Template (also der Ansicht) genutzt werden.

Code-Beispiel (header.tpl):


<html>
<head>
<title><?php print $this->Title; ?></title>
<!--
oder in ShortTag-Schreibweise
-->
<title><?=$this->Title ?></title>
</head>

Die Templates müssen nun von der Programmlogik geladen werden.

Code-Beispiel:


$Page->Display("header.tpl");

Genauso können weitere Inhalte und Objekte im Template verwendet werden wenn die Objekte in der PHP-Logik dem "Page" Objekt zugewiesen worden sind. Beispielobjekte könnten sein: MetaTag, ShoppingCard, User...

Diese "Lösung" ist vom Grundgedanken her auch ein Template, verwendet allerdings nicht die meiner Meinung nach unnötige Syntax-Änderung.

So das wars dann auch schon, blos nicht mit Kritik an dieser Lösung zurückhalten, würde gerne wissen was ihr davon haltet :)

Grüße,
nEox

undefined
12-11-2005, 15:40
Das ist für mich eher eine reine frage der Projektgröße und des Preises ;)

oracle2025
12-11-2005, 20:08
Ich hab neulich mal ausprobiert mittels output buffering ein TemplateSystem zu bauen, bei dem die Templates selbst PHP Dateien sind, ähnlich wie bei nEox.

Ist eigentlich keine schlechte Sache, wieso sollte man auch umständlich eine Funktion implementieren die ohnehin schon Bestandteil der Sprache ist.

ClausVB
13-11-2005, 01:46
Folgender Ansatz ähnelt dem von nEox ein bißchen:
http://www.massassi.com/php/articles/template_engines/

Ich teste das mal demnächst.

Smarty ist IMHO mit Features überladen, kann dann wiederrum allerdings kein $result aus einem RDBMS ausgeben.

vlibTemplate kann nur IF-Strukturen und INCLUDE im Template. Der Rest (Programmierlogik) muss im PHP-Skript geschehen. So finde ich das auch richtig.

TBS geht einen ganz anderen Ansatz. Es hat keine LOOP oder Sections im Template. Es definiert einen Block in dem es in einen HTML-Tag verankert wird:

<table width="200" border="1" align="center" cellpadding="2" cellspacing="0">
<tr bgcolor="#CACACA">
<td><strong>Country</strong></td>
<td><strong>Prefix</strong></td>
</tr>
<tr bgcolor="#F0F0F0">
<td>[blk1.key;block=tr]</td>
<td>[blk1.val]</td>
</tr>
<tr bgcolor="#E6E6E6">
<td>[blk1.key;block=tr]</td>
<td>[blk1.val]</td>
</tr>
<tr bgcolor="#FFCFB9">
<td colspan="2">[blk1;block=tr;nodata]There is no data. </td>
</tr>
</table>

Die Idee finde ich eigentlich ganz interessant. Bei schwierigen Templatestrukturen wird TBS allerdings sehr kompliziert.

Gruß
Claus

elrond
14-11-2005, 09:55
ich arbeite mit einer modifizierten version vom guten alten FastTemplate und bin damit sehr zufrieden. Da ich die Logik, auch die des Aufbaus von Tabellen usw. direkt im Code habe und auch haben möchte, reicht mir ein einfaches Template-System, dass letztlich _nur_ im vorgegebenen html-code platzhalter ersetzt.

ClausVB
15-11-2005, 22:34
ich arbeite mit einer modifizierten version vom guten alten FastTemplate und (...)
Nur zur Info: Ich habe FastTemplate auch mal verwendet, aber es ist ultra-langsam (siehe Benchmarks (http://vlib.clausvb.de/benchmarks/tpl_bench_1.php)), andererseits ist das auch nicht so schlimm, weil es bei vielen PHP-Skripten bzw. privaten Seiten keinen Unterschied macht, ob eine Template Engine 26ms länger braucht als die andere.

Gruß
Claus

elrond
16-11-2005, 07:05
Ich benutze das FastTeplate auch in umfangreichen Projekten (CRM, Spielgemeinschaftssystem usw.). Wenn bisher irgendwo ein Performance-Problem auftrat, dann lag das idR. an ungeschickter Abfrage der DB oä. Mit dem Template-System hatte ich bisher noch keine derartigen Probleme.

Turbohummel
16-11-2005, 08:28
Von den fertigen Template-System ist FastTemplate das mit Abstand schnellste, wenn man es richtig einsetzt (nicht so wie in diesem Benchmark). Nur SmartTemplate ist halbwegs in Reichweite von FastTemplate

Smarty ist, wie schon gesagt wurde, völlig überladen.


vlibTemplate kann nur IF-Strukturen und INCLUDE im Template. Der Rest (Programmierlogik) muss im PHP-Skript geschehen. So finde ich das auch richtig.

Und das is schon zu viel. Ich möchte jedenfalls meinen Designer (völlig Programmier-Unbegabt) nicht zumuten, erst was über schleifen etc. zu lernen.

Ich arbeite mit einem Block-Konzept ähnlich wie die PHPlib, nur kompiliere ich die einzelnen Blöcke in Funktionen. Dadurch is mein System noch ein wenig schneller als FastTemplate und "Designerfreundlich".

Die Anzeigenlogik (Listenausgabe ect.) erledigt bei mir eine eigene Applicationlayer, die For-Schleifen, Ifs enthält.

Ohne Templatesystem möchte ich jedenfalls nichts mehr coden.

ClausVB
16-11-2005, 11:42
Von den fertigen Template-System ist FastTemplate das mit Abstand schnellste, wenn man es richtig einsetzt (nicht so wie in diesem Benchmark). Nur SmartTemplate ist halbwegs in Reichweite von FastTemplate
Ich glaube Du hast unrecht. Folgender Code stammt von der Webseite, wo man FastTemplate herunterladen kann:

<?
include("class.FastTemplate.php3");
$tpl = new FastTemplate("/path/to/templates");
$tpl->define( array( main => "main.tpl",
table => "table.tpl",
row => "row.tpl" ));


$tpl->assign(TITLE,"FastTemplate Test");


for ($n=1; $n <= 3; $n++)
{
$Number = $n;
$BigNum = $n*10;
$tpl->assign( array( NUMBER => $Number,
BIG_NUMBER => $BigNum ));


$tpl->parse(ROWS,".row");
}
$tpl->parse(MAIN, array("table","main"));
Header("Content-type: text/plain");
$tpl->FastPrint();
exit;
?>

Der von mir verwendete Benchmark:


function fast_1_1()
{
$tpl = new FastTemplate('fastTemplate'); // template dir

$tpl->define(array('main'=>'test_1_1.html'));

for ($i = 0; $i < 20; $i++)
{
$tpl->assign(array("var$i" => '-- TEST VAR --'));
}

$tpl->parse('main', array('main'));
$tpl->FastPrint();
}

Ich finde schon, dass ich mich am Beispiel orientiert habe.

Außerdem habe ich mal mit Sebastian Bergmann (ein Entwickler von PHP und dem "Hardened PHP Project") gesprochen und er war auch der Meinung, das FastTemplate langsam ist, weil es von einer PERL-Klasse abgeleitet wurde.

Quot erat demonstrandum! :-)

Gruß
Claus

Turbohummel
16-11-2005, 18:14
Ich hab jetzt keinen Bock den Artikel rauszukramen, aber in einem der letzten 5 PHP-Magazine war ein Benchmark, der FastTemlate direkt hinter SmartTemplate gesehen hat.

Ich hab meine Fast-Template-Version natürlich mächtig abgespeckt.