[PHP] Template Engine (beta) PHP5!

Dieses Thema im Forum "Webentwicklung" wurde erstellt von Murdoc, 9. November 2007 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 9. November 2007
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    Template Engine (beta) PHP5!

    joa muss sein

    die template engine ähnelt smarty, kann aber ned mal halb soviel^^ aber für den einsatz in kleinerern webseiten reicht se vollkommen. außerdem is smarty überladen und man braucht niemals alles was man damit machen kann

    was bietet die engine:
    • ganz normal variablen und arrays
    • callbacks (funktionen auf variablen/arrays anwenden innerhalb des templates)
    • ausgabebuffer (soviele wie man mag)
    • variablen innerhalb des templates definieren
    • module importieren (klassen) und damit hantieren

    hier mal ein beispieltemplate:

    Code:
    {* vorsicht, die engine arbeitet zeilenweiße!
    folgendes würde nicht gerendert:
    {set 
     $var = "";
    }
    *}
    
    {*
     bei kommentaren wird eine 
     ausnahme gemacht :)
    *}
    
    {* variablen definieren innerhalb des templates *}
    {set $test = 123;}
    {set $test2 = 1234; $test3 = 12345; $test4 = array('1', '2', '3', 'foo' => 'bar');}
    
    {* template variablen ausgeben *}
    {$test}
    {$test4.1}
    {$test4.foo}
    
    {* callbacks *}
    {$test|callback_name("parameter")} {* erster parameter ist immer der inhalt der variable *}
    
    {* if elseif und else *}
    {if $test == 123}
     mach was
    {elseif $test2 == 1234}
     mach was anderes
    {else}
     mach was ganz anderes
    {/if}
    
    {* foreach *}
    {foreach $test4 as $key => $value}
     {$key} => {$value}
    {/foreach}
    
    {* for *}
    {for $i=0; $i<10; $i++}
     {$i}
    {/for}
    
    {* while *}
    {while $o != 5}
     {set $o += 1;}
    {/while}
    
    {* mit der engine hantieren *}
    {* folgende variablen sind reserviert: $murdoc, $engine und $tpl *}
    {set $test6 = 123;}
    {set $test5 = $murdoc->_vars;}
    {set $test7 = print_r($test5, true);}
    {$test5.test6} {* würde 123 ausgeben *}
    {$test7} {* wurde alle methoden und variablen der engine ausgeben *}
    
    {* module importieren *}
    {import DOM => $dom} {* erst der name des objekts, dann die variable unter welcher das objekt verfügbar sein soll *} 
    
    {* mit der eingebauten dom klasse arbeiten BETA! *}
    {set $table = $dom->createTable(array('attribut' => 'wert'));}
    {set $table = $dom->tableCreateRow($table, array('attribut' => 'wert'));}
    {set $table = $dom->tableInsertCol($table, 'Inhalt', array('attribut' => 'wert'));}
    {set $table = $dom->tableInsertCol($table, 'Inhalt2', array('attribut' => 'wert'));}
    {set $table = $dom->tableInsertCol($table, 'Inhalt3', array('attribut' => 'wert'));}
    {set $table = $dom->tableAppendRow($table);}
    {set $table = $dom->tableCreateRow($table);}
    {set $table = $dom->tableInsertCol($table, 'Inhalt4', array('colspan' => '3','align' => 'center'));}
    {set $table = $dom->tableAppendRow($table);}
    {$dom->fetchTable($table)}
    
    {* mit dem DOMDocument arbeiten *}
    {set $DOM = $dom->getDOM();}
    {set $strong = $DOM->createElement('strong', 'Hallo Welt');}
    {set $DOM->appendChild($strong);}
    {$DOM->saveHTML()}
    und so wird das ganze angewendet:
    PHP:
    <? php
        
    require  'class.tpl.php' ;
        
        function 
    tpl_date2 ( $time $arr = '' ) {
            return 
    date ( $arr [ 0 ],  $time );
        }
        
        function 
    machwas ( $buffer ) {
            return 
    trim ( $buffer );
        }
        
        
    //instanzieren
        //$tpl = new tpl_Engine('ordner zu den templates', 'ordner zu modulen', 'ordner zu gerenderten templates');
        
    $tpl  = new  tpl_Engine ();
        
        
    //variable aufnehmen
        
    $tpl -> assign ( 'asdf' '1234r' );
        
        
    //da die funktion hier im globalen kontext definiert ist, kann man das auch weg lassen,
        //denn alle funktionen aus dem kontext sind in den templates anwendbar
        
    $tpl -> registerCallback ( 'test' 'tpl_date2' );
        
        
    //jetzt aber sind globale funktionen in callbacks nicht mehr anwendbar
        
    $tpl -> phpCallback  false ;
        
        
    //einen callback wieder löschen
        
    $tpl -> dropCallback ( 'test' );
        
        
    //warnungen nicht mehr ausgeben
        
    $tpl -> errorReport  false ;
        
        
    //einen ausgabebuffer anlegen
        
    $tpl -> registerOutputbuffer ( 'test' 'machwas' );
        
        
    //einen ausgabebuffer wieder löschen
        
    $tpl -> dropOutputbuffer ( 'test' );
        
        
    //das gerenderte template nach ausgabe cachen
        
    $tpl -> cacheRender  true ;
        
        
    //die ausgabe cachen (variablen sind danach nicht mehr vorhanden, anders bei mc_Tpl::cacheRender)
        
    $tpl -> cacheContents  true ;
        
        
    //die syntax prüfen vor und wärend dem rendern
        
    $tpl -> checkSyntax  true //BETA!
        
        //template rendern/aus dem cache laden und ausgeben
        //$tpl->display('test.tpl');
        
        //template immer rendern und ausgeben
        
    $tpl -> display ( 'test.tpl' false );
    ?>
    DOWNLOAD
    passwort: murdocTPL
     
  2. 9. November 2007
    AW: Template Engine (beta) PHP5!

    ...irgendwie sinnlos, das soll jetzt ned heißen, dass dein script schlecht ist oder so ganz im gegenteil aber so ne template enginge braucht doch kein mensch.

    was bringt das? warum nicht gleich php code geht viel schneller und ist zudem auch noch übersichtlicher??

    meiner meinung nach soll ne template engine php code und html so gut wie möglich trennen und zudem noch einfach sein, ich kann ja z.b. den kompletten html code auslagern(in eine von mir aus *.tpl datei) ausgaben z.b. so machen
    ...
    <div class="text"><?php print $news['news'];?></div>
    ...

    und die tpl datei am ende des scripts includen, das spart mir ne template engine bringt mehr übersichtlichkeit und php und html code sind so gut wie es geht getrennt.

    MfG
    op
     
  3. 9. November 2007
    AW: Template Engine (beta) PHP5!

    ^^
    genau das macht die engine ja.
    evtl. hast du sie dir ned genau angeschaut.

    hier mal n andres beispiel:
    php
    PHP:
    $tpl -> assign ( 'foo' 'bar' );
    tpl:
    Code:
    bla bla text bla<br />
    {$foo} blabla <br />
    mehr text.
    
    oder du magst keine ä's im template:
    PHP:
    function  keine_ae ( $output ) {
        return 
    str_replace ( 'ä' 'ae' $output );
    }
    $tpl -> registerOutputbuffer ( 'keine_ä' 'kein_ae' );
    du sparst dir schreibarbeit, denn die engine rendert einmal das template und includiert es.
    oder du kannst auch sagen "render das template, lass es von php parsen und speicher das ab"

    z.b.: aus {$foo} wird <?php print $foo; ?> und das wird gespeichert und wieder verwendet. :cacheRender = true)
    oder aus {$foo} wird <?php print $foo; ?> und das gibt bar aus und das wird gespeichert. :cacheContents = true)
     
  4. 10. November 2007
    AW: Template Engine (beta) PHP5!

    ...mir ist klar was sie macht, mir gefällt das wie nicht z.b.: du machst im template ne while so:
    ..richtig?
     
  5. 10. November 2007
    AW: Template Engine (beta) PHP5!

    das ist ein beispiel^^

    nützlich isses für sowas zb:
    PHP:
    $zeug  mysql_query ( "select * from irgendwo" );
    $tpl -> assign ( 'res' $zeug );
    Code:
    <table>
    {while $zeile = mysql_fetch_assoc($res)}
    <tr><td>{$zeile.name}</td></tr>
    {/while}
    </table>
    
    oder sowas halt
     
  6. 10. November 2007
    AW: Template Engine (beta) PHP5!

    für was es nützlich ist, ist mir auch klar, wie oben schon gesagt ich finde es einfach umständlich, bei mir würde das so aussehen
    das reicht locker bei einfachen dingen, wie du ja auch oben schreibst und ich erspar mir ne template engine, unnötigen code, zeit, etc.(nen cache gibts zwar ned, aber das ist dann auch schon alles).

    MfG op

    PS: hier noch ein interessanter link: http://www.entwickler-blog.de/archiv/1-PHP-und-Template-Engines.html#extended
     
  7. 10. November 2007
    AW: Template Engine (beta) PHP5!

    okay, aber was bei raus kommen wird ned^^

    ich spaar mir mit der engine das <?php ?> und halte den quelltext übersichtlich, ned mehr und ned weniger.

    ps: und wie gesagt, das was du machst (das direkte schreiben von php-code im file) macht die engine auch, nur eben im hintergrund. (smarty macht das auch ned anders)

    ich finde ein {$bla} übersichtlicher als <?php print $bla; ?>

    und nochmal: die engine rendert einmal ein template und bindet dieses immer wieder ein.
    es wird also ein php-file gespeichert in dem php-code eingebettet wurde und includiert beim aufruf $tpl->display()

    wenn man möchte das ein template immer gerendert wird, muss man das auch mit angeben.
     
  8. 10. November 2007
    AW: Template Engine (beta) PHP5!

    ...worauf ich hinaus wollte, für einfache seiten, ist es nicht von nöten ne template engine zu verwenden und man kann trotzden html und php code trennen, da php schon ein ist, siehe link!

    Das mit dem chaching kann meine ausführung natürlich ned(bringt bei kleinen websites wahrscheinlich auch nicht).

    Was deine enige macht ist mir schon klar, aber das hab ich ja schon mehrmals erwähnt^^.

    Bei aufwendigeren und größeren seiten, würd ich zu deiner engine greifen, weil sie mir eigentlich sehr gut gefällt(die syntax ist der von php sehr nahe, das find ich schön) .

    MfG op
     
  9. 10. November 2007
    AW: Template Engine (beta) PHP5!

    @opio12: Sinn und Zweck einer Template Engine ist es, Design sauber vom Code zu trennen, wobei man mit Fug und Recht behaupten kann, dass Templates Engines allgemein keine wirkliche Trennung der Logik von Code und Design erlauben.

    Murdoc-4D: Ich dir gleich mal ein paar Tipps geben, da ich deinen Code mal überflogen habe:

    - Du vereinst ein paar Klassen in einer PHP-Datei. Mach das bitte nie wieder!
    - Du dokumentierst deinen Code in keinster Weise. Mach das bitte nie wieder!

    Im übrigen sind Methoden automatisch public - du musst das nicht unbedingt mit dazuschreiben.

    Zu Smarty selber haste schon recht.
    Für kleinere Projekte ist Smarty definitiv ein Kaliber zu groß - deine Engine sieht sonst ja garnicht mal so schlecht aus, allerdings wäre das für mich persönlich nichts.
    Für die anderen, welche eine kleine aber feine Engine möchten, können deine ja nehmen, wobei ich es persönlich recht blöd finde, dass du Kommentare mit in den Code einbaust
     
  10. 10. November 2007
    AW: Template Engine (beta) PHP5!

    jep, die zwei klassen hab ich in einen file geschrieben um das ganze für mich selber übersichtlich zu halten. die klasse mc_Tpl is für das benutzen da, und die klasse tpl_Engine für das verarbeiten der templates. die dritte klasse tpl_DOM ist rein experimentell

    wegen kommentaren: ich selber brauch sie nicht und bei fragen steh ich zur verfügung. sonst kommentier ich meine klassen schon, nur bei der hatt ich keine lust

    (ps: den kommentar in der ausgabe kann man recht einfach entfernen^^)
     
  11. 11. November 2007
    AW: Template Engine (beta) PHP5!

    Ja, solangs für dich selber ist, kanns mans ja schreiben, wie man will.
    Nur für andere isses eben zeitaufwändig.

    Sonst wie gesagt eine super Klasse und werd ich mir aufheben und mal bissl was bei deiner Logik abgucken, bei evtl auftretenden Problemen.=)
    Man will ja nich immer denken^^
     
  12. 13. November 2007
    AW: Template Engine (beta) PHP5!

    Nicht? Also ich trenne meine Logik strikt von meinem Design mit Hilfe einer TemplateEngine, innerhalb der Templates sogar nochmal erneut in semantischem HTML mit CSS. Wo kann man mit Fug und Recht behaupten dass man Logik nicht von Design trennen kann?

    Dies kann so nicht stehen bleiben!

    Sehe ich ähnlich, ist in meinem Projekten ein Absolutes NoGo!

    Sehe ich auch kritisch, aber mein Gott, in dem Rahmen noch OK. Wobei ich sagen muss, dass ich auf extra Ersatzzeichen für die PHP - Codes etc. in meiner Engine verzichte um hier so viel Performance wie möglich rauszuholen. Heißt also direktes einbetten der prints mithilfe der PHP Processing Instructions und ich muss sagen, man kann da noch einiges bei dir Refaktorieren!

    Möchten wir bei PHP weiter bei dem Kindergarten bleiben und alles ohne feste Regeln und Strukturen schreiben, oder möchten wir professionell und ordentlich sein? Falls wir beim zweiten sind, deklarieren wir jede Methode und Eigenschaft ordentlich und nicht halbgar, besonders im Hinblick auf Kompatibilitäten. Dies ist nicht nur meine persönliche Meinung sondern offizielle Forderungen die sich bei PHP durchsetzen sollen, damit PHP im Businessbereich vollends akzeptiert wird. Wenn ich jedes mal dieses <?= lese, weil es irgendwann mal so ging ... KOTZE.

    Ich persönlich halte Smarty für kein einziges Projekt zu groß! Jedoch bin ich auch Lizenzgründen von Smarty abgerückt, aber auch besonders im Hinblick dass die Rendertime von Smarty deutlich geschlagen werden kann, das liegt aber im Ermessen und Geschmack des Verantwortlichen.

    Und dieser Link http://www.entwickler-blog.de/archiv/1-PHP-und-Template-Engines.html#extended der oben gepostet wurde .... Also ich möchte sagen, dass derjenige der Kritik an Murdoc versucht mehr bringen muss, also so ein Stück (nichtmehr in Standardkonfigurationen lauffähiger) PHP - Code wie in dem Beispiel. Das fängt bei den Klammern nach dem include an, geht über das <?= und hört bei den anderen Shorttags auf!
     
  13. 14. November 2007
    AW: Template Engine (beta) PHP5!

    ...das war ein beispiel, wie mans machen könnte ohne eigenen template engine und wenn du dich an sowas "<?=" kann ich nur den kopf schütteln, aber ok.

    also du hast in deinen templates keine schleifen, abfragen,...??

    MfG opio12
     
  14. 14. November 2007
    AW: Template Engine (beta) PHP5!

    @opio12:
    logik:
    PHP:
    <? php
        $query 
    "
            SELECT 
                ta.spalte_a as aa,
                ta.spalte_b as bb,
                tb.spalte_a as ab,
                tb.spalte_b as ba,
                COUNT(tc.id) as counter
            FROM 
    { $db -> prefix } tabelle_a as ta
            LEFT JOIN 
    { $db -> prefix } tabelle_b as tb ON (
                ta.id = tb.id 
                && (
                    ta.splate_c != tb.splate_c 
                    || ta.splate_d != tb.splate_d
                ) || (
                    ta.id = 1 
                    && tb.id != 5
                    && tc.stp = UNIX_TIMESTAMP()
                )
            )
            NATURAL JOIN 
    { $db -> prefix } tabelle_c as tc ON ta.id = tc.id
            WHERE ta.id != 7
            GROUP BY ta.id
        "
    ;
        
        
    $res  $db -> query ( $query );
        
    $array  = array();
        while(
    $row  $db -> fetch_assoc ( $res )) {
            
    $array [] =  $row ;
        }
        
    $tpl -> assign ( 'zeug' $array );
    ?>
    design
    HTML:
    {foreach $zeug as $key => $value}
     <h4>{$value.counter}</h4>
     <strong>text</strong> <span style="color: green">{$value.aa}</span><br />
     dbla bla bla {$value.bb} blb<br />
     <ul>
     <li>{$value.ab}</li>
     <li>{$value.ba}</li>
     </ul>
    {/foreach}
    
     
  15. 14. November 2007
    AW: Template Engine (beta) PHP5!

    ...ich weiß wie man das macht, aber auch hier hast du eine forschleife verbaut, was laut MakenX nicht ins design gehört, daher auch meine frage wie er das macht!(mir fällt da nur ein mit ob_start(), ob_get_contents() und ob_end_clean(), dann braucht man keine schleifen mehr im design, dass ist für mich eine gelungene trennung)
     
  16. 14. November 2007
    AW: Template Engine (beta) PHP5!

    Tja und ich kann nur den Kopf schütteln, dass du etwas verteidigst, was in der heutige PHP - Soll- und Standard - Konfiguration nichtmehr lauffähig ist .... Und selbst wenn es ein Beispiel ist, ein Beispiel, welches eine Gegenargumentation stützen soll, sollte schon "kräftiger" sein als das "Streitthema" selbst ...

    Und was hat eine Schleife zur Ausgabe mit Logik zu tun? Und ja, ich habe keine Abfragen (die gehören zur Logik) in meinen Templates!

    Verstehe ich dich da richtig? Weil deiner Auffassung nach eine Schleife Logik ist, erstellst du z.B. deine select - Forms in der "Logik Schicht" und assignst die dann mit get_contents dem Template ... Sollte es so sein, hat das nichts mit Trenning von Logik und Design zu tun!
     
  17. 14. November 2007
    AW: Template Engine (beta) PHP5!

    ...dann schreib halt "<? print $var?>, wenn dich das glücklicher macht (verwende ich so bei einfacheren Projekten).

    ..ok, logik ist vlt. nicht das richtige wort, aber wenn du schon so auf die trennung von design und code beharrst, dann haben dort schleifen auch nix zu tun(meine meinung)!!

    ganz genau...
    PHP:
    ...
    ob_start ();   
    while(
    $files  mysql_fetch_array ( $query )) {
            
    $template_tmp  = new  template ( "file_row" );
            
    $template_tmp -> replace ( "ID" $files [ 'uid' ]);
            
    $template_tmp -> replace ( "NAME" $files [ 'name' ]);
            
    $template_tmp -> replace ( "DATE" $files [ 'date' ]);
            
    $template_tmp -> parse ();
    }
    $filelist  ob_get_contents ();
    ob_end_clean ();
    $template -> replace ( "file_tab" $filelist );
    ...
    MfG opio12
     
  18. 14. November 2007
    AW: Template Engine (beta) PHP5!

    Ich denke du hast meine Texte nicht richtig erfasst. Shortags, ob mit "=" oder ohne, sind und bleiben immer noch unerwünschte shorttags, deren Möglichkeit nur noch aus Gründen der Kompatibilität (ist ein solcher Shorttag-Manko drin, werden sich aber noch weitere Inkompatibilitäten finden lassen) eingeschaltet werden kann.

    Auch hier habe ich den Eindruck dass du mich nciht korrekt verstanden hast. Trennung von Design u. Code ist nicht die Trennung von Design und Logik, von der ich nämlich sprach.

    Und ob das nun sinnvoll ist, kann sich jeder selbst überlegen.
     
  19. 14. November 2007
    AW: Template Engine (beta) PHP5!

    Über Templates gibt man weiterhin das aus, was im PHP-Code verarbeitet wird.
    Aufgrund dieser Tatsache ist eine echte Trennung zwischen Design und Logik nicht gegeben.
     
  20. 14. November 2007
    AW: Template Engine (beta) PHP5!

    ...doch hab ich, mir gehts ums Prinzip ob jetzt einer <?= oder gleich <? print $var?> ist doch egal, aber ja du hast schon recht die "=" methode wird wohl ned überall laufen(und daher sollte man die "print" methode verwenden), aber wie schon des öfteren gesagt, es geht mir hier um die prinzipielle ausgabe von daten im template ohne template engines!

    ...definiere logik?? Auf der einen seite schmeißt du die "if" aus dem template raus, auf der anderen verwendest du aber schleifen...das ist für mich einfach zu widersprüchlich(meine meinung!!).

    ...mir gefällt diese methode ganz gut, aber ich lass mich gerne eines besseren belehren!
     
  21. 14. November 2007
    AW: Template Engine (beta) PHP5!

    Anscheinend hast du es immernoch nicht verstanden. <? ist auch ein Shorttag! <?php ist das normale Tag, wie man es verwenden sollte.
     
  22. 14. November 2007
    AW: Template Engine (beta) PHP5!

    aha, ok das hab ich wohl überlesen...ob <?=, <?, oder <?php ist doch egal, ich will doch auf was ganz anderes hinaus!
     
  23. 14. November 2007
    AW: Template Engine (beta) PHP5!

    ich denke das könnt ihr über PM klären, denn das hat langsam absolut nichts mehr mit dem thema zu tun
    alles weitere in diesem thread zum thema standard-einhaltung wird als spam gewertet
     
  24. 14. November 2007
    AW: Template Engine (beta) PHP5!

    Da ich mir nach dem Shorttag-Beispiel denken kann, auf welchem Niveau wir uns bewegen, kontere ich diese oberflächliche Betrachtungsweise von der Ausgabe mit einem Templatesystem gegenüber dem Einbetten von Layoutangaben in der Logik erst gar nicht.

    Also wenn ich - "Hey ich kann auch einfach '<?=' schreiben, wozu muss ich 'PHP-Ersatzzeichen' benutzen?" - denken würde, würde ich auch ganz anders argumentieren . Zumal diese Antwort nun nicht mehr mit dem Thema zusammen passt, dass ich das Beispiel oben, um gegen Murdoc in Stellung zu gehen, auseinander nahm.

    Dass was ich im Kopf habe ist Logik und wie ich aussehe ist ein anderes Thema ... Noch tiefer komme ich mit dem Niveau nicht, dass du es für wiedersprüchlich hältst, wenn ich z.B. 5-option Felder brauche und diese in einer Schleife generiere ist nun bei mir angekommen, danke!


    Diese Frage zu klären ist z.B. eine Aufgabe deiner persönlichen Logik. (...und nicht meiner, von wegen Belehrung...) Was ist schlecht daran wenn man in jeder Iteration für eine minderwertige Aufgabe ein Objekt instanziert?

    Um nochmal zum Threma zu kommen, ich finde Murdocs Template - Engine _relativ_ gut, weil man z.B. noch weiter refaktorieren kann und ich Ersatzzeichen nicht mag, da diese Performance nehmen.
     
  25. 14. November 2007
    AW: Template Engine (beta) PHP5!

    *neue Diskussion anzettel*
    print sollte man nicht verwenden, echo ist wesentlich schneller

    Ne mal zum Thema hier, ihr driftet hier ein bisschen ab.
    Finde die Engine eigentlich ganz okay. Was mich stört ist das lästige $tpl->assign('name', 'wert'); da finde ich gibt es einige Komfortablere Methoden. $tpl->varname = $foo fände ich z.B. besser.

    Auch das mit dem Schleifen gefällt mir noch nicht 100%tig. Da man auch im Template manchmal noch PHP-Funktionen braucht, z.B. um nen Datum zu formatieren, irgendwelche Helper-Funktionen zu nutzen usw. sollte man sich entweder für ganz PHP oder garnicht im Template entscheiden.

    D.h. alles was man gebrauchen könnte als Template Funktinen umsetzten (kann man auch gleich Smarty nehmen) oder generell <?php ?> zulassen und hauptsächlich zu verwenden.

    Aber wie gesagt - Geschmackssache
     
  26. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.