Sie sind hier:  LinkpfeilPowerCMS »TPLE


TPLE - Templateengine

Eingesetzt bei PowerSite 0.82 und irgendwann bei PowerCMS ist diese Klasse klein, kompakt und schnell.

Sie nutzt den Ursprung von PHP aus , denn PHP wurde ursprünglich als Templatesprache konzipiert.

TPLE hat einige Vorteile.
Nicht nur das es klein, kompakt und schnell ist, es ist auch einfach einzusetzen, sehr flexibel und kann wegen der Verwendung der PHP Kontrollstrukturen eine ganze Menge.

Hinzu kommt die wertvolle Eigenschaft, das ein Template direkt verwendet und nicht wie bei Smarty compiliert wird.

Nur 5 Funktionen

Mit nur fünf Funktionen wird der ganze Bedarf bei uns abgedeckt.

assign

Damit werden der Templateengine Werte zugewiesen.

In einem Template macht man das so:

<?php $this->assign('name','wert');?>

In einem Plugin so:

$tpl->assign('name','wert');

Die zugewiesenen Werte stehen in Templates aber auch zur Verfügung.

In einem Template:

$this->VARS['name']

In einem Plugin:

$tpl->VARS['name']

display

Einsatz normal in einem Template oder einem Inhalt,aber auch in Plugins.

Einsatz in einem Template/Inhalt:

$this->display('Pfad des Templates');

Einsatz in einem Plugin:

$tpl->display('Pfad des Templates');

fetch

Der Einsatz kann in Plugins aber auch in Templates oder einem Inhalt erfolgen.

Es erfolgt keine sichtbare Ausgabe, die Funktion dient dazu das Ergebnis in einer Variablen zu speichern und später zu verwenden.

Einsatz in einem Template/Inhalt:

$this->fetch('Pfad des Templates');

Einsatz in einem Plugin:

$tpl->fetch('Pfad des Templates');

varfetch

Der Einsatz kann in Plugins aber auch in Templates oder einem Inhalt erfolgen.

Es erfolgt keine sichtbare Ausgabe, die Funktion dient dazu das Ergebnis in einer Variablen zu speichern und später zu verwenden.

Die Funktion ist ähnlich dem von fetch, jedoch wird der Inhalt einer Variable verarbeitet und nicht ein Template.

Einsatz in einem Template/Inhalt:

$this->varfetch($variable);

Einsatz in einem Plugin:

$tpl->varfetch($variable);

plugin

Diese Funktion dient der Einbindung eines Plugins.

Es gibt einen Wert zurück und macht keine Ausgabe.
Die Ausgabe muss im Template erfolgen.

Beispiel eines Einsatzes des Plugins verboten

<?php $this->plugin('verboten',array("users"=>"demo:demo;"));?>

Es wird der Name des Plugins - hier verboten - übergeben und die Parameter als Array.


Mit diesen wenigen Funktionen bei extrem kompaktem Kode kann alles erledigt werden, was man mit dem erheblich grösseren Smarty machen kann.

Array als Parameter

Diese Form (siehe Aufruf beim Plugin verboten) ist auf dem ersten Blick etwas ungewöhnlich, besonders für Smarty-Kenner.
Diese müssen aber wissen, das der Aufruf eines Smarty - Plugins nicht PHP - Konform ist, deshalb lassen sich diese Plugins auch nicht direkt aufrufen.
Dort wird z.B. name='Name' wert1='wert1' wert2='wert2' etc. vorgegeben und vom Smarty - System komplett bei der Compilierung übersetzt.

Bei TPLE gibt es aber keine Compilierung.

Es gibt dann nur 2 Möglichkeiten bei PHP - jeder Parameterwert in eine eigene Variable, was aber bedeuten würde, dass jeder Einsatz voll zu spezifizieren ist, oder alles in eine Variable als Array.
Die Standardmethode hat den Vorteil, das nur die Parameter übergeben werden müssen, die vom Default abweichen.

Das ist der Grund warum wir diese Methode gewählt haben.

Kontrollstrukturen in Templates

