Webdesign in Siegen

Templating Engine, die 2 te - Gedankengänge

Fragen zum Thema PHP können hier gestellt werden

Moderator: Basti

Templating Engine, die 2 te - Gedankengänge

Beitragvon .wired am 23.04.2008, 21:24

Hallo ein weiteres Mal. Dieser Thread soll mehr oder weniger ein Gedankengang zu meiner Templating Engine sein, wobei ich natürlich auch Fehler (sogar gleich im ersten Post) schreiben werde, Verbesserungen durchdenken ect. Ich würde mich auch sehr darüber freuen, wenn ihr konstruktiv Vorschläge zum Verbessern geben könntet (auch mit konkreten Codebeispielen ^^).

Also: Let's rock!

Wie bereits geschrieben, komme ich gleich am Anfang mit einem Fehler. Dieser dreht sich um die Parsefunktion, also das wichtigste überhaupt. Speziell geht es mir um die Includes von Dateien. Wie könnte also am Besten Dateien in einem Template includieren? Es sollte weiterhin auch eine gewisse Includetiefe geben, das heißt, eine bereits includierte Datei sollte auch noch weitere Dateien Includieren können. Sollte ich hierzu lieber mehrdimensionale Arrays benutzen oder.... kA ^^

Erstmal mein Codeschnipsel:

Code: Alles auswählen
$this->options['right_delimiter'] = '\}';
$this->options['left_delimiter'] = '\{';

  protected function _parse($template_str, $enable_includes, $delete_comments)
  {
    if($delete_comments)
    {
      // delete comments ( {* thecomment *} )
      $template_str = preg_replace("/".$this->options['left_comment_delimiter'].'(.*)'.$this->options['right_comment_delimiter'].'/isUe', '', $template_str);
    }
   
    if($enable_includes)
    {
      while(preg_match('/'.$this->options['left_delimiter'].'include:(.+)'.$this->options['right_delimiter'].'/siU', $template_str))
      {
        $template_str = preg_replace('/\{include:(.+)\}/esiU', /* Problem, wie könnte man dies am Besten lösen? Habe schon mit implode versucht, allerdings kam immer ein Fehler, den ich nicht ganz verstanden habe und den ich nicht beheben konnte */ , $template_str);
      }
    } 
     
    return $template_str;
   
    unset($template_str);
  }


Wie gesagt, Kritik, Verbesserungsvorschläge, Gedankengänge, alles erwünscht :)

MfG .wired
Bild Bild
Benutzeravatar
.wired
Mitglied
 
Beiträge: 316
Registriert: 24.06.2007, 20:36
Wohnort: Diekholzen

Re: Templating Engine, die 2 te - Gedankengänge

Beitragvon Avedo am 23.04.2008, 23:16

Abend!
Das Includen von Dateien hat verschiedene Vorteile aber auch Nachteile. Ein Vorteil ist auf jeden Fall, dass PHP-Code, der in der Datei enthalten ist, ausgeführt wird. Dabei werden Fehler, die zum Beispiel mit eval() auftreten, vermieden. Ein häufig auftretender Fehler bei includes ist, das der includierte Code nicht an der richtigen Stelle, sondern einfach am Anfang der Datei bei der Ausgabe steht. Wie löst man dieses Problem nun am besten? Ich denke meine Methode war schon nicht schlecht. Include die Datei, puffer die Ausgabe und speichere sie in eine Variable. Mit Platzhaltern kannst du dem HTML-Code in der Variable einen Platz im Template zuordnen. Oder eben eine die Variable ins Template einbinden. Über die perfekte Lösung lässt sich ja, wie wir gesehen haben, streiten.
MfG, Andy
Ich bin zu Mimis Religion konvertiert!
I'm so tired of slitting the throats of people calling me a violent psychopath.
Benutzeravatar
Avedo
Mitglied
 
Beiträge: 464
Registriert: 09.12.2007, 20:12
Wohnort: Göttingen

Re: Templating Engine, die 2 te - Gedankengänge

Beitragvon .wired am 24.04.2008, 12:38

Ich werde noch weiter suchen, bis eine Lösung mich ganz befriedigt....

