Willkommen in der Webstatt Zum Webstatt Blog und Stories
abu am 22.06.06 15:22

Hi,

ich habe mich grade daran versucht eine Template Klasse in php zu schreiben und das ist dabei raus gekommen: <?php

class TTemplateVar {

var $name;
var $value;

function TTemplateVar($name, $value){
$this->name = $name;
$this->value = $value;
}
}

class TTemplate {

function TTemplate(){
$this->vars = array();
}

var $slist;
var $text;
var $vars;

function load($filename){
$this->slist=file($filename);
for ($i=0;$i<sizeof($this->slist);$i++){
$this->text .= $this->slist[$i] . chr(13) . chr(10);
}
}

function addvar($name, $value) {
array_push($this->vars, new TTemplateVar($name, $value));
}

function compile() {
for ($i=0;$i<sizeof($this->vars);$i++){
$this->text = str_replace("<!--".$this->vars[$i]->name."-->", $this->vars[$i]->value,$this->text );
}
}

function printit(){
echo $this->text;
}

function tohtml(){
return $this->text;
}

}

?>

Bsp.:
<?php

include("phpex_template.php");

$template = new TTemplate;
$template->load("bsnx_v2.tpl"); // template datei

$template->addvar("title", "seitentitle");
...

$template->compile();
$template->printit();

?>

Eine var muss die form haben "<!--meta-->"->meta

Is mein erstes Script, konstruktive Kritik ist erwünscht :)

netcup.de Warum gibt es hier Werbung?
Michael Michael am 05.07.06 21:43

Vorneweg: Sehr schöner Ansatz, vorallem der Weg für Variablen eine eigene Klasse zu benutzen.

Hier ein paar Anregungen:

1) Wenn du PHP objektorientiert programmierst - was du ja machst und auch machen solltest ;) - bietet es sich an, wenn möglich, PHP 5 zu benutzen. Dann hast du viel mehr Möglichkeiten

2) Beim Einlesen solltest du überprüfen, ob die Datei überhaupt vorhanden ist. Weiterhin ist file_get_contents auch eine elegante Möglichkeit, eine Datei in einen String zu konverieren. Ferner ist \r\n ein Krampf von Windows und sollte einem schönen \n weichen.

3) Dein Script ist ein Anfang aber es fehlen noch viele Features, damit man es auch tatsächlich benutzen könnte: Includes, Defaultwerte für nicht gesetzte Variablen, wiederholende Blöcke, ...
Nicht Aufhören weitermachen :)

4) Dem Konstruktor könntest du auch den Dateinamen übergeben und dort direkt die "laden" Methode aufrufen

5) statt var $vars; und dann $this->vars = array(); kannst du direkt var $vars = array(); schreiben.

6) Die "compile" Methode könntest du auch implizit aufrufen wenn das erste Mal "printit" oder "tohtml" aufgerufen wird.

7) Auch wenn Variablen innerhalb der HTML Kommentar Tags nicht sichtbar sind, solltest du übrige Platzhalter vor der Ausgabe (also in "compile") löschen. Du könntest auch die Begrenzer dynamisch machen.


Viele Grüße,
Michael

abu am 05.07.06 23:11

Quote

1) Wenn du PHP objektorientiert programmierst - was du ja machst und auch machen solltest Augenzwinkern - bietet es sich an, wenn möglich, PHP 5 zu benutzen. Dann hast du viel mehr Möglichkeiten

Solange ich keine php5 webspace hab...
Quote

2) Beim Einlesen solltest du überprüfen, ob die Datei überhaupt vorhanden ist. Weiterhin ist file_get_contents auch eine elegante Möglichkeit, eine Datei in einen String zu konverieren. Ferner ist \r\n ein Krampf von Windows und sollte einem schönen \n weichen.

Naja in Delphi war es auch immer #13#10. Muss mich halt erst an php gewöhnen :)
Quote

3) Dein Script ist ein Anfang aber es fehlen noch viele Features, damit man es auch tatsächlich benutzen könnte: Includes, Defaultwerte für nicht gesetzte Variablen, wiederholende Blöcke, ...
Nicht Aufhören weitermachen smile

Mal schauen wann ich wieder Zeit hab...
Quote

4) Dem Konstruktor könntest du auch den Dateinamen übergeben und dort direkt die "laden" Methode aufrufen

Oder ich mach mehere construktoren :)
Quote

5) statt var $vars; und dann $this->vars = array(); kannst du direkt var $vars = array(); schreiben.
aha

