PHP Template System – FastTemplate

PHP Template System - FastTemplateIn diesem Artikel lernen Sie das PHP Template System “FastTemplate”, mit den Techniken, und den Möglichkeiten, sowie der Anwendung kennen.

Es gibt verschiedene Arten
von Template Systemen in PHP. FastTemplate ist ein Template System, welches blockartig aufgebaut ist.
D.h. der Designer kann einzelne Blöcke oder Bereiche einer
Seite designen, das System kombiniert diese Blöcke dann entsprechend
mit den aufzufüllenden Daten. FastTemplate ist eine PHP Klasse,
die von http://www.thewebmasters.net/php/
heruntergeladen werden kann. Diese Klasse muss in das PHP Programm
eingebunden, und ein Objekt davon abgeleitet werden.

template.tpl

<html><head>
<title>{title}</title>
</head>
<body>
<h1>{title}</h1>
<p><b>{teaser}</b></p>
<p>{inhalt}</p>
</body>
</html>

Die Platzhalter bei diesem Template sind in geschweiften Klammern.
Dadurch werden Sie eindeutig. Man kann die Platzhalter auch anders
gestalten, sodass es zu keinen Konflikten zwischen den {} der Platzhalter,
und z.B. den {} Klammern eines JavaScripts kommt. Die Platzhalter
könnten z.B. auch wie folgt aussehen {(title)}. Wie
Platzhalter aussehen ist also egal, die Platzhalter müssen
nur als solche an die FastTemplate Klasse übergeben werden,
da FastTemplate ja sonst die Platzhalter nicht "entdecken"
könnte, und dadurch nichts ersetzen würde.

Nun aber zurück zu unserem Beispiel. Wir möchten, dass
die einzelnen Platzhalter des Templates durch die entsprechenden
Inhalte ersetzt werden.

1. Zunächst muss, wie bereits erläutert die Klasse "class.FastTemplate.php"
in das Skript eingebunden werden.

<?php
include "class.FastTemplate.php3";

2. Daraufhin muss von dieser Klasse ein Objekt erzeugt werden. Über
dieses Objekt wird mit der Klasse "kommuniziert", und
die einzelnen Methoden aufgerufen, und die Ergebnisse empfangen.

$tpl = new FastTemplate(".");

Die Pfadangabe in der Klammer (der Punkt) verweist auf den
Ordner, aus dem die verschiedenen HTML Templates geladen werden.
Der Punkt steht hierbei für das aktuelle Verzeichnis.

3. Jetzt wird das Template, bzw. die Templates, die verwendet werden,
definiert. Dabei wird die define() Methode von FastTemplate verwendet.
$tpl->define(array(
"template" => "template.tpl"
));

Es wird ein assoziatives Array erzeugt. Dabei ist der Index,
hier im Beispiel "template", der Name des Templates. Über
diesen Namen wird das Template im weiteren angesprochen.
Wie Sie sehen können Sie mehrere Templates definieren,
und diese auch gleichzeitig nutzen. So ist es möglich über
mehrere Templates eine Seite in einzelnen Blöcken aufzubauen.

4. Im nächsten Schritt werden die verschiedenen Platzhalter
definiert, und angegeben, mit welchen Werten diese gefüllt
werden sollen. Es wird hierzu die assign() – Methode von FastTemplate
verwendet.

$tpl->assign("{title}", "Der Titel");
$tpl->assign("{teaser}", "Der Teaser");
$tpl->assign("{inhalt}", "Der Inhalt");

Es ist klar, das die Anwendung so kaum Sinn macht, da man hierbei
die Inhalte innerhalb der PHP Funktion definieren müsste.
Ein Verweis auf eine Variable, mit dem Inhalt macht mehr Sinn. Dieser
Inhalt kann zuvor z.B. aus einer Datenbank, oder einer Textdatei
ausgelesen worden sein. Die Defintion des Inhalts könnte also
auch wie folgt aussehen:
$tpl->assign("{title}", $title);
Mit diesem Schritt kennt FastTemplate die einzelnen Platzhalter,
und weiß, mit welchen Werten diese zu ersetzen sind.

