1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Template-Engine

Dieses Thema im Forum "PHP" wurde erstellt von EuroCent, 21. März 2007.

  1. EuroCent

    EuroCent KlappStuhl 2.0

    Hallo ich wollte mal fragen ob es ein Tutorial gibt in dem man ein eigenes Template-Engine bauen kann!

    Muss nicht mit MySQL oder so sein... es sollte aber wenn möglich gut erklärt sein!

    Den ich habe vor ein CMS - System zu machen in dem man die Teplates (.tpl) bearbeiten kann ohne die Datei anfassen zu müssen!

    Ich hoffe mir kann da einer einpaar Tuts geben die mir das erklären!

    Danke
     
  2. Gumbo

    Gumbo Erfahrenes Mitglied

    Was soll die Template-Engine denn können? Einfach nur Platzhalter durch Werte ersetzen, komplexe Kontrollstrukturen wie bedingte Blöcke und Schleifen oder sogar Funktionen, sodass die Verarbeitung der Werte auch im Template bestimmt werden kann?
     
  3. Hroudtwolf

    Hroudtwolf Grünschnabel

    Die Frage von Gumbo ist mehr als berechtigt.
    Ferner muss man sich diese Frage selbst stellen bevor man mit einem CMS anfängt.


    Was soll es können ?
    Wie setze ich es um ?


    Da du ein Turorial zur Sache suchst, nehme ich an dass du noch nicht so weit mit PHP bist.
    Die essentiellen Funktionen einer Template-Klasse sind Arrays und die String-Funktionen, wobei wichtigst Str_Replace.
    Das sind Bereiche mit denen du dich zunächst einmal beschäftigen solltest.

    Bei einer Template-Klasse solltest du darauf achten eine Methode zum Setzen von Assoziation zu haben.
    Diese Assoziationen ersetzen beim Ausfüllen des Templates die Platzhalter ( { Platzhalter} ).
    Du benötigst eine weitere Methode zum Laden und Bearbeiten eines Templates.
    Diese Methode nutzt die Assoziationen die über erstere Methode angelegt wurden und ersetzt die Platzhalter gegen ihre assoziative Entsprechung.
    Nun brauchst du noch ne Methode oder ein Var-Member die/das dir das ausgefüllte Template zurückgeben kann. Wobei du das bedarf auch über zweitere Methode lösen kannst.

    Das war nun nur ein kleiner Ausschnitt von dem was vor dir liegt.
    Wenn du magst mach ich dir schnell nen kleinen Code-Schipsel.
     
  4. EuroCent

    EuroCent KlappStuhl 2.0

    Ich möchte in einer PHP per eval(); ein Template aufrufen...

    Beispiel code so: eval("\$tpl->output(\"".$tpl->get("test")."\");");

    Das heisst wenn ich per Formular einen Quelltext abschicke an die DB

    Beispiel:

    Code (Text):
    1.  
    2. <?xml version="1.0" encoding="windows-1252"?>
    3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    4. <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="de" xml:lang="de">
    5. <head>
    6. <title></title>
    7. <meta http-equiv="Content-Type" content="text/html; charset=windows-1252" />
    8. </head>
    9. <body>
    10.  
    11. $bit
    12.  
    13. </body>
    14. </html>
    15.  
    Dann soll das TPL-Engine aus der DB das TPL parsen und mir es als datei.tpl speichern!

    wenn ich nun aber:

    eval("\$bit .= \"".$tpl->get("test_bit")."\";");

    mach dann soll geprüft werden ob ein Template mit dem namen überhaupt gibt... wenn nicht soll eine Meldung kommen beispiel: Template "Name.tpl" nicht vorhanden

    Ich hoffe man versteht was ich damit meine und was ich brauche
     
  5. Gumbo

    Gumbo Erfahrenes Mitglied

    Keine gute Idee. Denn dadurch kann auch jeglicher PHP-Code ausgeführt werden, was eine gravierende Sicherheitslücke bedeutet. Außerdem ist es langsamer als die Variante des direkten Ersetzens.
     
  6. birnkammer

    birnkammer Erfahrenes Mitglied

    Naja ich bin nicht so ein Freund von eval() und verwende es eigentlich nur, wenn es nicht anders zu lösen geht.

    Warum machst du es nicht so:
    PHP:
    1. $template = "template.tpl";
    2. $str = file_get_contents($template);
    3. $str = str_replace('$bit', "Der neue Text", $str);
    4. echo $str;
    Ist jetzt natürlich sehr simpel aber leich zu erweitern

    Viele Grüße
     
  7. EuroCent

    EuroCent KlappStuhl 2.0

    Achso...

    Welches wäre da dann am besten angebracht!

    Also ich möchte ja über ein Formular neue Templates anlegen und diese dann in eine Datenabnk speichern!

    Diese Lese ich dann mittels Select aus um diese eventuell bearbeiten zu können!

    Das ist ja alles nicht das Problem!

    Aber wie mach ich es das er den Inhalt aus der Datenbank in eine .tpl datei schreibt!

    So das ich es dann eventuell per $template[datei] aufrufen kann auch im HTML Dokument?
     
  8. Flex

    Flex (aka Felix Jacobi)

    Warum willst du überhaupt die Templates in einer Datenbank speichern?
    Warum nicht direkt in die Template Dateien?

    Der Aufwand bei einem Aufruf wäre m.M.n. enorm, sprich:

    Seitenaufruf, Datenbankaufruf => Template wird ausgelesen => Inhalt wird aus Datenbank gelsen => dynamischer Inhalt wird eingefügt => Template Datei wird erstellt und an den Browser ausgegeben

    So verstehe ich dein System momentan... Korrigiere mich, wenn ich es falsch verstehe.

    Weiterhin warum nicht eins der fertigen verwenden? Gerade bei Templatesystem finde ich es ratsam sich die Fertigen einmal anzuschauen, da diese oft viel größeren Komfort bieten, als man selbst einfach mal schnell hinprogrammiert. Sprich Schleifen, Bedingungen, eigene Funktionen, etc.
    Der Nachteil ist natürlich die Einarbeitung in etwas Neues, aber gerade weitverbreitete Systeme, wie z. B. Smarty, sollten bekannt sein.
    Weiterhin ist das Cache System in einem Templatesystem m.M.n. wichtig, gerade wenn es um größere Seiten geht, die stark besucht sind oder einen großen Andrang standhalten sollten.
     
  9. boast

    boast Grünschnabel

    Eben mit bisschen Cashing hat man den Geschwindigkeitsverlust der DB schnell wieder flott. Vorteil wäre natürlich die einfachere Editierbarkeit per z.B. eines ACPs.

    Smarty ist recht cool - wenn man alle Funktionen (oder möglichst viele) gebrauchen kann. Der Rest ist nur unnötiges Rechnergebremse... imho

    @FreddyKruegger: Nach dem Absenden (add oder edit...) des Templates rufst Du noch eine Funktion auf, welche Dir alles in das gewünschte File schreibt (fopen(), file_put_contents(), ... evt. (wenn mehrer User zugreiffen können) lohnt es sich, noch etwas über LOCKS in erfahrung zu bringen).
     
  10. EuroCent

    EuroCent KlappStuhl 2.0

    Hmm... ja aber welcher wäre da am vorteilhaftesten?

    Mit Smarty komme ich einfach nicht zu recht!

    Ich wollte es so machen:

    - im AdminPanel neues Template anlegen!
    - nach abschicken in die Datenbank
    - Parser holt sich den Eintrag und erstellt dieses Template
    - das selbe beim bearbeiten
    - Template löschen, DB-Eintrag wird gelöscht, Template soll gelöscht werden!

    So wenn ich dann eine Seite aufrufe wo ich das Template mit beispiel: $template[bsp] dann soll er dieses Template suchen und dann anzeigen!

    Wenn ich das Temp nicht angelegt habe soll ja diese Fehlermeldung kommen: Template "Template-Name" nicht gefunden!

    Ich will es aus dem Grund in die DB speichern um eine Sicherung zu haben!

    Den wenn ich beispiels weise dieses Template gelöscht habe, aber brauche es, dann gehe ich ins ACP und klicke bei Templates auf Aktualisieren dann soll er alle neu Parsen und fehlende erstellen! Die ich benötige

    Ich hoffe man könnte mich nun verstehen warum ich es in die Datenbank speichern will!
    Ich will/möchte deshalb ein eigenes Template-Engine haben um mich damit überhaupt einmal damit auseinander setzen zu können!

    Wenn ich eins Finden würde welches das könnte was ich will und dieses mit $variable[template-name] oder mit dem eval() macht dann nehm ich dieses auch und werd es dann an mich gegebenfalls anpassen!

    Wie gesagt ich möchte es eben so machen das Template in DB gespeichert wird aus Sicherungsgründen, den wenn ich ein Template nicht in die Datenbank schreibe und ich dieses Template lösche... muss ich ja alles wieder von vorne schreiben und genau das will/möchte ich verhindern!
     
  11. Hroudtwolf

    Hroudtwolf Grünschnabel

  12. EuroCent

    EuroCent KlappStuhl 2.0

    Öhm... versteh ich nicht ganz sorry!

    Ich bin in English nicht so der Hit, daher wäre es im Deutscher Sprache für mich einwenig vom Vorteil ;)
     
  13. muhkuh

    muhkuh Erfahrenes Mitglied

    Na, ums Englisch wirst du aber wohl kaum drumrumkommen ;) Ich kann dir aber mal empfehlen die Template-Klasse des phpBB anzugucken, die ist etwas anders aufgebaut, als Smarty, aber m.M.n. sehr angenehm im Einsatz.

    Ich finde deinen Weg Templates einzusetzen aber etwas verwirrend, geradezu umständlich. Ich hab das so verstanden, dass du den HTML-Code für das Template inklusive aller Platzhalter in ein Formularfeld eingibst, dass dann abgeschickt wird und im Script "ausgefüllt" wird (Platzhalter ersetzen). Anschließend wird die ganze Schose dann als Datei gespeichert. D.h. also eine fertige HTML-Datei, so wie sie der Besucher sehen soll. Ich denke, dass es bei diese Lösung wesentlich schneller ginge statt der Platzhalter gleich den richtigen Inhalt in die Seite einzufügen.

    Normalerweise dienen Templates dazu dynamische Inhalte, also wechselnder Art, bequem darstellen zu können. Die meisten Tempalte-Engines funktionieren so, dass eine Template-Datei bereits vorhanden ist, die vom Script dann eingelesen wird (z.B. mit file_get_contents();), woraufhin die Platzhalter (z.b. {PLATZHALTER}) durch den Inhalt aus der Datenbank ersetzt wird. Diesen kompilierte Code wird dann an den Browser ausgegeben (echo). An den Rohdaten der Template-Datei wird also nichts verändert, ebensowenig an den Daten in der Datenbank. Die kompilierte Template-Datei muss auch nicht gespeichert werden, um sie an den Browser ausgeben zu können. Das geschieht z.B. in einem Cache-System.
     
  14. Radhad

    Radhad Erfahrenes Mitglied

    Kann man die {Platzhalter} nicht auch durch bestimmte Scripts füllen lassen? Menü, Content (News-Script, Forum, Blog, ...) ? Denn so etwas würde ich gerne mal machen - eine HTML Datei für das Design und dadrin entsprechende Platzhalter für wie eben genannt: Menü, & Content (als Beispiel).
     
  15. boast

    boast Grünschnabel

    U.A. genau DAS macht ein Tpl.System... ;)

    My Favourite Template System:
    PHP:
    1. <h1><?php echo($headings[1]); ?></h1> <!-- geht doch? -->
    2. <h2><?= $headings[2] ?></h2> <!-- für die Faulen... -->
     
    Zuletzt bearbeitet: 22. März 2007
  16. Radhad

    Radhad Erfahrenes Mitglied

    Hmm... den Code kapier ich zwar imo nicht ;-) Aber so etwas möchte ich gerne verwenden, da ich dann schneller div. Designs verwenden könnte, da man dann ja Designs in der Datenbank registrieren könnte, um sie aus einem bestimmten Ordner zu laden (im Speziellen meine ich verschiedene CSS-Styles, könnten aber auch ganz andere HTML Dateien sein, die ein anderes Lokk&Feel vermitteln sollen).

    Gibt es denn dafür eine kompakte Anleitung? Denn ich denke, dass Smarty dafür eigentlich schon zu groß ist und das ganze bremsen würde (stehe auch nicht so auf fertiges Zeug :D)
     
  17. boast

    boast Grünschnabel

    Mein Post war eigentlich als Witz gemeint, bzw. zeigt meine pers. Einstellung zu diesem Thema: PHP selbst ist schon eine super Template Engine!
     
  18. Radhad

    Radhad Erfahrenes Mitglied

    net ganz ;) ich muss in die Design-Datei die ganze logik zum auswerten, welches Script geladen werden soll da mit reinschreiben, obwohl es damit nix zu tun hat. Da würd ich halt gerne trennen
     
  19. peppijunior

    peppijunior Grünschnabel

    Ich hab ne nette tpl Klasse, in der nur Variablen geparst werden :)
    Mach es auch meistens mit eval und hatte bis jetzt keinerlei Probleme
     
  20. EuroCent

    EuroCent KlappStuhl 2.0

    Also wie gesagt!

    Ich will es so machen wie bei dem wBB eben... da wird auch erst der HTML Cde in die Datenbank gespeichert und es dann per Cachen in ein tpl konvertiert dabei ruft aber die PLATZHALTER ($index_bit beispiel) nicht auf das Template zu sondern auf die Datenbank also ist es garnicht mal so performence Fressend wie es allen anscheinend denken!

    Ich arbeite mit der Forensoftware schon ziemlich lange und die Template-Engine ist garnicht mal so schlecht aufgebaut!

    Also mir geht es ja nur darum das ich den inhalt in eine Datenbank speichere und diese wenn gebraucht wird aufgerufen wird in der DB zugleich soll eine geparste PHP datei in einem dafür angegebenen Ordner erstellt werden

    Wenn ich dann zusätzlich das tpl brauch klicke ich auf cachen und es wird dann eines erstellt

    Das mit {Platzhalter} ist für mich zwar nicht wirklich neu aber ich habe mich nun mal an das eval() und Platzhalter ($var) gewöhnt und würde dieses auch gerne so weiter für mich mit übernehmen!
     

Diese Seite empfehlen