zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden Frage zur Realisierung eines Template Parser

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 26.09.2008, 22:14
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 26.12.2006
Beiträge: 678
Schelm.isch wird schon bald berühmt werden
Standard Frage zur Realisierung eines Template Parser

Guten Abend.

Ich habe bisher immer ein PHP Templatesystem genutzt (selbst geschrieben), dass bei jedem Arbeitsdurchlauf die Templatedatei mit Subtemplates und anschließend Daten füllt.
Das negative ist der heftige Einsatz von regulären Ausdrücken, was ja nicht unbedingt große Performance bietet.

Ich bin nun dazu bereit, das ganze wie beispielsweise im phpBB3 zu regeln. Das Template wird geparsed und die Inhalte durch PHP-Anweisungen, wie echo class->methode(); eingeladen über eval().

Nun meine Frage: Wenn ich eine Forenseite parse, dann könnte da ja unter Umständen sowas stehen wie: Gib Usernamen XYZ aus. Nun würde die Methode den Namen abfragen und ein echo würde erfolgen.
Aber bei 15 Einträgen, würden ja 15 DB Abfragen notwendig werden (abzüglich der, die mehrfache Einträge auf der Seite verfasst haben).

Wie kann man soetwas möglichst effizient gestalten? Mir fehlt, ehrlich gesagt, die Idee.

Einen schönen Abend
Schelm.isch
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 26.09.2008, 23:28
Benutzerbild von Curtains
(Schlafen||Programmieren)
XHTMLforum-Mitglied
 
Registriert seit: 27.08.2008
Beiträge: 198
Curtains befindet sich auf einem aufstrebenden Ast
Standard

Hallo Schelm.isch,

1) eval() == immer!
2) Templates bestimmen nicht WAS gezeigt wird, sondern WIE. Das Controller-Objekt weiss schon vorher, was gefragt wird (ohne dabei das Template anschauen zu müssen). Und das Model-Objekt kennt die optimale SQL-Query und muss sie nur durch die entsprechenden Parameter ergänzen.
3) Platzhalter sind allgemein gehalten. Die Frage: 'Gib Usernamen XYZ aus' sollte nirgends vorkommen.

Geändert von Curtains (26.09.2008 um 23:38 Uhr)
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 27.09.2008, 10:01
Benutzerbild von mantiz
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 25.02.2007
Beiträge: 2.843
mantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz sein
Standard

Zitat:
Zitat von Curtains Beitrag anzeigen
1) eval() == immer!
2) Templates bestimmen nicht WAS gezeigt wird, sondern WIE. Das Controller-Objekt weiss schon vorher, was gefragt wird (ohne dabei das Template anschauen zu müssen). Und das Model-Objekt kennt die optimale SQL-Query und muss sie nur durch die entsprechenden Parameter ergänzen.
3) Platzhalter sind allgemein gehalten. Die Frage: 'Gib Usernamen XYZ aus' sollte nirgends vorkommen.
1) Wieso? (ernsthaftes Interesse)
2) Nicht jeder arbeitet nach dem MVC-Prinzip
Bei mir sind Templates sehr oft Controller und View in einem, weil das Handlich für mich so einfacher ist.
3) ?

@Schelm.isch:
Würde etwas dagegen sprechen die User-Tabelle zu joinen und den Benutzernamen direkt zur Verfügung zu stellen?
So nach dem Motto:
Code:
SELECT t1.*, t2.username FROM forum_posts t1 LEFT JOIN users t2 ON t2.user_id = t1.user_id
Mit Zitat antworten
  #4 (permalink)  
Alt 27.09.2008, 13:14
Benutzerbild von Curtains
(Schlafen||Programmieren)
XHTMLforum-Mitglied
 
Registriert seit: 27.08.2008
Beiträge: 198
Curtains befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von mantiz Beitrag anzeigen
1) Wieso? (ernsthaftes Interesse)
Bei eval() sehe ich das Hauptproblem nicht in dem erhöhten Sicherheitsrisiko vor möglichen Injektionen, sondern im schlechten Programmstil, den man sich aneignet.
In der Regel gibt es für jedes Problem eine (viel) elegantere Lösung, die ohne eval() auskommt. Sonderausnahmen sind mir nicht bekannt.

