Zur Startseite Eine beliebte Anwendung für die Dateifunktionen von PHP ist das Content-Management unter Verwendung von Templates. Hier wird das Design (hier in Form einer HTML-Datei) vom Inhalt (hier in Form einer Text-Datei) streng getrennt.
Die Vorteile liegen auf der Hand: Der Designer kann sich ganz auf die Gestaltung der Seite konzentrieren. Dort wo später die eigentlichen Texte erscheinen sollen, werden einfache Platzhalter wie {header} oder {title} verwendet.
Advertisement/WerbungAnmerkung: Die hier vorgestellten Beispiele sollen lediglich das Prinzip verdeutlichen. Bei einigen Einzelheiten würde man in einer endgültigen Anwendung möglicherweise anders vorgehen. Sie dienen hier lediglich als Beispiele, damit das Verfahren anschaulich erläutert werden kann. In meinen Online-Kursen wird selbstverständlich genauer auf Einzelheiten eingegangen.
Der Autor, der für den Inhalt zuständig ist, kann sich dagegen ganz auf seinen Text konzentrieren, ohne sich zunächst mit HTML auseinander setzen zu müssen. Üblicherweise werden solche Inhalte dann in einer Datenbank gespeichert. Um die Sache zur Übung recht einfach zu halten, soll hier eine einfache Textdatei als Beispiel genügen.
Das Beispiel besteht aus drei Dateien:
Die drei Dateien können Sie als Zip-Archiv herunterladen: Beispiel-Dateien (ZIP)
Advertisement/WerbungZunächst einmal das Template:
<!DOCTYPE HTML
PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
<title>{titel}</title>
<style type="text/css">
<!--
h1 {
background-color:#DDD;
font-size:1.5em;
}
body, p {
font-family: Arial,
Helvetica, sans-serif;
font-size:1em;
}
-->
</style>
</head>
<body>
<h1>{header}</h1>
<p>{absatz}</p>
</body>
</html>
Es handelt sich hier um ganz normales HTML. Die Texte, die später im Skript ausgetauscht werden sollen, wurden durch die Platzhalter {titel}, {header} und {absatz} ersetzt. Hier wird später der Text aus der Textdatei eingetragen. Die Textdatei sieht dann so aus:
titel: Die erste Testseite
header: Willkommen auf meiner Seite
absatz: Das ist ein längerer Text. Wichtig: Die Zeile muss als einzelne Zeile geschrieben werden und darf keine Absätze enthalten. Die Zeile muss als einzelne Zeile geschrieben werden und darf keine Absätze enthalten. Die Zeile muss als einzelne Zeile geschrieben werden und darf keine Absätze enthalten. Die Zeile muss als einzelne Zeile geschrieben werden und darf keine Absätze enthalten. Die Zeile muss als einzelne Zeile geschrieben werden und darf keine Absätze enthalten. Die Zeile muss als einzelne Zeile geschrieben werden und darf keine Absätze enthalten. Die Zeile muss als einzelne Zeile geschrieben werden und darf keine Absätze enthalten. Die Zeile muss als einzelne Zeile geschrieben werden und darf keine Absätze enthalten. Das ist das Ende der Zeile.
Wichtig ist hier, dass die dritte Zeile, die mit "absatz:" eingeleitet wird, aus einer einzelnen Zeile besteht, weil diese Datei in dem Skript zeilenweise ausgelesen werden soll.
Das Skript selbst ist ebenfalls recht einfach gehalten:
<?php
// Konstanten für die Pfade
// und Dateinamen definieren
define(TEMPLATE_PATH,
'c:/projekte/websites/test/template');
define(TEMPLATE, 'template.html');
define(INHALT_PATH,
'c:/projekte/websites/test/template');
define(INHALT, 'inhalt.txt');
// template datei lesen
$template_size =
filesize(TEMPLATE_PATH.'/'.TEMPLATE);
$fp_template =
fopen(TEMPLATE_PATH .'/'.TEMPLATE, 'r');
if (!$fp_template)
{
exit('konnte Template nicht öffnen');
}
$inhalt =
fread($fp_template, $template_size);
// Inhalts-Datei lesen
$fp_inhalt =
fopen(INHALT_PATH.'/'.INHALT, 'r');
if (!$fp_inhalt)
{
exit('konnte Inhalt nicht öffnen');
}
// Inhalt zeilenweise abarbeiten
while(!feof($fp_inhalt))
{
// maximale Zeilenlänge: 1024*1024 Zeichen
$zeile = fgets($fp_inhalt, 1024*1024);
// explode auf 2 Elemente beschränken,
$elemente = explode(':', $zeile, 2);
// Das korrekte Format für den
// PLatzhalter zusammensetzen
$platzhalter = '{'.$elemente[0].'}';
// Platzhalter im Template ersetzen
$inhalt =
str_replace($platzhalter,
$elemente[1],
$inhalt);
}
// und schließlich die fertige Seite anzeigen
echo $inhalt;
Zunächst werden für die Pfade und Dateinamen Konstanten deklariert:
define(TEMPLATE_PATH,
'c:/projekte/websites/test/template');
define(TEMPLATE, 'template.html');
define(INHALT_PATH,
'c:/projekte/websites/test/template');
define(INHALT, 'inhalt.txt');
Das hat den Vorteil, dass Sie später diese Angaben gleich am Anfang des Skriptes jederzeit ändern können, ohne erst im Skript lange herumsuchen zu müssen.
Der zweite Schritt besteht im Einlesen der Template-Datei. Dazu wird zunächst die Dateigröße ermittelt:
$template_size = filesize(TEMPLATE_PATH.'/'.TEMPLATE);
Über die Funktion filesize() erhalten Sie die Größe der Datei in Bytes. Danach wird die Datei über die Funktion fopen() zum Lesen geöffnet:
$fp_template =
fopen(TEMPLATE_PATH .'/'.TEMPLATE, 'r');
if (!$fp_template)
{
exit('konnte Template nicht öffnen');
}
Damit das Skript nicht weiterläuft, falls die Datei nicht vorhanden ist oder aus anderen Gründen nicht geöffnet werden kann, wird der von fopen() zurück gelieferte Wert geprüft. Er sollte eine Ressource für die Datei enthalten oder den Wert false falls das Öffnen nicht funktioniert hat. Im Fehlerfall wird das Skript mit der Funktion exit() abgebrochen.
Wenn die Datei geöffnet werden konnte, wird der Inhalt vollständig in eine Variable eingelesen. Dazu verwenden Sie die vorhin ermittelte Dateigröße:
$inhalt =
fread($fp_template, $template_size);
Dieses Verfahren funktioniert auch bei größeren HTML-Dateien problemlos. Eine HTML-Datei ist in der Regel nicht größer als einige hundert, maximal tausend Zeichen. Gerade bei einem Template ist ja noch kein Inhalt vorhanden, so dass es hier wegen der Größe keine Probleme geben sollte. Die Seite kann also komplett in einer Variable (hier: $inhalt) gespeichert werden.
Werbung für Online-Kurse
Anschließend folgt das gleiche Verfahren noch einmal für die Textdatei, nur dass hier der Text nicht komplett gelesen wird, sondern Zeile für Zeile:
while(!feof($fp_inhalt))
{
// maximale Zeilenlänge: 1024*1024 Zeichen
$zeile = fgets($fp_inhalt, 1024*1024);
Die While-Schleife sorgt dafür, dass der Lesevorgang so oft wiederholt wird, bis das Ende der Datei erreicht ist. Das erkennt man am Rückgabewert der Funktion feof(). Diese Funktion gibt true zurück, wenn das Dateiende erreicht wurde. Durch das Ausrufezeichen (bedeutet: Negation des Ausdruks) wird dieser Wert negiert (also umgekehrt), so dass die Schleife so lange läuft, solange das Dateiende nicht erreicht wurde.
Die Funktion fgets() liest den Inhalt der Datei mit der Ressource $fp_inhalt bis zum Ende der Zeile. Der zweite Parameter ist die maximale Länge der Zeile. Hier wird ein großer Wert angegeben, so dass eine Zeile im Extremfall maximal 1 Megabyte lang sein kann.
Um die Zeile am Doppelpunkt aufzutrennen, wird die Funktion explode() verwendet:
$elemente = explode(':', $zeile, 2);
Diese Funktion trennt alle Elemente in $zeile an dem Trennzeichen ':' auf. Damit diese Auftrennung nur einmal passiert, wird als dritter Parameter eine 2 eingegeben. Damit erfolgt die Trennung nur in zwei Teile. Das ist dann wichtig, falls im Text auch wieder ein Doppelpunkt als Teil des Inhalts vorkommen sollte.
Nun wird der Platzhalter in der richtigen Form zusammengesetzt:
$platzhalter = '{'.$elemente[0].'}';
Dadurch wird aus dem Element 'titel' der Platzhalter '{titel}', wie er auch im Template eingetragen ist.
Im letzten Schritt kann dann der Platzhalter durch den eigentlichen Text ersetzt werden:
$inhalt =
str_replace($platzhalter,
$elemente[1],
$inhalt);
Das übernimmt die Funktion str_replace(), die das Vorkommen des Platzhalters mit dem ausgelesenen Text aus der Datei (also $elemente[1]) ersetzt. Um ganz exakt vorzugehen, müsste man eigentlich noch die eventuell vorhanden Leerzeichen entfernen, die sich durch das aufteilen der Textzeile noch in $elemente[1] befinden.
Ganz exakt müsste es also heißen:
str_replace($platzhalter,
trim($elemente[1]),
$inhalt);
Auf der fertig angezeigten Seite werden Sie vermutlich kaum einen Unterschied erkennen. Die Funktion trim() entfernt überflüssige Leerzeichen am Anfang und Ende des Textes. Auf diese Weise ist es dann gleichgültig, ob die Zeilen in Ihrer Textdatei so aussehen:
titel: Die erste Testseite
oder ob sie so aussehen
titel:Die erste Testseite
Das macht die ganze Anwendung etwas weniger Fehleranfällig, weil Sie bei der Erstellung der Textdatei nicht darauf achten müssen, ob nach dem Doppelpunkt ein Leerzeichen eingegeben wurde oder nicht.
Das gezeigte Beispiel soll aufzeigen, wie einfach der Einstieg in Template-basiertes Content-Management sein kann. Das kleine Skript kann noch kein fertiges CMS-System ersetzen und das soll es auch nicht. Es soll jedoch zeigen, wie sich auch ohne umfangreiche Template-Bibliothek ein einfaches System erstellen lässt.
Hinweis: Diesen Text und die enthaltenen Beispielprogramme und Skripte dürfen Sie zum Erlernen der einzelnen Techniken und auch als Grundlage für Ihre eigenen Projekte auf eigene Gefahr kostenlos nutzen.
Bitte denken Sie daran, dass alle Texte und Quellcodes trotzdem urheberrechtlich geschützt sind. Eine direkte Weitergabe ist nur nach ausdrücklicher schriftlicher Genehmigung gestattet.