Aber ich habe wieder etwas: Ich möchte die Klasse möglichst klein, leistungsstark und schnell halten, dennoch aber einigermaßen funktional. Der User der Klasse soll so wenig Funktionen wie möglich lernen. Nun bin ich aber am Überlegen, ob ich nicht doch eine Funktion schreibe (habe ich schon mal erwähnt, dass ich mir "Funktion" angewöhnt habe, obwohl ich weiß, dass es innnerhalb von Klassen "Methode" heißt :D), die einfach die verschiedenen Optionen einliest, anstatt beim Erstellen eines Objektes eine längere Liste von Parametern - abgesehen vom Pfad zum Templatefile - angeben zu müssen... Hat irgendwer dazu Vorschläge? (Weitere Einstellungsmöglichkeiten wären z.B. das Aktivieren des Caching Systems für einzelne Dateien, Löschen von Kommentaren, Erlauben von Includes, Dursuchen nach Schleifen, Blöcken, etc.). Ich möchte halt eher weniger, dass man im Quellcode der Engine selber rumgeschrieben wird, außerdem sind Caching und Includes alles Optionen, die nicht immer Permanent ausgeschaltet werden sollten, weswegen die Einstellungsmöglichkeit in der Datei wohl auszuschließen ist.

Außerdem ändere ich nun den Konstruktor um. Anstatt noch eine zusätzliche Funktion für eine neue Datei wie bisher, lasse ich den Konstruktor nun den vollen Pfad zur Templatedatei auslesen.

MfG .wired


Weitere Überlegung: Wie lasse ich die _parse() Funktion ausführen? Entweder ich lasse sie gleich im Konstruktor durchführen, was aber weitere Überlegungen und Komplikationen nach sich ziehen würde, da der Programmierer noch die Möglichkeit haben soll, Variablen, Platzhalter, Blöcke, etc. zu definieren - oder ich lasse sie bei der Funktion display() ausführen, welcher auch kein weiterer Parameter übergeben wird.

Zusammenfassung (was muss der durchschnittliche Programmierer nun alles schreiben?)
Code: Alles auswählen

$tpl = new template($fullpath_to_the_templatefile, [$enable_caching /* Wie gesagt, vielleicht sollte ich das lieber in einer neuen Funktion unterbringen */ ]);

/* Nur in der Überlegung, so z.B. könnts aussehen:
$tpl->setOptions /* ich habe es nicht so mit Namen...  :?  */ ($enable_caching, $do_loops, $do_blocks, $delete_comments, /* weitere Optionen?  Alles mit 0 bzw 1 bestimmbar, false und true würde folglich natürlich auch gehen... Wäre aber wieder twas, was der Programmierer lernen müsste  :?  */

$str = assign($key, $value /* oder weitere Möglichkeit: $key = array($placeholder => $value) */);

$str = getBlock /* der Name der Funktion gefällt mir nicht so ganz  :?  */ ($blockname, array($key => $value));

$str = ifBlock /* auch hier gefällt mir der Name nicht  :?  */ ($blockname, array($var, $conclusion));

$tpl->display();

Bild Bild
Benutzeravatar
.wired
Mitglied
 
Beiträge: 316
Registriert: 24.06.2007, 20:36
Wohnort: Diekholzen

Re: Templating Engine, die 2 te - Gedankengänge

Beitragvon Avedo am 24.04.2008, 14:14

Hallo!
Also was der Quellcode da unten mir sagen soll, keine Ahnung. Zudem dachte ich du wolltest deine Klasse auf das wesentliche beschränken. Auf das wesentliche beschränken heißt für mich Template einlesen, Platzhaltern (welcher Art auch immer) ihre Inhalte zuordnen und Template ausgeben. Alles andere wie Schleifen und Bedingungen haben meiner Meinung nach nicht in einer TemplateEngine zu suchen. Das sind alles logische Abläufe, die man auch vor dem Ersetzen der Platzhalter machen kann.

Des weiteren möchte ich auch auf eine sehr sehr praktische Funktion von PHP hinweisen, die einem die Methode parse() erspart. Gemeint ist printf(). Diese Funktion erfüllt eigentlich schon alle Aufgaben einer TemplateEngine.

Code: Alles auswählen
<?php
$template =
     '<html>
          <head>
               <title> %s </title>
          </head>
          <body>
               Sie sind unser %d. Besucher.
               <img src="%s" alt="RandomPic"/>
          </body>
     </html>';

printf($template,
     $replace1,
     $replace2,
     $replace3);
?>

Das schöne an dieser Funktion ist, dass diese Platzhalter sogar einen Speziellen Datentyp verlangen.

Datentypen
%s (String)
%d (Integer)
%f (Float)
%o (Integer, octal)
%x (Integer, hexadecimal)

MfG, Andy
Ich bin zu Mimis Religion konvertiert!
I'm so tired of slitting the throats of people calling me a violent psychopath.
Benutzeravatar
Avedo
Mitglied
 
Beiträge: 464
Registriert: 09.12.2007, 20:12
Wohnort: Göttingen


Zurück zu PHP

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast