Moin!
Das Beispiel erzeugt mittels einer Template eine HTML-Überschrift und das funktioniert so weit auch.
Es funktioniert, aber es ist vom Funktionsprinzip her falsch angewandt.
Deine Aufgabe ist es, im PHP-Teil alle relevanten Ausgaben, die du im HTML-Teil ausgeben willst, zusammenzustellen.
Gehen wir mal vom Template aus: Dort sollte eigentlich _ausschließlich_ sowas drinstehen: <?php echo $variable; ?> Jedenfalls überall dort, wo variabler Text auszugeben ist.
Wie kleinkariert oder umfangreich deine einzufüllenden Textstücke werden, ist grundsätzlich deine Entscheidung - aber mehr als bereitgestellte Inhalte in umgebenden HTML-Code einzufügen hat ein Template nicht zu tun.
Es ist also nichts gegen
<html>
<head>
<metas, title, style>
</head>
<body>
<?php echo $full_content; ?>
</body>
</html>
einzuwenden, wenn es dir denn hilft und du derartig große Informationseinheiten vorliegen hast. Sollte ein Redakteur, gestützt beispielsweise durch eine Formatierungshilfe wie BB-Code, wirklich den gesamten Seitentext eingegeben (und sich dabei tatsächlich an alle Designrichtlinien etc. gehalten) haben, dann hast du tatsächlich "die komplette Seite - minus die Header" in der Datenbank (oder wo auch immer) vorliegen und mußt die einsetzen.
Wenn du einen Webshop hast und die einzelnen Artikelinformationen verarbeiten willst, mußt du natürlich kleiner vorgehen.
Weil es sich für Templates als schlau erwiesen hat, dass man in ihnen gewisse, _geringe_ Dynamik realisieren kann, gibt es die Möglichkeit, auf die dem Template übergebenen Daten zu reagieren.
Ein typisches Beispiel: IF-Abfragen. Wenn ein Feld ausgefüllt ist, soll es <h1><?php echo $titel; ?></h1> ausgegeben werden, wenn nicht, soll kein leeres <h1></h1> ausgegeben werden, sondern entweder gar nichts, oder <h1>Kein Titel</h1>.
Sowas kann man gut (oder besser, als im PHP-Code) im Template regeln.
Was auch nett ist: Schleifenfunktionalität, um Tabellen auszugeben. Dazu wird dem Template nicht eine Einzelvariable übergeben, sondern gleich ein ganzes Array, welches in einer Tabelle ausgegeben wird. Dazu wird ein gewisser Teil des Templates als "Wiederholung für jedes Element des Arrays" gekennzeichnet.
PHP ist als Templateengine entstanden. Und es ist irgendwie logisch: Wenn man IF-Entscheidungen treffen kann und Schleifen bauen darf, hat man im Prinzip eine Programmiersprache. Fehlen dann nur noch Funktionsdefinitionsmöglichkeiten etc, und schon hat man PHP in der heutigen Version.
Nun gut: Du weißt jetzt, was du dem Template schicken sollst: Einfache Variablen, die nichts weiter enthalten als Text.
Und genau deshalb sind Konstrukte wie dieses hier:
<body>
<h1><?php echo doHeader($HTTP_SERVER_VARS["QUERY_STRING"]); ?></h1>
</body>
schlecht. Du gibst nicht den Inhalt einer bearbeiteten, bereitgestellten Variablen aus, sondern nutzt direkt vom User angegebene Daten (der QUERY_STRING ist sowas) dafür, eine Funktion aufzurufen.
Dein Beispiel sollte so lauten:
Im oberen Teil:
$template['titel'] = doHeader($_SERVER['QUERY_STRING']);
Und im Template dann nur noch:
<h1><?php echo $template['titel']; ?></h1>
Vorteil für dich:
1. Beim Schreiben des Templates konzentrierst du dich auf gutes HTML. Um ein umzusetzendes Design überhaupt erstmal in HTML zu bekommen, schreibt man üblicherweise ganz stinknormales, PHP-freies HTML mit Platzhaltertexten. Diese Vorlage wird dann genommen, und an verschiedenen Stellen werden die Platzhalter durch Template-Code, welcher die dynamischen Inhalte reinschreibt, ersetzt.
Du weißt also nach dem Schreiben der obigen HTML-Templatezeile: Aha, hier kommt der Titel rein. Das ist für die Übersicht im Template toll.
2. Du kannst dich beim Programmieren des PHP-Teils auf die zu bearbeitende Textinformation konzentrieren. Du kannst also überlegen: Hm, irgendwie brauche ich einen je nach Aktion aussagefähigen Titel. Wie erzeuge ich den? Steht der in der Datenbank, oder kriege ich den basierend auf irgendwelchen Benutzeraktionen, oder woher sonst? Und das Ergebnis dieser Überlegung und Programmierung kommt dann - logisch - in die Variablen die du in allen Templates als Titel verwendest: $template['titel'].
Und das tolle daran ist: Du kannst im Template $template['titel'] dann eben auch problemlos mehrfach verwenden:
<head><title>Aktion: <?php echo $template['titel']; ?></title></head>
<body><h1><?php echo $template['titel']; ?></h1>
<p>....
Würdest du da immer einen Funktionsaufruf machen, wäre das unnötige Verschwendung von Rechenzeit, weil Arbeit doppelt getan werden muß, die man genausogut einmal erledigt hätte.
Was ich nicht verstehe: Wenn die Seite einmal ausgewachsen ist, dann wird $template["modus"] oben im Template-Bereich ja x-mal verwendet werden. Das bedeutet - nach meinem derzeitigen Wissenstand - daß ich immer wieder vom HTML-Bereich $HTTP_SERVER_VARS aus in den PHP-Bereich schicken muß, und, daß fnModus immer wieder durchlaufen wird (Performance). Geht das nicht eleganter ohne Verlust an Klarheit?
Jetzt klarer?
Noch ein Vorteil mit deinen Templates: Natürlich programmierst du deine Templates je Anwendungszweck passend zu den jeweiligen PHP-Codes. Aber es wäre beispielsweise kein Problem, ein und dieselbe Information auf einer Seite durch mehrere gleiche Templates, die sich nur in der Darstellung unterscheiden, je nach Userwunsch auszugeben.
Wenn du den HTML-Abschnitt unten an jedem Skript abschneidest, in eine eigene Datei speicherst und diese neue Datei dann im Skript mit include() einbindest, dann hast du schon mal eigenständige Template-Dateien. Die funktionieren noch immer genauso, wie dein zusammenhängendes Skript, aber sie lassen sich in einem HTML-Editor fast als eigenständige HTML-Dateien bearbeiten.
Und wenn du die Templates alle in ein eigenes Verzeichnis packst und das "typ1" nennst, und eine zweite Serie von Templates, die dieselben Dateinamen haben und dieselben Variablen ausgeben, aber HTML-mäßig anders aussehen, in ein Verzeichnis "typ2" packst (und das bei Bedarf noch einige Male mehr machst), hast du schon ein universell verwendbares System, um deiner PHP-Anwendung unterschiedliche "Skins" zu verpassen. Klar, mit CSS allein ginge das in gewissem Rahmen auch, aber wenn du unterschiedliche, feste Bilder einbinden wolltest, wäre schon Schluß damit.
include frißt übrigens nicht nur feste Strings (include "verzeichnis/datei.php"), sondern auch variable Strings als Argument (include $typ."/datei.php").
- Sven Rautenberg
"Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
(fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)