Startseite --> Projekte --> Template-Klasse
Kurzbeschreibung
Bemerkungen zur IF-Syntax
Neues
Download
Wer größere Web-Anwendungen programmiert, bemerkt oft schnell, wie unübersichtlich es doch ist, wenn alle Meldungen, die ausgegeben werden, direkt im Quelltext des Scripts festgelegt sind. Außerdem kann es für unerfahrene Anwender zur Qual werden, wenn sie dieses Script herunterladen und versuchen, es anzupassen.
Eine Möglichkeit zur Lösung dieses Problem ist, einzelne Dateien anzulegen, die dann die Meldungen enthalten und diese bei Bedarf anzuzeigen. Doch man stößt leider schnell an die Grenzen dieser Methode, wenn das Script Daten erzeugt, die sich ständig ändern können, wie zum Beispiel bei einem Gästebuch.
Eine gute Lösung sind Templates. Sie können variable Blöcke enthalten, die dann vom Script durch die entsprechenden Daten ersetzt werden.
Ich möchte hier eine kleine Template-Klasse für Perl, PHP und Python anbieten. Sie erlaubt neben variablen Blöcken auch Abschnitte, die nur unter bestimmten Bedingungen angezeigt werden, einfache Schleifen, das Einbinden des Inhaltes anderer Dateien und weitere Kleinigkeiten.
Die Routine, die die bedingten Abschnitte verarbeitet, ist zugegebenermaßen etwas chaotisch. Einige Hardcore-Programmierer werden mir dafür wahrscheinlich Betonschuhe verpassen und mich ins Hafenbecken werfen, weil sie das lieber mit regulären Ausdrücken lösen, anstatt mit String-Positionen und Sub-Strings zu arbeiten.
Das ist mir ehrlich gesagt egal. Mir geht es ganz einfach darum, dass es funktioniert (und es funktioniert wunderbar). Ich habe keine Lust, mich großartig mit regulären Audrücken auseinanderzusetzen, weil diese mir sowieso nur Ärger bereiten. Ich bin froh, dass ich wenigstens etwas davon kapiere. Und ich glaube ohnehin nicht, dass sich diese IF-Abschnitte mit einem regulären Ausdruck auseinandernehmen lassen.
Die IF-Syntax enthält leider auch einen Bug. Wenn sich zwischen dem {IF} und dem {ENDIF} ein {IF befindet, denkt der Parser, es wäre der Beginn eines weiteren {IF}-Blockes. Leider wird er nie das Ende dieses Blockes finden und beendet das Script, um nicht in eine Endlosschleife zu geraten. Ich habe bereits versucht, das Problem mit Hilfe von regulären Ausdrücken zu lösen, aber das verursachte neue Probleme.
Neu in Version 2.0 (vom 9.8.2006)
get_var(), set_var() und parse():get_var(), set_var() und parse().
get_var() gibt den Wert einer Variablen zurück. Wenn kein Name angegeben wurde, gibt get_var() die Namen aller definierten Variablen zurück.set_var() weist einer Variablen einen Wert zu.parse() setzt die Variablen ein, verarbeitet die {IF}-Blöcke, verarbeitet die Schleifen und liest die in der Template definierten Variablen aus.{DEFINE}-Blöcke Variablen direkt in der Template-Datei definieren, so als hätte man sie mit set_var() definiert.{DEFINE Name "Wert"}:\n durch einen Zeilenumbruch ersetzt.{DEFINE Name}Wert{ENDDEFINE}:set_var() haben allerdings Vorrang gegenüber den erst über {DEFINE} definierten. Zusätzlich werden zweitere erst von parse() abgearbeitet, wenn erstere abgearbeitet wurden.{LOOP}...{ENDLOOP}-Blöcke einschließen. Dieser Block bekommt einen Namen, diesem Namen werden dann über die Methoden add_loop_data() und/oder set_loop_data() Variablen zugewiesen. Der Block wird dann für jeden Durchgang mit neuen Werten ausgegeben.{TRIM}-Blöcke:{TRIM}-Blöcke einschließen. Beim Inhalt werden vorangestellte und abschließendende Leerzeichen und Zeilenumbrüche entfernt.{INCLUDE}-Anweisungen verändert:{INCLUDE}-Anweisungen wurde in einigen Fällen geändert:
{INCLUDE}-Anweisung einen relativen Pfad angibt, so gilt dieser Pfad nun relativ zur Template-Datei und nicht mehr zum Script.{INCLUDE}-Anweisung angegeben werden, können nun auch Leerzeichen oder das }-Zeichen enthalten. In diesem Fall muss man den Dateinamen aber in doppelte Anführungszeichen setzen.reset()-Methode können Sie den Template-Text in den Zustand zurückversetzen, den er nach dem Auslesen der Template-Datei hatte. Zusätzlich können Sie mit save_state() den aktuellen Zustand des Template-Textes sichern und diesen dann bei Bedarf eben mit reset() wiederherstellen.addtext(), as_string(), condtag() und readin() entfernt.split(), um eine Zeichenkette aufzuteilen. Stattdessen verwendet sie nun meine Portierung der explode()-Funktion von PHP. Die Grund hierfür ist ein Problem von split(), welches auch auf der verlinkten Seite beschrieben wird.Wenn Sie Interesse an der Template-Klasse haben, können Sie das Script unter Download von Scripts oder auch direkt hier herunterladen.
Die ZIP-Datei enthält die Perl-, die PHP- und die Python-Version und eine ReadMe-Datei mit Informationen zur Nutzung der Klasse. Ich hoffe, dass diese ReadMe-Datei verständlich genug ist. Wenn nicht, bitte melden Sie sich bei mir!
template-class.zip (29,9 KByte)
Startseite --> Projekte --> Template-Klasse