2009-04-25 6 views
3

Ich bin auf der Suche nach meiner eigenen Templating-Schicht in PHP als Teil meiner OOP-Framework, aber ich sehe so ein Beispiel dafür, wie man das richtig macht. Ich möchte es vermeiden, jede HTML-Datei zu analysieren, um Kommentare zu finden, die der Template-Engine sagen, was zu tun ist, sondern stattdessen eine schnellere/sauberere/moderne Technik zu verwenden. Ich brauche nur ein paar Beispiele, weil ich mich mit Google umgesehen habe und mir nichts aufgefallen ist. Ich versuche, meine Präsentation und Logik getrennt zu halten, aber was ich tue, erfordert Tonnen von Logik durch den HTML-Code.Beste PHP 5 Templating Techniken?

, Danke

P.S. Ich möchte keine vorhandene Template-Engine wie Smarty verwenden, sondern meine eigene.

+0

Am wichtigsten, wenn Sie auf PHP phs analysieren, achten Sie darauf, es nur einmal zu tun. – rick

+0

Wenn Sie Ihr Framework als MVC entwerfen, dann verwenden Sie nur ein oder mehrere Kernlayouts, eine Ansicht und einen Haufen Helfer. Sehr einfach. –

Antwort

0

... Ich versuche, meine Präsentation und Logik getrennt zu halten, aber was ich erfordert Tonnen Logik durch aus dem HTML-Code ....

Hey, there's this... tun

Warum geben Sie uns nicht ein Beispiel dafür, was Sie zu tun versuchen? Vielleicht wird es uns eine Vorstellung davon geben, warum Ihre Situation besonders ist, vielleicht gibt es eine spezielle Lösung für Ihre Art von Problem? Ich möchte nur eine Template-Engine schreiben, was den besten und schnellsten Weg bietet, hilft nicht viel. Ernsthaft, Ich würde eine Reihe von ihnen nehmen, schauen, was sie tun, verstehen, warum sie getan haben, lernen und etwas anderes tun, wenn ich etwas Besseres will.

+0

Warum sagt nicht, was ich brauche, viel Hilfe? –

+0

Weil es unglaublich vage ist. "Ich muss eine wirklich gute Bewerbung schreiben" sagt auch, was Sie brauchen, aber diese Ambiguität hilft anderen nicht, Ihre Frage zu beantworten. – Calvin

5

Haben Sie an das Model-View-Controller-Muster gedacht? Sie können die gesamte Logik mit Funktionen und Variablen (innerhalb von Controllern) abstrahieren und sie den Ansichten verfügbar machen. Es könnte ein erster Schritt für Templating sein.

S.S: Ich habe eine Template-Engine namens PHPTAL (Template Attribute Language) getestet. Ich mochte es, weil Sie HTML-Vorlagen mit Logik in benutzerdefinierten HTML-Attributen erstellen können, ohne das Design zu brechen.

Ich hoffe, diese Ideen hilfreich gewesen für Sie

+1

Das P.S ist sehr interessant! –

14

Ich werde die gleiche Frage von euch darum bitten, dass ich von jemand darauf hindeutet, Smarty fragen würde:

Warum Sie eine Template-Sprache hinzufügen wollen zu PHP, das ist eine Vorlagensprache?

PHP ist eine Vorlagensprache. Ich denke, die Leute vergessen das oder versuchen es wie eine reine OO-Sprache zu behandeln, which it isn't. Spielen Sie mit den Stärken von PHP. Versuche nicht, es zu etwas zu machen, was es nicht ist.

Das alles gesagt, es ist schwer, Ihre Frage zu beantworten, weil Sie nicht sagen, wie einfach oder komplex Ihr Vorlagensystem ist, nämlich welche Funktionen Sie unterstützen möchten.

Wenn Ihre Vorlagensprache relativ einfach ist, dann können reguläre Ausdrücke die richtige Wahl sein. Das wird jedoch für einige triviale Fälle nicht funktionieren. Das Verschachteln von Kontrollstrukturen ist wahrscheinlich am häufigsten. In diesem Fall müssen Sie einen rudimentären Parser schreiben.

Lassen Sie uns sagen, dass alle Ihre Template-Strukturen in den Blöcken wie diese sind:

{:...:} 

denn das ist relativ unwahrscheinlich, sonst in einer HTML-Seite kommen (obwohl für die Vollständigkeit, die Sie für den Fall gerecht zu werden brauchen wo der Benutzer tatsächlich diese Zeichenkombinationen verwenden möchte

Sie müssen Ihre Datei nach solchen Ausdrücken durchsuchen und entsprechend verarbeiten.Reguläre Ausdrücke können verwendet werden, um sie alle zu finden, aber nicht unbedingt übereinstimmende, wie für bedingte Includes, z :

{:if ...:} 
Some conditional content 
{:endif:} 

Warum? Aus diesem Grund:

{:if *some condition*:} 
{:if *some other condition*:} 
Some other conditional content 
{:endif:} 
Some conditional content 
{:endif:} 

Passende dass mit regulären Ausdrücken nicht zuverlässig durchgeführt werden können, so müssen Sie Ihre Datei in irgendeiner Form von Baum von Lexemen analysieren und verarbeiten sie dann.

0

Sie müssten Parser implementieren. Aber anstatt es jedes Mal zu parsen, machen Smarty und andere die geparste Ausgabe zur späteren Verwendung. Es wäre sogar noch besser, wenn die Ausgabe Ihres Parsers selbst PHP-Code ist.

+0

Wenn Smarty eine Vorlage analysiert, wird sie einfach in php umgewandelt. Es analysiert einmal beim Laden der ersten Seite. Smarty unterstützt jedoch auch das Caching. In diesem Fall wird eine PHP-Seite oder ein Teil einer Seite gerendert und der resultierende HTML-Code gespeichert. – rick

1

die schnellste Methode ist, PHP selbst zu verwenden, weil PHP eine Vorlagensprache ist. Natürlich ist das manchmal aus Sicherheitsgründen nicht möglich, und der Designer muss grundlegende PHP lernen (, die wirklich sehr weh tut). manchmal wird es auch wirklich hässlich, wo andere, spezialisiertere (und weniger mächtige) Templating-Systeme es sauber halten können.

also, wenn Sie wirklich Ihr eigenes bauen müssen, gibt es drei Optionen oben aus meinem Kopf ...

  1. als Anfänger ich einige Templat durch individuelle tat Parsen (strpos, substr und so weiter) . es war sehr langsam, unelegant und fehleranfällig. Ich würde das nicht empfehlen.

  2. regulären Ausdruck Chaos. Wenn Sie Regexps nicht beherrschen, vergessen Sie es. aber es ist wahrscheinlich eine der schnelleren Methoden.

  3. vielleicht könnte man auf dem Weg etwas zusammen mit den php tokenizer functions ...

  4. die DOM -Erweiterung! Machen Sie Ihre Vorlagen XHTML-kompatibel und laden Sie sie als XML-Dateien. Wow, das ganze Parsing ist für dich erledigt! jetzt haben Sie einen schönen Baum entweder mit benutzerdefinierten Tags, wie


     <loop item="$myVariable" times="$x"> 
     <print name="$myVariable->name" entities="yes" nl2br="yes" purify="removeemptytags, xss"/> 
     <hr/> 
     </loop> 

sieht schon ein wenig wie Smarty, imho. Sie müssen nur etwas interpretieren (indem Sie die Subknoten des Loop-Knotens $ x mal wiederholen), oder es vielleicht in php übersetzen und zwischenspeichern (smarty macht das für die Performance).

oder, wenn Sie Kommentare bevorzugen, so etwas wie diese (aber hier haben Sie mehr Parsing zu tun, als benutzerdefinierte Tags verwenden)


    <!-- begin loop:myVariable --> 
     <-- print:myVariable->name() --> 
     <hr/> 
    <!-- end loop --> 

ich kann nicht die DOM-Methode vorstellen, sehr schnell sein, aber wenn Sie brauchen wirklich moar Geschwindigkeit, Übersetzung in nativen PHP-Code und/oder Caching der gerenderten HTML wäre besser (wenn Geschwindigkeit wirklich ist, dass wichtig, nicht schreiben Sie Ihren eigenen Code. außer wenn Sie Carmack oder Skeet vielleicht sind).

viel Glück.

+0

Ihre xml Tags und Attribute in # 4 sind nicht gültig xhtml. Sie müssten sie benennen. Schau dir PHPTAL an. – rick

+0

uh, das war nur ein Beispiel! Ich möchte selbst keine Templating-Engine schreiben, ich bin glücklich mit php, aber danke für den Link zu phptal, es ist interessant (für mich), wie nah ich kam (nicht sehr nah). – stefs