Eintrag-Details: Template-basiertes Mini-CMS in PHP erstellen

03.02.2006

Template-basiertes Mini-CMS in PHP erstellen

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.

[Mehr:]

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/Werbung

Anmerkung: 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:

  1. Das HTML-Template (template.html)
  2. Die Textdatei mit den Inhalten (inhalt.txt)
  3. Das Skript, das die fertige Seite anzeigen soll (index.php)

Die drei Dateien können Sie als Zip-Archiv herunterladen: Beispiel-Dateien (ZIP)

Advertisement/Werbung

Zunä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>

Code herunterladen

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;

Code herunterladen

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');

Code herunterladen

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);

Code herunterladen

Ü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');
}

Code herunterladen

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);

Code herunterladen

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);

Code herunterladen

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].'}';

Code herunterladen

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);

Code herunterladen

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);

Code herunterladen

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.

Fazit

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.

Permalink 03.02.2006 10:39:54, von Marian eMail , 432 Wörter, 21961 mal angeschaut   German (DE) Kategorien: PHP

Kommentare, Pingbacks:

Kommentar von: Roland Hentschel [Besucher]
Hi!

Das ist ein prima Script!
Dazu jetzt noch ein passender Editor für "inhalt.txt", mit dem man die einzelnen Elemente bearbeiten kann, und ein Login, um nicht jedermann dran zu lassen ...

Schade, daß ich's nicht selbst machen kann!!!

( -: roland :- )
Permalink 12.12.2007 @ 14:25
Kommentar von: Roland Hentschel [Besucher] · http://rh-balingen.de/testsite
Noch ein paar Features mehr,
und das Ganze ist wirklich kein Spielzeug!

Nur für kurze Zeit:
http://rh-balingen.de/testsite

( -: roland :- )
Permalink 12.12.2007 @ 21:08
Kommentar von: Frank [Besucher]
Das Script hat mir sehr geholfen.
Danke!!!
Permalink 18.06.2010 @ 07:23

Werbung

Online-Kurse

  • Bequem PHP lernen bei freier Zeiteinteilung von zuhause
  • Der Onlinekurs den jeder versteht
  • www.lernpilot.de/wbt/

Konnte ich helfen?

mehr Werbung

viagra online|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|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60|61|62|63|64|65|66| levitra overdose effects levitra overdose symptoms which is stronger levitra or viagra cialis levitra or viagra levitra or viagra which is better levitra interactions alcohol levitra uk side effects levitra uk online generic levitra uk levitra use for women levitra use instructions levitra user group levitra tabs 20mg levitra trial coupon levitra time effectiveness levitra time frame levitra ratings and reviews levitra effects viagra levitra effects use levitra effects forum levitra effects liver levitra effects women levitra effectiveness reviews levitra women effect standard levitra dose levitra generic medication levitra generic viagra levitra generic cheap levitra generic drug levitra generic available