Hier ein Beispiel aus einem Template (die Login-Logoutsteuerung aus dem Gästebuch:

<div id="loginlogout">
<?php if ($this->VARS['ist_admin']):?>
<p>
<a href="#" onclick='xajax_ajaxlogout("<?php echo $this->VARS['ist_admin'];?>");return false;'>Logout</a>
</p>
<?php else:?>
</p>
<a href="#" onclick='xajax_ajaxlogin("<?php echo $this->VARS['ist_admin'];?>");return false;'>Login</a>
</p>
<?php endif;?>
</div>

Und nun das noch einmal verkürzt:

<?php if ($this->VARS['ist_admin']):?>
<?php else:?>
<?php endif;?>

Unter Smarty würde das so aussehen:

{if $ist_admin}
{else}
{/if}

Das sieht bei Smarty also anders aus, schaut man sich jedoch das kompilierte Ergebnis von Smarty an, dann ist das gleich.

Hinweise von PHP

Bei PHP gibt es ausführliche Informationen zum Syntax der verwendbaren Kontrollstrukturen.

Foreach Schleifen im Vergleich

Hier TPLE:

foreach ($this->VARS['gbook_list'] as $entry):?>
<?php endforeach;?>

Und nun Smarty:

{foreach from=$gbook_list item=entry}
{/foreach}

Variablenausgabe

Zur Variablenausgabe genügt es nicht einfach die Variable anzugeben, da man sich auf PHP Ebene befindet.
Würde man es so machen, dann erfolgt keine Ausgabe !
Es muss also ein PHP Befehl zur Ausgabe mit angegeben werden !

<?php echo $this->VARS['name_der_variable'];?>

Unter Smarty würde ein {$name_der_variable} genügen, da Smarty dies mit der Kompilierung in genau die gleiche Form umsetzt.

Unter TPLE kann alles eingesetzt werden, was unter PHP eine Variablenausgabe erzeugt, es muss nicht immer echo sein.

Direkter PHP Einsatz in Templates

Der ist unter Smarty nur möglich, wenn er ausdrücklich frei geschaltet wurde.

Unter TPLE ist er jederzeit möglich.

<?php meine php Anweisung;?>

Wenn Sie eigene Variable in Templates definieren und verwenden, benutzen Sie für die Variablen einen Prefix, damit diese Variablen keine Systemvariablen überschreiben !

Direkte Variablenbildung in Templates

Wenn Sie Variable in einem Template direkt bilden wollen bzw. eine Variable durch eine Zuweisung "füllen" möchten, ohne diese an den TPLE Variablenpool ($this->VARS) zu binden so können Sie es jederzeit.

Verwenden Sie dazu möglichst einen Prefix im Variablennamen, damit diese Variabale auf keinen Fall vorhandene überschreibt !

Modifikatoren

Unter Smarty mussten Modifikatoren extra als Plugin ausgeführt werden.
Erst die Bekanntgabe der Smartytricks wurde man im großen Stil darauf aufmerksam, das man auch in vielen Fällen PHP Funktionen einsetzen kann.

Da unter TPLE alles eingesetzt werden kann, was PHP bietet, gibt es für TPLE keine solchen Plugins, da absolut überflüssig.

Plugin API

Die Plugins für TPLE sind ganz normale PHP Funktionen, die als PHP - Datei unter dem gleichen Namen wie die Funktion selbst im Ordner plugins abgelegt werden.
Das ist schon einmal sehr viel einfacher als bei Smarty.

Beispiel:

function random_picture($params)
{
global $tpl;
$subdir= isset($params['subdir'])?$params['subdir']:'Defaultwert';
}

Normal gibt es nur eine Parametervariable, die ein Array enthält. Man kann auch einzelne Variable einsetzen, dann ist man jedoch gezwungen, das Plugin voll spezifiziert aufzurufen.
In dieser Form können sich in $params unendlich viele Einzelwerte enthalten, die über die Form

$subdir= isset($params['subdir'])?$params['subdir']:'Defaultwert';

den einzelnen internen Funktionsvariablen zugewiesen werden können um bei nicht vorhandenen Werten zu.B. auch einen Defaultwert zu setzen.

Die Verbindung zur eigentlichen Datenbankklasse geschieht über:

global $tpl;

Es ist gut zu erkennen ,das die API sehr einfach ist und es auch PHP Anfängern ermöglicht eigene Plugins schnell zu erstellen.

Hinweise

Wenn ihr Plugin einen Wert nur mit return ausgibt, dann erfolgt im Template keine Werteausgabe. Return wird normal dazu benutzt um eine Werteübergabe zu veranlassen.
Sie müssten , wenn eine sichtbare Ausgabe erfolgen soll das in dem Plugin mit einer echo - Anweisung machen, oder bei einem Return eine echo - Anweisung im Zusammenhang mit dem Plugin setzen.

Alles ist ein Template

Unter TPLE wird buchstäblich alles als ein Template angesehen, egal ob es nun ein "echtes" ist oder eigentlich ein Inhalt oder eine Meta - Datei.

Der Grund dafür ist einfach - in jedem Inhalt können und dürfen TPLE - Aufrufe enthalten sein.

Debug in Templates

Unter Smarty setzt man ein {debug} ein um in einem Popup - Fenster die an Smarty zugewiesenen Werte sichtbar zu machen.

Das ist unter TPLE völlig überflüssig.

Um die Werte sichtbar zu machen genügt ein

<?php var_dump($this->VARS);?>

an der gewünschten Stelle.

Noch besser wird es , wenn man sich den Inhalt eines bestimmten Wertes anzeigen lassen möchte:

<?php var_dump($this->VARS['name_der_variable');?>

und das direkt vor der Stelle ausgeben lässt, wo sie normal benötigt wird, dann hat man auch einen optischen Bezug.

TPLE vs Smarty

Das Smarty eine Lösung ist, aber im Grunde völlig überflüssig, das weiss ich schon seit längerer Zeit.

Auslöser war mal ein Beitrag den ich hier mal zitieren möchte.


Ich habe längere Zeit Smarty extensiv genutzt und dachte tatsächlich immer,
dass Smarty wirklich unglaublich toll und praktisch ist. Nachdem ich dann
mal etwas nachgedacht habe, erkannte ich plötzlich, dass Smarty und andere
Static-Template-Engines für so ziemlich alle Zwecke, was PHP anbelangt, im
Grunde genommen vollkommener Blödsinn sind.



Der gute Mann hatte Recht.

Was macht Smarty eigentlich ?

Man schreibt Templates mit einer Smarty eigenen Scriptsprache, schreibt Plugins nach einem Smarty eigenem Syntax die durch Kompilierung wieder in das umgesetzt werden, was man auch direkt könnte.

Die Nachteile liegen auf der Hand.

  • Es muss die Smarty Scriptsprache erlernt werden.
  • Es muss der Smarty Syntax erlernt werden.
  • Alle Vorteile der Direktnutzung von PHP können nicht oder nur nach Freigabe und das nur eingeschränkt genutzt werden.
  • Eingebundene Teile die { oder } enthalten sind nur mit Sonderbehandlung machbar.
  • Ausgabenmodifikationen erfordern Plugins - PHP Funktionen sind dazu nur eingeschränkt nutzbar.
  • Templates müssen immer kompiliert werden.
  • Bei jeder Nutzung prüft Smarty ob es eine kompilierte Version gibt.
  • Die Abschaltung des compile_checks in komplexen Systemen ist überhaupt nicht machbar.
  • Bei jeder Nutzung muss also auch überprüft werden, ob das Erstellungsdatum eines Templates identisch ist mit der kompilierten Version, ansonsten muss die Kompilierung erfolgen.
  • Durch die Kompilierungsmechanismen entsteht bei einer Datenbanknutzung eine ungeheure Flut von Abfragen.
    Der Grund ist simpel - Smarty wurde für externe Templates konzipiert.
    Werden Daten in einer Datenbank gehalten, muss man jeden betroffenen Datensatz holen um auf Grund des letzten Modifizierungsdatums festzustellen ob sich da etwas geändert hat und ob man neu kompilieren muss.
    Werden in solchen Datensätzen ebenfalls Smartytags eingesetzt, die widerum auf Datenbankinhalte zugreifen, werden die Zugriffe von der Anzahl astronomisch im Verhältnis zur vielleicht harmlosen Ausgabe.
    Systeme wie CMSMS die in sich bereits alles andere als optimiert sind, haben dann auf einmal zig Abfragen wo man sich fragt wo kommen die her und was soll das.
  • Durch die Kompilierungsmechanismen entstehen in großer Anzahl und das wachsend kompilierte Dateien, wo es nur eine Zeitfrage ist, wann alles langsamer wird.
  • Und das alles nur um letzten Endes eine ähnliche Funktion ablaufen zu lassen, wie es TPLE direkt macht.
  • Die von Smarty angebotene Cache - Funktion ist in komplexen Systemen nicht nutzbar !

Unter TPLE sind alle Templates und Inhalte PHP - Dateien , auch wenn dort u.U. keine Zeile PHP enthalten ist, sie werden nur als PHP gespeichert.

Damit können sie aber auch ganz einfach mit include von PHP eingebunden werden.

Das gilt auch für Plugins , die werden mit include eingebunden, über die TPLE plugin - Funktion mit den Parametern versorgt und ausgeführt.

Es gibt also keine Kompilierung, alles steht unmittelbar zur Verfügung und wird ausgeführt.

Weil es keine Kompilierung gibt, entstehen auch die oben beschriebenen Nachteile nicht - alles wird erheblich schneller.

Und nicht nur das - Smarty muss als Programm einen erheblichen Aufwand betreiben, erfordert einen ziemlichen Programmcode und damit auch eine Menge an RAM.

Fazit

Smarty und ähnliche Systeme sind komplett überflüssig.

"Alle" Welt schreit nach neuen Funktionen wie sie z.B. unter PHP 5 (und auch in PHP 6) realisiert sind, die aber wegen der Restriktionen bei Smarty in einem der wichtigsten Bereiche eines Web's, nämlich der Aufbereitung der Ausgabe, nicht einsetzbar sind - das ist völlig überholt !

Warum sollte man überhaupt auf PHP in den Templates verzichten ?

PHP ist auch unter Webdesigner sozusagen eine Pflichtübung die man beherrschen muss.

Natürlich wirken die Vorteile von TPLE auch auf hoch performante Systeme wie PowerCMS - wie der Blick auf PowerCMS 2.0 E zeigt und zwar verblüffend !.

 

Letzte Änderung auf dieser Seite am: 30.03.2008 12:38:48


Vorherige Seite: LinkpfeilHauptemplates PCMS  | Nächste Seite: LinkpfeilSiteMap