5. Nun kann eigentlich der letzte Schritt in Angriff genommen werden.
Es muss nur noch der Inhalt mit dem Template kombiniert werden.
Dies muss auch explizit angewiesen werden.
$tpl->parse("ausgabe", "template");
$tpl->FastPrint("ausgabe");
?>

Es wird die FastTemplate Funktion parse() aufgerufen. An diese Funktion
werden zwei Parameter übergeben. Der erste Parameter ist ein
Name. Über diesen Namen wird der Output, also das Ergebnis
aus dem Parsen des Templates und des Inhaltes zugegriffen. Er ist
notwendig, da man über ihn z.B. die Ausgabefunktion in der
nächsten Zeile aufrufen muss. Dadurch wird sichergestellt,
dass das Ergebnis ein einzelner Block ist, der noch weiter
bearbeitet kann.
Der zweite Parameter verweist auf das Template. Hierbei wird der
Name des Templates verwendet, welcher im Schritt 3 definiert wurde.
Das Ergebnis wird nun in der letzten Zeile ausgegeben.

Das komplette PHP Skript:

<?php
include "class.FastTemplate.php3";
$tpl = new FastTemplate(".");
$tpl->define(array(
"template" => "template.tpl"
));

$tpl->assign("{title}", "Der Titel");
$tpl->assign("{teaser}", "Der Teaser");
$tpl->assign("{inhalt}", "Der Inhalt");
$tpl->parse("ausgabe", "template");
$tpl->FastPrint("ausgabe");
?>

Nützliche Anwendung von FastTemplate

Dieses Beispiel hat ja noch kaum die Stärke von FastTemplate
gezeigt. Das folgende Beispiel hat die Aufgabe, einzelne Artikel
mit einer ID aus einer Datenbank zu laden, und die Werte den Platzhaltern
zuzuweisen. Das Ergebnis ist folglich ein kleines CMS. Die
Daten der Artikel werden in der Datenbank gespeichert, über
die ID des Artikels im URL werden diese über das Skript geladen,
und schlussendlich über FastTemplate mit dem Template kombiniert,
und ausgegeben.

Die Datenbank-Tabelle "article" wird über folgendes
SQL Statement erzeugt.

CREATE TABLE article (id INT not null AUTO_INCREMENT, title
VARCHAR (30) not null , teaser VARCHAR (250) not null , inhalt TEXT
not null , PRIMARY KEY (id))

In ihr wird die ID des Artikels, der Titel, der Teaser, sowie der
Inhalt selbst gespeichert.

Nun das PHP Programm, das auf diese Daten in der Datenbank zurückgreift,
und über FastTemplate ausgibt.
Es wird das gleiche Template wie oben verwendet, nur das die Datenbank-Funktionen
hinzugefügt worden sind.

show_article.php

<?php
// FastTemplate Klasse wird geladen
include "class.FastTemplate.php3";

//Variablen für die Datenbankverbindung
$user = "";
$pass = "";
$host = "localhost";
$db = "cms";

//Verbindung wird aufgebaut
$connid = mysql_connect($host, $user, $pass);

//Template Objekt wird erzeugt, Templates definiert
$tpl = new FastTemplate(".");
$tpl->define(array(
"template" => "template.tpl"
));

//wenn die $ID in dem URL vorhanden ist...
if (isset($ID)) {

//Daten werden aus der Datenbank geladen
$sql = "Select*From article where id='$ID'";
if (!$erg = mysql_db_query($db, $sql, $connid)) {
echo "Artikel nicht in DB vorhanden!<br>"; }
else {
$erg2 = mysql_fetch_array($erg, MYSQL_ASSOC);

//Daten und Platzhalter werden definiert
$tpl->assign("{title}", $erg2["title"]);
$tpl->assign("{teaser}", $erg2["teaser"]);
$tpl->assign("{inhalt}", $erg2["inhalt"]);

//Parsing-Schritt
$tpl->parse("ausgabe", "template");
$tpl->FastPrint("ausgabe");
}
}
echo "Sie haben keinen Artikel ausgewählt!<br>";
mysql_close($connid);
?>

Nun, die Erklärung der Arbeitsweise ist eigentlich leicht zu
erkennen.
In der ersten Zeile wird wiederum die FastTemplate Klasse eingebunden.
In den folgenden Zeilen werden die Daten für die MySQL Verbindung
angegeben.
Daraufhin wird die Verbindung zur MySQL Datenbank aufgebaut.

Daraufhin wird von der Template Klasse ein Objekt erzeugt, und das
Template definiert.
Dem Aufruf des PHP Skripts "show_article.php", wird als
Parameter eine ID gegeben (z.B. show_article.php?ID=1). Über
diese ID wird der Artikel aus der Datenbank gelesen. Ist diese ID
nicht im URL vorhanden, oder kann über diese ID kein Artikel
aus der Datenbank gelesen werden, dann wird das Programm vorzeitig
beendet.
Das SQL Statement, welches den Artikel aus der Datenbank ließt
wird dynamisch generiert, da die ID ja vom URL abhängig ist,
macht dies ja auch nur Sinn.
$sql = "Select*From article where id='$ID'";

Daraufhin wird der Query an die Datenbank gesendet. Wird kein Ergebnis
zurückgegeben, wird das die Fehlermeldung "Artikel
nicht in DB vorhanden!"
ausgegen. Ansonsten wird aus
den Ergebnissen über die mysql_fetch_array() Funktion ein Array
erzeugt. Die Konstante "MYSQL_ASSOC" besagt, dass es sich
bei dem Array um ein assoziatives Array handelt, dessen Index der
Name der MySQL Tabellenspalte ist.
$erg2 = mysql_fetch_array($erg, MYSQL_ASSOC);
//Daten und Platzhalter werden definiert
$tpl->assign("{title}", $erg2["title"]);
$tpl->assign("{teaser}", $erg2["teaser"]);
$tpl->assign("{inhalt}", $erg2["inhalt"]);

Ist dies geschafft, so ist der größte Teil der Arbeit
schon gemacht worden. Jetzt werden die Werte in dem Array noch den
passenden Platzhaltern zugewiesen, FastTemplate parsed das Template,
und gibt das Ergebnis aus.
$tpl->parse("ausgabe", "template");
$tpl->FastPrint("ausgabe");

Volià – Ein kleines System zum Laden von Artikeln aus der
Datenbank, und das Anzeigen über das Template System FastTemplate
ist fertig.

Das Programm gibt es auch zum downloaden
und Testen. (tf)

This entry was posted in PHP. Bookmark the permalink.

One Response to PHP Template System – FastTemplate

  1. Carsten says:

    Ein Auszug aus deinem Text:

    (…)
    //wenn die $ID in dem URL vorhanden ist…
    if (isset($ID)) {

    //Daten werden aus der Datenbank geladen
    $sql = “Select*From article where id=’$ID'”;
    (…)

    Grundlegend sehr gefährliches beispiel. Zum einen ist bei $ID nicht gesagt, woher das kommen soll. Bei Denkbar schlecht konfigurierten Servern kann dies schonmal schnell aus einer POST abfrage bzw. über einen Exploit kommen. Zum anderen wir deine Abfrage nicht geprüft.

    Ich würde es von anfang an so vermitteln:

    if (isset($_GET[‘ID’] && intval($_GET[‘ID’]) > 0) {

    //Daten werden aus der Datenbank geladen
    $sql = “Select*From article where id='”. mysql_real_escape_string($_GET[‘ID’]) .”‘”;
    }

    Zum einen gucken ob $_GET[‘ID’] gesetzt ist und mit intval prüfen ob es eine Zahl größer 0 ist. Den Escape über mysql_real_escape_string( $string ) baue ich Grundsätzlich bei allen abfragen ein. Die gefahr eines schädlichen Angriffes auf die Datenbank ist in den heutigen Zeiten einfach viel zu groß.

    Ansonsten gutes Beispiel.

    Gruss,
    Carsten

    PS: Den ersten Post bitte löschen. Da bin ich wohl in der Zeile verrutscht. 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *