yubb.de-Logo
Tutorials
yubb@yubb
yubbService
Inside yubb

"Easy Templates" mit PHP

Ein Templatesystem in PHP, simpel programmiert - einfach in der Anwendung

Was sind Templates?

Bestimmt hat jeder schon mal davon gehört: Templates.
Ein gutes Templatesystem kann dem Programmierer / Webmaster viel Arbeit abnehmen und trägt dazu bei den (PHP-)Programmcode klar und sauber von der (HTML-)Ausgabe zu trennen.
Es gibt dutzende Möglichkeiten ein Templatesystem zu implementieren, aber das Prinzip ist immer gleich. Es wird eine HTML-Datei erstellt, dessen Layout auf mehreren oder sogar allen Seiten einer Webseite verwendet werden kann. Um dieses Layout nicht jedesmal neu zu schreiben, verwendet man diese HTML-Datei als Template.
Dieses Template entspricht nahezu komplett einer normalen HTML-Datei, der einzige Unterschied besteht darin, dass die Texte, Bilder und Dokumente, die später auf der Webseite angezeigt werden sollten, durch Platzhalter ersetzt werden. Diese werden durch eine bestimmte Syntax hervorgehoben. Zum Beispiel kann der Name des Platzhalters durch geschweifte, eckige Klammern oder aber auch andere Zeichen (wie zB. Prozentzeichen) eingeschlossen werden.
Hier nun ein Beispiel für eine mögliche Template-Datei:

template.html:

<html>
<head>
<title>%titel%</title>
</head>
<body bgcolor="%hintergrundfarbe%">
<h1>%überschrift%</h1><br>
%text%
</body>
</html>


In diesem Beispiel sind die Platzhalter titel, hintergrundfarbe, überschrift und text enthalten. Die Namen der Platzhalter können aus nahezu jeder beliebigen Zeichenfolger mit beliebiger Länge (oder auch Kürze) bestehen. Jedoch sind aussagekräftige Namen klar von Vorteil. Die einzigen Zeichen, die nicht im Namen des Platzhalters auftauchen dürfen, sind selbstverständlich die Zeichen, die ihn umschließen. Im Falle des Beispiels oben sind das also Prozentzeichen (%).

Realisierung eines Templatesystems

Da nun geklärt ist, worum es hier eigentlich geht, können wir langsam anfangen, uns darüber Gedanken zu machen, wie man ein solches Templatesystem mit PHP realisieren kann. Die Situation ist klar - wir haben eine HTML-Datei mit Platzhaltern, welche darauf warten, durch gewisse Strings ersetzt zu werden. Außerdem muss dann auch noch alles korrekt ausgegeben werden. Also haben wir einen Plan:

1. Template-Datei (HTML-Datei) laden
2. Platzhalter durch gewünschte Inhalte ersetzen
3. HTML-Code samt nun korrektem Inhalt ausgeben

Dabei ist der erste Punkt noch die am leichtesten zu lösende Aufgabe.
Da wir unser Templatesystem in eine Klasse kapseln wollen, benötigen wir zum Speichern der Template-Datei als erstes mal eine Variable:

Code:
var $strTemplate;


Um diese Variable nun mit einer beliebigen Template-Datei zu füllen, schreiben wir uns nun eine kleine Methode namens Load($file_path):

PHP-Datei:
1
2
3
4
5
6
7
8
<?php
function Load($file_path// Lädt Template-Datei und speichert sie ab
{
 
$fp fopen($file_path,"r"); // Datei zum Lesen öffnen
 
$this->strTemplate fread($fp,filesize($file_path)); // und einlesen
 
fclose($fp); // Danach den File-Stream wieder schließen
}
?>


So, der erste Schritt wäre damit schonmal getan. Wir können nun jede X-beliebige Template-Datei in die Member-Variable $strTemplate einlesen. Kommen wir also zum Schritt Nr. 2, ersetzen wir die Platzhalter.
Dafür schreiben wir gleich die nächste kleine Methode namens Replace($needle,$replacement). Sie sucht nach dem Platzhalter mit dem Namen $needle und ersetzt diesen anschließend durch $replacement.

PHP-Datei:
1
2
3
4
5
6
<?php
function Replace($needle,$replacement// ersetzt $needle durch $replacement
{
    
$this->strTemplate str_replace("%".$needle."%",$replacement,$this->strTemplate);
}
?>


Die Funktion Replace(...) sucht dabei nach Platzhaltern, die mit Prozentzeichen markiert wurden. Natürlich kann man hier je nach Geschmack (und vorliegendem Template) andere Zeichen wählen.

Kaum zu fassen, aber im Grunde genommen sind wir schon fertig. Aber aus rein formellen Gründen hier noch die Methode die für uns Schritt 3, also die Ausgabe des bearbeiteten Templates, übernimmt:

PHP-Datei:
1
2
3
4
5
6
<?php
function Display() // gibt Template aus
{
 echo 
$this->strTemplate;
}
?>


Damit wären alle drei Schritte zum Templatesystem geschafft. Wir können nun also Templates laden, enthaltene Platzhalter ersetzen und das fertige und überarbeitete Template ausgeben. Da ich vorhin von einer Kapselung dieser Funktionen in eine Klasse sprach, folgt nun der Vollständigkeit halber noch die komplette Definition/Deklaration der Klasse und ein kleines Anwendungsbeispiel (basierend auf dem Beispiel-Template weiter oben).

PHP-Datei:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
class CTemplate
{
 var 
$strTemplate// speichert Template-Datei

 
function Load($file_path// Lädt Template-Datei und speichert sie ab
 
{
  
$fp fopen($file_path,"r"); // Datei zum Lesen öffnen
  
$this->strTemplate fread($fp,filesize($file_path)); // und einlesen
  
fclose($fp); // Danach den File-Stream wieder schließen
 


 function 
Replace($needle,$replacement// ersetzt $needle durch $replacement
 
{
  
$this->strTemplate =  str_replace("%".$needle."%",$replacement,$this->strTemplate);
 }

 function 
Display() // gibt Template aus
 
{
  echo 
$this->strTemplate;
 }
}

#Anwendungsbeispiel=====================================

$T = new CTemplate();

$T->Load("templates/template.html");

$T->Replace("titel","Meine Homepage");
$T->Replace("hintergrundfarbe","white");
$T->Replace("überschrift","Meine Homepage - Startseite");
$T->Replace("text","Wilkommen auf meiner neuen Homepage...");

$T->Display();
?>


Nun ist unser grundlegendes Templatesystem fertig. Einfach, oder?

Geschrieben von Mathias am 29.08.2004 (15538x gelesen)
weiterempfehlen weiterempfehlen   Druckversion Druckversion   kommentieren kommentieren

Ah, nun weiß ich endlich mal, wie dieses Mailscript funktionierte. XD
Geschrieben von nameless-one
ich finde da Smarty (=> http://samrty.php.net ) um einiges einfacher ^^
Ist zwar ganz gut und so, aber mir gefällt das nicht, dass das Template zuerst geloaded werden muss ;)
Geschrieben von michi
Klar, das geht auf die Performance@ michi
Geschrieben von Phil Marx
@michi

Also lieber vorher sämtliche Variablen, die meist um ein vielfaches größer sind als das eigentliche Template, in die interne Liste der Smarty-Template-Engine umkopieren?
Und was die Einfachheit angeht, EASY TEMPLATES benutzt insgesamt 3 verschiedene Funktionen, viel simpler gehts wohl kaum! Trotzdem danke für das "ganz gut und so". ;-)

@Phil Marx

Ich hoffe dein "das geht auf die Performance" war ironisch gemeint, denn sonst tust du mir echt leid.
Geschrieben von Mathias
Ein Zusammenfriemeln aus diversen Dateien geht auf die Dauer gesehen mehr auf die Performance als wenn man einfach eine Datei aufruft.

Und genau das macht Smarty: Überprüft, ob die Dateien neuer sind, wenn nicht, wird aus dem Cache geladen.
Geschrieben von Phil Marx
@Phil Marx

Das ist durchaus richtig, allerdings handelt es sich bei diesem Tutorial um ein "Beginner-Tutorial" und soll lediglich die Grundlagen (also auch eine grundlegende Implementierung) von Templates demonstrieren. Logischer Weise wird hier noch nicht viel weiter gedacht...also habe ich "komplexere" Dinge wie die Optimierung der Grundidee, Caching usw. rausgelassen. Immerhin heißt das Tutorial ja auch "EASY TEMPLATES".

Wie auch immer, so oder so danke für eure Kommentare.
Geschrieben von Mathias
Mein System funkt ähnlich, ich verwende allerdings keine Klasse, sondern baue ein Array mit zusammen, die str_replace-Funktion wird dann genau einmal aufgerufen.
Geschrieben von René
Hi, danke für da kleine tutorial oder beschreibung. Hat mich echt weitergebracht.
Danke Danke Danke
Geschrieben von Dragon
So gehts doch noch mehr "EASY":

$file = file_get_contents('datei.txt');
$file = str_replace('%laber%', 'mein_text');
echo $file;

Mehr nicht...
Geschrieben von LLCoolDannY
jo. sehr schön.
aber kann mal einer ein tutorial schreiben, in der auch schleifen innerhalb templates erklärt werden?
ich will sowas auch machen (in delphi :) ) aber hab keinen plan, wie man sowas realisieren kann.

danke und gruß der guerda.
Geschrieben von guerda
Super tut. !
Da steht wenigstens in dem ersten Beispiel das die Datei template.html heist.
Und die anderen was soll das sein da steht php aber was ? index.php die nächste template.php usw ?
Wäre nett wenn man die datei namen dazu schreiben würde.#

mfg
Porto
Geschrieben von porto
Also ich muss sagen, es is vielleicht kein Template das man in der praxis gut ausreizen kann, meinetwegen sagen manche es sei zu sehr performance trächtig....
aber nu versteh ich wenigstens wie templates funktionieren..
:-)
danke...
Geschrieben von Julied
Ist es denn auch möglich statt einem Text eine HTML Datei einfügen zu lassen?
Geschrieben von Gabraham-Himself
Ah, habs schon.
Großartiges Tutorial ;)
Geschrieben von Gabraham-Himself
Hi, so etwas suche ich schon die ganze Zeit. Aber ich komme mit dem Tutorial nicht ganz klar: Mir ist nicht klar, in welche Datei ich das gnaze schreibe. Lege ich eine neue an oder wie geht das? Ich wäre echt froh, wenn mir das jemand sagen könnte.

Grüße
Geschrieben von noname
Der letzte kommentar ist zwar schon ne Weile her, aber das tut ist trotzdem gut.
Aber solche Komentare stinken:

Ist es denn auch möglich statt einem Text eine HTML Datei einfügen zu lassen?
Geschrieben von Gabraham-Himself
Ah, habs schon. Großartiges Tutorial ;)
Geschrieben von Gabraham-Himself

Ich habs nämlich nicht rausgefunden.
Kann noch jemand helfen?
Geschrieben von Blasehase
Würde gerne wissen wie ich das aus ner datenbank auslesen lasse ... hab da nämlich so meine probleme will das grad in ein CMS einfügn das ich geproggt habe aber da kommt wenn ichs auf meine weise mache nur "Resource id #7" - was mir nicht sehr weiter hilft
Geschrieben von Jojo2020
kann auch nur sagen: super tutorial... Es geht hier ja auch erstmal drum die grundlagen zu verstehen...

@Jojo2020
Wenn du's aus MySQL ausliest würde ich das so machen:

while schleife nehmen und die reihen/zeilen abfragen....

deine erste Spalte könnte ja zB "id" heißen.
if($Deine_zugewiesebe_DB->id==$die_seite_von_der_du_die_daten_brauchst) {
$titel=$Deine_zugewiesebe_DB->titel;

usw. usw.

}

Dann:

$T->Replace("titel","$titel");

So... müsste gehen... bei fragen einfach mailen, ich beiß ned... Isch ja schließlich weihnachten und das Fescht der liebe^^
Genug humor... ich hoffe du weißt wie man MySQL datenbanken ausliest, sonst auch einfach melden...

Grüßle Sebba
Geschrieben von Sebba
Hallo
Es wurde schonmal gefragt wie man HTML-Seiten einbindet...
Kann mir das auch mal einer erklären
Geschrieben von alex
Ich find das Tut super. Ist mal ne Abwechslung was zu verstehen^^.
Geschrieben von Trion
Ist es auch möglich damit sowas wie <?php include "abc.php"; ?> einzubinden? Wenn ja Wie?
Geschrieben von Mr.Goro