Dustwolf Dustwolf am 06.07.06 00:14

Habs nur überflogen, aber es ist nah an meinem Templatesystem.

Ich kann ja meins mal grade th. vorstellen. Ich verfüge über eine Class, die automatisch den Header einliest, dann eine übergeben Datei und dann den Footer.

Ich kann ganz normal Platzhalter setzen, oder welche dublizieren (Tabellen mit unbekannten Reihenanzahlen, etc).

Wenn ich beispielsweise eine Tabellenreihe mit vier Platzhaltern vorgebe, die ich dublizieren will, lade ich in einer Variablen die selbe Klasse, nur dass ich auf den übergenen Code der Tabellenzeile zugreife und auf keine Datei.

Kleine Zusatzfunktionen, die ich eingebaut habe ist eine volle Konfigurationsmöglichkeit beim Erstellen der Class. Also ob Fehlermeldungen kommen sollen, ob nicht benutzte Platzhalter stehen bleiben sollen,etc.
Weiterhin habe ich ein Fehlerscript drin. Wenn ich also eine Seite gerade mit Inhalt fülle (die Platzhalter ersetze) und es kommt zu einem Fehler, dann vergisst er das bisherige Template und läd die fehler.tpl-Datei.
Da gibt er dann einen Grund an, welchen das Script auch gleich in einer Logdatei speichert, falls der letzte Eintrag nicht identisch ist (verkürzt die Logs).

Dann gibt er einfach das Fehlertemplate aus und leitet auf die Startseite weiter. Wenn er da direkt wieder auf das Template für Fehler trifft, bricht er ab und leitet nicht erneut auf die Startseite, sondern eine schlichte HTML-Seite mit kurzem Hinweis eines großen Fehlers.
Denn wenn die Startseite verbugt ist, kannst du es eh knicken. Ich bin am überlegen, ob ich mir da auch noch ne Emailfunktion einbaue, aber da muss ich dann auch noch ne Anti-Spamfunktion einbauen.
Das mache ich erst, wenn ich mein CMS soweit fertig und online gestellt habe. Dann werde ich vllt. auch den Code zu der ein oder anderen Class online stellen, allerdings nur veraltete Versionen. Niemals die aktuelle. Da kann ja jeder Fehler suchen und ausnutzen. :D


Aber dein Script ist schon ganz ordentlich für einen ersten Entwurf. :)

Michael Michael am 06.07.06 10:19

Quote
Original von abu
Oder ich mach mehere construktoren :)


Das ist hässlich oder gar in PHP gar nicht möglich ;).
Du könntest den Parameter allerdings als optional deklarieren und dies nur bei Bedarf tun.

Ganz allgemein sollten meine Hinweise weniger Kritik als gut gemeinte Ratschläge, was du verbessern könntest sein.

abu am 06.07.06 10:58

Quote
Das ist hässlich oder gar in PHP gar nicht möglich

Ach da dachte ich wieder zu sehr an OOP :(, wenn man den filename im constuktor eintragen müsste könnte man die template klasse nur noch mit einer datei benutzen deswegen hatte ich das nicht im constuctor. Naja muss mich halt erst noch an php gewöhnen in anderen spachen sind verschiedene constrctoren absolut üblich. Aber offenbar is in php einiges anderes. Auch wird in php nicht so viel OOP verwendet, dabei kann OOP unheimlich helfen. Generell will ich mein Script so universel wie möglich einsetzbar zu machen.

Michael Michael am 06.07.06 11:30

1) Naja du könttest ja bei jeder Inhstanz eine neue Datei angeben:
$template_1 = new TTemplate('einedatei');
$template_2 = new TTemplate('andere_datei');

2) Das Problem mit verschiedenen Konstruktoren liegt bei PHP einfach daran, dass PHP - leider - kein Überladen von Funktionen kennt. Bei "normalen" Klassenmethoden gibtes (bei PHP5) dafür hässliche Workarounds aber bei PHP4 geht da nicht viel.

3) Die OOP Möglichkeiten von PHP5 sind viel größer - sicherlich noch nicht umfassend - aber viel besser als bei PHP4. Im Grunde kennt PHP4 ja gar keine Objekte, daher ist es auch so langsam. Aber PHP5 setzt sich ja leider auf Webspaces nicht so durch

4) Bei PHP4 solltest du immer &new statt new verwenden, da Objekte nicht Standardmäßig als Referenz sondern komplett übergeben würde... Auch das ist bei PHP5 anders.

Viele Grüße,
Michael

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt