0251 / 590 837 15
info@a-coding-project.de

Smarty – Die PHP Template-Engine

Heute möchte ich euch Smarty vorstellen. Das ist eine Template-Engine in PHP, mit welchem es leichter ist Logik und Darstellung zu trennen. Dabei werden Template-Dateien (HTML) mit Variablen ausgestattet, die dann durch Smarty ersetzt werden.

Das Besondere dabei ist, dass man mit Smarty, oder Template-Engines im Allgemeinen, fast schon dazu gezwungen ist Logik und Darstellung zu trennen. Es erleichtert auch die Zusammenarbeit mit externen Designern, die sich in dem Falle nicht direkt mit PHP auseinander setzen müssen und so zum Beispiel parallel zur Entwicklung des PHP-Codes arbeiten können.

Möglichkeiten

Smarty ist bereits seit 2001 auf dem Markt und wurde stets weiterentwickelt. Deswegen bietet es eine Vielzahl an Möglichkeiten, auf die ich hier natürlich nicht alle eingehen kann. Dafür gibt es aber die deutschsprachige Smarty-Dokumentation.

  • Variablen Zuweisen
  • Includes
  • Bedingungen
  • Schleifen
  • Caching
  • Debugging
  • und vieles mehr…

Variablen zuweisen

Das Zuweisen von Variablen dürfte wohl die wichtigste Funktion von Smarty sein. In meinem Beispiel möchte ich eine Detailseite für mein Auto machen. Ich erweitere einfach den Demo-Ordner, der beim Download dabei ist. Ich lege ein neues Verzeichnis namens „code“ an und lege darin meine car.php:

<?PHP
	class Car{
		public $model = "Stilo";
		public $brand = "Fiat";
	}
?>

Mein Template soll ein Objekt dieser Klasse anzeigen. Hierfür muss eine neue Datei in den templates-Ordner angelegt werden. Bei mir heißt sie cardetails.tpl:

<!DOCTYPE html>
<html>
	<head>
		<title>{$car->brand} {$car->model}</title>
	</head>
	<body>
		<p>Autos -&gt; {$car->brand} -&gt; {$car->model}</p>
		<h1>{$car->model}</h1>
	</body>
</html>

In den geschweiften Klammern werden hier die Eigenschaften des Objekts car eingefügt. Neben Objekten ist es auch möglich, Arrays oder „normale“ variablen zuzweisen:

  • {$car.model} würde aus $car[‚model‘] auslesen
  • {$car[0]} würde aus $car[0] auslesen
  • {$car} würde aus $car auslesen

Um das ganze komplett zu machen fehlt noch eine Datei, die dem Template ein Objekt der Klasse car zuweist. Diese wird auch später vom Browser aufgerufen. Meine mycar.php aus dem demo-Verzeichnis:

<?php
	require('../libs/Smarty.class.php');
	require('code/car.php');

	$smarty = new Smarty();

	$car = new Car();
	$smarty->assign("car",$car);

	$smarty->display('cardetails.tpl');
?>

Hier lade ich einfach Smarty, sowie meine car-Klasse. Mit assign wird dann die Variable $car zugewiesen, die ein Objekt meiner Klasse car enthält. Mit display wird dann das Template „cardetails.tpl“ ausgegeben.

Includes

Stell dir einmal vor, wir würden jetzt noch eine Seite machen, in der nun mehrere Modelle aufgelistet werden. Diese soll aber das gleiche Grundgerüst haben wie die Detailseite. Um nicht alles mehrfach schreiben zu müssen kann man an der Stelle includes verwenden. So gliedere ich einfach mal das Grundgerüst der Seite in die basic.tpl aus:

<!DOCTYPE html>
<html>
	<head>
		{include file='cardetails.tpl'}
	</body>
</html>

Mit dem include wird nun aus der basic.tpl die cardetails.tpl gezogen. Ich habe den </head> und <body> in der cardetails.php gelassen, damit man den Head noch erweitern kann. die neue cardetails.tpl sieht dann so aus:

	<title>{$car->brand} {$car->model}</title>
</head>
<body>
	<p>Autos -&gt; {$car->brand} -&gt; {$car->model}</p>
	<h1>{$car->model}</h1>

In der mycar.php muss dann statt der cardetails.tpl die basic.tpl genommen werden:

<?php
	require('../libs/Smarty.class.php');
	require('code/car.php');

	$smarty = new Smarty();

	$car = new Car();
	$smarty->assign("car",$car);

	$smarty->display('basic.tpl');
?>

Caching

Die Trennung von PHP und HTML ist zwar schön und gut, aber es verlangsamt natürlich die Ladezeit der Seite. Durch das Caching kann man diesen Nachteil zumindest verringern. Dabei wird die Seite einmal generiert und eine gewisse Zeit lang zwischengespeichert. Bei neuen Aufrufen wird dann einfach das zwischengespeicherte Template genommen, ohne komplett neu zu parsen.

Um den Cache zu aktivieren muss man die Eigenschaft caching des Smarty-Objekts auf true setzen. Über die Eigenschaft cache_lifetime kann man dann in Sekunden angeben, wie lange die Seite im Cache bleiben soll.

<?php
	require('../libs/Smarty.class.php');
	require('code/car.php');

	$smarty = new Smarty();

	//für eine Minute im Cache halten
	$smarty->caching = true;
	$smarty->cache_lifetime = 60; 

	$car = new Car();
	$smarty->assign("car",$car);

	$smarty->display('basic.tpl');
?>

Debugging

Vielleicht kennst du ja den Befehl print_r, mit dem man Variablen in PHP ausgeben kann. So kann man erkennen, was jetzt zum Beispiel in einem Objekt gespeichert ist. Smarty bietet die Möglichkeit alle Variablen über Javascript (im Popup) ausgeben zu lassen. Setzt man die Eigenschaft debugging auf true, erhält man folgendes Ergebnis:

Smarty Debug Konsole

Smarty Debug Konsole

Fazit

Smarty ist eine umfangreiche Template-Engine für PHP. Vor allen für große Projekte ist es super geeignet. In meinen persönlichen Alpha-Test von ContentLion habe ich herausgefunden, dass die von mir selbst entwickelte Template-Enginge nicht wirklich performant ist – Ich überlege auf Smarty umzusteigen.

Weitere Informationsquellen

Kommentare

Dark-CMS schrieb am 30.07.2011:

kann ich nur empfehlen. zusätzliche vorteile: durch das smartyeigene Pluginsystem haben deine nutzer noch zusätzliche templatevorteile

Ralf Dreiundzwanzig schrieb am 30.07.2011:

die hier gezeigte smarty Version 2.o ist veraltet. Verwende die aktulle Version Handbuch http://www.smarty.net/docs/en/

Stefan Wienströer schrieb am 31.07.2011:

Hab für meine Tests eigentlich die 3.0.8 verwendet.

Dark-CMS schrieb am 31.07.2011:

Der Fehler liegt lediglich in deinem link zur Doku , die existiert aktuell nur in der Smarty-Version 2 in deutsch

Daniel schrieb am 03.08.2011:

Wir können sie ja übergangsweise benutzen. Solang wie unsere den Anforderungen noch nicht genügt. ;-)

Dark-CMS schrieb am 03.08.2011:

wenn mans richtig nimmt ist smarty auch nur eine grundversion, man bastelt sich nachher sowieso einiges zurecht

ContentLion und Smarty? | Stefan Wienströer schrieb am 05.08.2011:

[...] einigen Tagen habe ich in meinen Blog den Artikel Smarty – Die PHP Template-Engine veröffentlicht. Darin habe ich die bekannte Template-Enginge [...]

Andi Petzoldt schrieb am 22.08.2011:

Passend dazu - es gibt auch ein CMS, welches Smarty als Template-Engine verwendet: CMS made simple

Stefan Wienströer schrieb am 22.08.2011:

UNd es gibt eins, was es bald verwenden wird ;-) http://blogs.contentlion.org/stefan-wienstroeer/core/contentlion-und-smarty/

Fahrplan für die Programmierung eines Webprojektes schrieb am 19.11.2011:

[...] letzten Schritt müssen PHP, Html &amp; Co nur noch zusammengepackt werden. Hier ist Smarty eine gute [...]

Knockout! Template-Engine für JavaScript schrieb am 26.01.2014:

[&#8230;] Template Engine für JavaScript? Viele Leute finden ja Smarty schon absolut unnötig, dann noch etwas, was im Browser läuft? Hmm&#8230; SEO-Technisch dürfte [&#8230;]

Tutorial: Erste Schritte mit Facebooks &#8220;Hack&#8221; schrieb am 24.03.2014:

[&#8230;] Übergang von PHP zu HTML wurde von vielen Entwicklern mit Smarty getrennt. In Hack gibt es bereits integrierte Möglichkeiten mit Escapes zu arbeiten. So kann man [&#8230;]