Zitat:
Zitat von mantiz Beitrag anzeigen
2) Nicht jeder arbeitet nach dem MVC-Prinzip
Bei mir sind Templates sehr oft Controller und View in einem, weil das Handlich für mich so einfacher ist.
Ein sauberes MVC löst so viele Probleme und ist einfach sexy Aber diese Erfahrung muss wohl jeder selber machen.
Templates stelle ich gerne den Designern zu verfügen, welche die Applikationen auf Hochglanz bringen. Und sie können glücklicherweise keinen (grossen) Unheil anrichten, da sie nicht mit der Controller-Logik in Berührung kommen.

Zitat:
Zitat von mantiz Beitrag anzeigen
3) ?
Bei der Anfrage: 'Gib Usernamen XYZ aus' interpretiere ich das 'XYZ' als einen hardcoded Namen.
Die Anfrage müsste eher lauten: 'Gib mir den Usernamen des jeweiligen Beitrages aus'.

Geändert von Curtains (27.09.2008 um 13:18 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 27.09.2008, 19:56
Benutzerbild von mantiz
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 25.02.2007
Beiträge: 2.843
mantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz sein
Standard

Zitat:
Zitat von Curtains Beitrag anzeigen
Bei eval() sehe ich das Hauptproblem nicht in dem erhöhten Sicherheitsrisiko vor möglichen Injektionen, sondern im schlechten Programmstil, den man sich aneignet.
In der Regel gibt es für jedes Problem eine (viel) elegantere Lösung, die ohne eval() auskommt. Sonderausnahmen sind mir nicht bekannt.
Ich habe aus dem Grund gefragt, da meine Template-Klasse eval() verwendet, um die Templates auszuführen.
Vor Injektionen hab' ich mich abgesichert, muss ich aber nochmal checken, schlechten Stil hab' ich nicht.

Zitat:
Zitat von Curtains Beitrag anzeigen
Ein sauberes MVC löst so viele Probleme und ist einfach sexy Aber diese Erfahrung muss wohl jeder selber machen.
Templates stelle ich gerne den Designern zu verfügen, welche die Applikationen auf Hochglanz bringen. Und sie können glücklicherweise keinen (grossen) Unheil anrichten, da sie nicht mit der Controller-Logik in Berührung kommen.
Ich habe vor kurzem eine kleine Komponente für Joomla geschrieben, wo das MVC-Pattern imo so ziemlich auf die Spitze getrieben wurde. Nach dem HowTo, womit ich angefangen habe, gab' es eine Klasse für das Model, eine Klasse für den Controller, eine Klasse für das View und ein Template für das View. Die Komponente war ein kleiner Shop, wo ich dann alle 4 Dateien jeweils für Artikel, Kategorien und Bestellungen hatte. Bei einer kleinen Änderung gerade, wo ich überhaupt noch keinen Plan hatte, wie ich vorgehen würde, waren sofort Model, Controller, View und Template betroffen, also 4 Dateien, die geändert werden mussten. Hinterher war ich so genervt, dass ich alles auf einen Controller und ein Model umgeschrieben habe und nur noch mehrere Views verwendet habe.
Mit meiner eigenen Template-Klasse schreibe ich mir meine Klassen (Models), die die Daten liefern und im Template werden die Daten angefordert, so nach dem Motto:
Code:
<x_module module="Users" action="listUsers" var="{|users|}" />
<x_foreach array="{|users|}" item="{|user|}">
   {|user:username|}
</x_foreach>
Finde ich OK so.

Zitat:
Zitat von Curtains Beitrag anzeigen
Bei der Anfrage: 'Gib Usernamen XYZ aus' interpretiere ich das 'XYZ' als einen hardcoded Namen.
Die Anfrage müsste eher lauten: 'Gib mir den Usernamen des jeweiligen Beitrages aus'.
OK, dann haben wir das unterschiedlich verstanden.
Mit Zitat antworten
  #6 (permalink)  
Alt 27.09.2008, 22:23
Benutzerbild von Curtains
(Schlafen||Programmieren)
XHTMLforum-Mitglied
 
Registriert seit: 27.08.2008
Beiträge: 198
Curtains befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von mantiz Beitrag anzeigen
Code:
<x_module module="Users" action="listUsers" var="{|users|}" />
<x_foreach array="{|users|}" item="{|user|}">
   {|user:username|}
</x_foreach>
Finde ich OK so.
Ich sehe den Reiz in deiner Strategie Du verwandelst die Templates in eine neue Definitionssprache. Die Templates definieren also die Applikation, indem sie beispielsweise entscheiden, wo welche Module geladen werden.
Dies erinnert mich ein bisschen an XUL oder OpenLaszlo's Programmiersprache.

Ich verfolge einen anderen Weg. Ich definiere die Applikation durch Objekte. Die Basis bildet die strikte Trennung von Controller, Model und View. Ausserdem habe ich eine Bibliothek, um Formulare und Formularelemente (Textfelder, Dropdowns, Datengitter, ..) zu definieren.

Die Definition eines Formulars sieht beispielsweise so aus:

PHP-Code:
$form = new Form('login');
$textField = new TextField('username');
$textField->setMandatory(true);
$form->setFormElement($textField);
$textField = new TextFieldPassword('password');
$textField->setMandatory(true);
$form->setFormElement($textField); 
Und innerhalb der Templates kann ich das Formular so einbinden:

PHP-Code:
<body>
...
<?php $this->showForm('login'); ?>
...
</body>
Ich glaube dies ist der kürzeste Weg, um Formulare (bzw. Applikationen) zu definieren. XML-ähnliche Syntax empfinde ich als umständlicher und unlesbarer.
p.s. Alle Formulare in meinen Applikationen werden mit Hilfe eines zentralen Formular-Templates in HTML-Code umgewandelt. In allen anderen Templates kommen nirgends input-Tags vor. Dadurch wird Rapid Prototyping sehr einfach

Wie definierst du Formulare in deinen Templates?
Mit Zitat antworten
  #7 (permalink)  
Alt 27.09.2008, 22:26
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 26.12.2006
Beiträge: 678
Schelm.isch wird schon bald berühmt werden
Standard

Hey, danke für die Antworten erstmal.

Ich muss mal zurückrudern! Also ich komme ohne eval() aus, da ich aus dem Template eine PHP Datei parsen lasse und diese dann vorher definierte Werte nur noch ausgeben muss.
Da muss ich mir nur über die Regex noch genauer Gedanken machen, denn ich möchte fehlerhafte Templates erkennen können.
Mit Zitat antworten
  #8 (permalink)  
Alt 27.09.2008, 22:47
Benutzerbild von Curtains
(Schlafen||Programmieren)
XHTMLforum-Mitglied
 
Registriert seit: 27.08.2008
Beiträge: 198
Curtains befindet sich auf einem aufstrebenden Ast
Standard

Hallo Schelm.isch,

du könntest auch ganz auf Platzhalter verzichten und direkt PHP-Code nehmen Die Templates werden dadurch nur wenig unlesbarer, aber dafür braucht es keinen Regex-Parser mehr. Diese Forumsdiskussion könnte interessant für dich sein.
Mit Zitat antworten
  #9 (permalink)  
Alt 28.09.2008, 10:23
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 26.12.2006
Beiträge: 678
Schelm.isch wird schon bald berühmt werden
Standard

Hey.

Naja, der Vorteil am Parsen und Cachen liegt darin, dass ich was lernen kann und strikter zwischen PHP und HTMl trennen kann. Ich kann mich quasi dann frei aufs HTML / CSS konzentrieren und muss mir dabei keine Gedanken um das Befüllen machen.
Mit Zitat antworten
Sponsored Links
Antwort


Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Frage zu Template gustavmega CSS 1 25.07.2009 13:52
Joomla Template - Seite zentrieren? Dav1d CSS 15 02.02.2009 14:38
Frage zu einem Gedanken (DIV positionieren) charlie CSS 1 06.09.2008 11:36
Wie dieses Template slicen damit man es mit CSS einbinden kann? ChOpSueY! CSS 1 02.07.2008 21:47
Joomla Template Problem tyrannski CSS 0 15.02.2007 15:06


Alle Zeitangaben in WEZ +2. Es ist jetzt 16:09 Uhr.