Ankündigung

Einklappen
Keine Ankündigung bisher.

Kontrollstrukturen in Template engine

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Kontrollstrukturen in Template engine

    Hallo,

    ich bastell grad an einer Template Engine rum (nur für mich zum Spass an der Freude)

    dort will ich nun ein paar Kontrollstrukturen einbringen, z.B.

    [IF $Variable==1]
    <table></table>
    [ELSE]
    <tr></tr>
    [/IF]

    [FOREACH $Variable_Array AS $Var]
    <tr>
    <td>[$Var]</td>
    </tr>
    [/FOREACH]

    Das ganze sollte auch verschachtelt gehen.

    Jeman ne Idee wie man das machen könnte, hab mal n bissl mit regulären ausdrücken rumgespielt, hat aber nicht so geklappt

    Danke und Gruß
    Kerstel

  • #2
    Jeman ne Idee wie man das machen könnte
    Ja, und auch wenn Du das nicht hören magst, die allgemeingültige Nahezu-floskel schlechthin: Nicht das Rad neu erfinden und versuchen die 10tausendste "eigene" Templateengine programmieren, sondern eine existierende und wohldurchdachte Lösung benutzen. Es gibt genug (andere) Anwendungsgebiete, die eigenes Gehirnschmalz benötigen.
    [COLOR="#F5F5FF"]--[/COLOR]
    [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
    [COLOR="#F5F5FF"]
    --[/COLOR]

    Kommentar


    • #3
      Hallo kerstel,

      Kontrollstrukturen in Templates sind überflüssig, bzw. unsinnig. Templates dienen in der Regel dazu Code von Design zu trennen. Auf diesem Weg gelangst du sehr schnell in die Welt von MVC, das beschreibt, dass Kontrollstrukturen durch Aktionen im Controller mit den Informationen des Models abgewickelt werden sollten. Diese Vorgehensweise ist IHMO sauberer als Funktionalität in Templates zu legen.

      Weiterer Nachteil der Kontrollstrukturen ist, dass der Entwickler dazu verleitet wird viele Funktionen "mal eben schnell" in das Template - das ja für einen konkreten Anwendungsfall oder gar eine konkrete Sprache erstellt wird - zu integrieren. Damit wird die Funktion, die vielleicht in einer anderen Sprache auch benötigt wird nicht abstrahierbar und man beginnt mit C&P-Engeneering.

      Meiner Meinung nach solltest du besser eine Möglichkeit schaffen, einen Controller für dein Template definieren zu dürfen, der die Inhalte entsprechend seinen Model-Informationen manipulieren kann.
      Viele Grüße,
      Dr.E.

      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      1. Think about software design [B]before[/B] you start to write code!
      2. Discuss and review it together with [B]experts[/B]!
      3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
      4. Write [I][B]clean and reusable[/B][/I] software only!
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

      Kommentar


      • #4
        Zitat von dr.e. Beitrag anzeigen
        Meiner Meinung nach solltest du besser eine Möglichkeit schaffen, einen Controller für dein Template definieren zu dürfen, der die Inhalte entsprechend seinen Model-Informationen manipulieren kann.
        Aber dann muss ich als Entwickler ins Design eingreifen. Oder der Designer entwickelt (php) Code.
        Gibt es überhaupt ein produktiv nutzbares Template-System, das keine Kontrollstrukturen in seiner Template-eigenen Syntax hat? Ernst gemeinte Frage, da ich mich mit Template-Systemen nicht weiter beschäftige.

        Kommentar


        • #5
          Hallo David,

          Gibt es überhaupt ein produktiv nutzbares Template-System, das keine Kontrollstrukturen in seiner Template-eigenen Syntax hat? Ernst gemeinte Frage, da ich mich mit Template-Systemen nicht weiter beschäftige.
          Ich denke nicht, jedoch sind Kontrollstrukturen weiterhin ein Killer für Generik und Wiederverwendbarkeit.

          Mit nur einem Templatesystem ist einem aber nicht wirklich geholfen. Nicht sauber eingesetzt bietet es genau die Nachteile, die du genannt hast. Gibt man dem Template-Bauer jedoch die Möglichkeiten, auf einen Satz von Komponenten zugreifen zu können, die im Template "verbaut" werden können, so sieht die Sache wieder anders aus. Sollte eine Komponente dann auch noch per Template konfigurierbar sein (z.B. Sprachumschaltung eines CMS), ist es für den Template-Bauer ohne weiteres möglich eine Design-Aufgabe komplett alleine umzusetzen. Dazu muss das Templatesystem jedoch die Möglichkeit beinhalten diverse konfigurierbare Komponenten einbinden zu können.

          Letzters unterstützen jedoch mir bekannte Templatesysteme (ich klammere Templating, das in diversen MVC-Frameworks integriert ist hierbei aus) jedoch nicht und damit ist der Einsatz eines Templatesystems eines Templatesystems wegen Unsinn.

          Aber lassen wir mal kerstel zu Wort kommen.
          Viele Grüße,
          Dr.E.

          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          1. Think about software design [B]before[/B] you start to write code!
          2. Discuss and review it together with [B]experts[/B]!
          3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
          4. Write [I][B]clean and reusable[/B][/I] software only!
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

          Kommentar


          • #6
            @nikosch

            Mag ich schon hören, trotzdem macht es Spass Ich muss es ja nicht vertreiben usw. sondern es geht eher ums allgemeine verständnis

            @dr.e.
            Seh ich ein wenig anders. Es macht Durchaus Sinn das der Designer kontrollstrukturen hat um flexibel auf Variablenwerte reagieren zu können, z.B. ist das Zitieren im Board auch nix anderes, sowas kann der Entwickler nicht abfangen. Auch eine Foreach schleife macht durchaus sinn. Der Entwickler weiß ja nicht was mit den Variablen im Template passiert.

            Ich hab bei Smarty in den Cached-Files gesehen, dass die Kontrollstrukturen einfach durch PHP Code ersetzt werden. Ich denke aber das bei einem Umfangreichen Template es stark an die Performance geht wenn der Compiler ständig angesprungen wird. Oder irre ich mich da, da ich bei Smarty eigentlich noch nie Performance Probleme hatte.

            Viele Grüße
            Kerstel

            Kommentar


            • #7
              Zitat von kerstel Beitrag anzeigen
              Ich hab bei Smarty in den Cached-Files gesehen, dass die Kontrollstrukturen einfach durch PHP Code ersetzt werden. Ich denke aber das bei einem Umfangreichen Template es stark an die Performance geht wenn der Compiler ständig angesprungen wird. Oder irre ich mich da, da ich bei Smarty eigentlich noch nie Performance Probleme hatte.
              Einen Parser brauchst Du so oder so. Und PHP gestartet wird auch so oder so (wenn das Template System in PHP geschrieben wurde). Wenn Du erstmal den Parser hast, ist der Compiler template->php kein Problem. Und wie bei Smarty musst Du den Übersetzungprozess nur ausführen lassen, wenn sich das Template ändert.

              Kommentar


              • #8
                Zitat von David Beitrag anzeigen
                Einen Parser brauchst Du so oder so. Und PHP gestartet wird auch so oder so (wenn das Template System in PHP geschrieben wurde). Wenn Du erstmal den Parser hast, ist der Compiler template->php kein Problem. Und wie bei Smarty musst Du den Übersetzungprozess nur ausführen lassen, wenn sich das Template ändert.
                schon richtig, aber trotzdem denke ich es ist ein unterschied ob ich den compiler einmal starte oder 360 mal in einem script, oder? Zudem ja das dann kein richtiger cache ist, da bei smarty die files ja trotzdem immer vom php compiler angefasst werden müssen. Wäre es da nicht sinnvoller das fertige html file zu cachen und das neu zu schreiben wenn sich was ändert?

                Kommentar


                • #9
                  Wenn Du so einen Fall "fast statischer Seiten" hast, ja. Hat aber nicht jeder.
                  Und es gibt auch Caches für PHP Code, apc zum Beispiel. Dann muss der Parser nicht jedes Mal laufen.

                  Kommentar


                  • #10
                    Ich hab bei Smarty in den Cached-Files gesehen, dass die Kontrollstrukturen einfach durch PHP Code ersetzt werden. Ich denke aber das bei einem Umfangreichen Template es stark an die Performance geht wenn der Compiler ständig angesprungen wird. Oder irre ich mich da, da ich bei Smarty eigentlich noch nie Performance Probleme hatte.
                    Nein, Smarty "kompiliert" den Template-Code gerade deshalb in PHP-Code, da die Performance dadurch deutlich besser ist. Benchmarke mal Smarty mit deaktiviertem Cache gegen Smarty mit aktiviertem Cache und du wirst den deutlichen Unterschied sehen...
                    Viele Grüße,
                    Dr.E.

                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                    1. Think about software design [B]before[/B] you start to write code!
                    2. Discuss and review it together with [B]experts[/B]!
                    3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
                    4. Write [I][B]clean and reusable[/B][/I] software only!
                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                    Kommentar


                    • #11
                      Nachtrag:

                      @dr.e.
                      Seh ich ein wenig anders. Es macht Durchaus Sinn das der Designer kontrollstrukturen hat um flexibel auf Variablenwerte reagieren zu können, z.B. ist das Zitieren im Board auch nix anderes, sowas kann der Entwickler nicht abfangen. Auch eine Foreach schleife macht durchaus sinn. Der Entwickler weiß ja nicht was mit den Variablen im Template passiert.
                      Das musst du mir jetzt aber erklären. Warum sollte der Entwickler auf dieses Event nicht angemessen in einem (MVC-)Controller reagieren können? Beim Zitieren wird doch lediglich der Beitragstext eines bekannten Posts mit Zitat-Markierungen versehen und im Eingabefeld dargestellt. Die Beitrags-ID ist dabei genauso bekannt, wie die Informationen über den zitierten Benutzer und den Benutzer, der zitieren möchte...
                      Viele Grüße,
                      Dr.E.

                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      1. Think about software design [B]before[/B] you start to write code!
                      2. Discuss and review it together with [B]experts[/B]!
                      3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
                      4. Write [I][B]clean and reusable[/B][/I] software only!
                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                      Kommentar


                      • #12
                        Soweit ich das verstanden habe, war die Frage nicht auf Smarty-Parser<->php bezogen sondern "Warum überhaupt Template-Code speichern (und jedes Mal ausführen) und nicht gleich das HTML Ergebnis?"

                        Das eine schließt übrigens das andere nicht aus

                        Kommentar


                        • #13
                          hm, in diesem fall wäre es ja einfach,

                          ich suche nach dem string [IF und ersetze das durch <?php if... ?>, zumindestens theoretisch einfach

                          Kommentar


                          • #14
                            Den Mehrwert dieser Templatesyntax mußt Du mir dann mal erklären. Ob ich jetzt
                            Code:
                            [IF $Variable==1]
                            <table></table>
                            [ELSE]
                            <tr></tr>
                            [/IF]
                            
                            [FOREACH $Variable_Array AS $Var]
                            <tr>
                            <td>[$Var]</td>
                            </tr>
                            [/FOREACH]
                            oder
                            Code:
                            <? IF ($Variable==1): ?>
                            <table></table>
                            <? ELSE: ?>
                            <tr></tr>
                            <? ENDIF; ?>
                            
                            <? FOREACH ($Variable_Array AS $Var): ?>
                            <tr>
                            <td><?= $Var ?></td>
                            </tr>
                            <? ENDFOREACH; ?>
                            schreibe, ist doch echt Hupe. PHP bietet halt einfach schon zu viel Templateelemente, dass es keinen Sinn macht, solche einfachen Strukturen nachzubilden.
                            [COLOR="#F5F5FF"]--[/COLOR]
                            [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                            [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                            [COLOR="#F5F5FF"]
                            --[/COLOR]

                            Kommentar


                            • #15
                              aber genauso macht es doch smarty auch

                              Kommentar

                              Lädt...
                              X