Templates Blöcke die optimale Technik?

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

  • Templates Blöcke die optimale Technik?

    Hey,

    ich bastle manchmal an meinem eigenen Template und da tut sich eine Frage auf wo mir schlicht und ergreifend die Erfahrung fehlt oder aber die Idee. Umsetzen ist wohl das geringste Problem.....

    Nunja zurzeit hole ich mir den kompletten Templateinhalt und beginne dann mit der Ersetzung. Im Endeffekt kommt dann bei einem Block folgendes raus

    PHP-Code:
    <? If ($Blubb) {?>
    irgendwas HTML
    < ? } ?>
    Dabei übergebe ich:
    PHP-Code:
    $template->assign_block_vars('Blubb',array('wuff'=>'test','bla'=>'sdfsdf'
                                
    )    ); 
    Blubb ist dabei der Block den ich als Variable dann einfach auf true setze und im folgenden wird dann die Bedingung zutreffen und den Block anzeigen.....

    Gut nur gibt es manchmal Fälle in denen ein Block durch eine externe Schleife mehrmals auftauchen soll und ich habe nun den Block auf true gesetzt welcher dann angezeigt wird. Daher habe ich keine Template Variablen mehr....

    Das ganze wird zwar temporär vorbehalten bis zum eigentlichen Parsevorgang. Aber ich kann diesen Block nur einmal parsen weil er nur einmal vorhanden ist.

    Ich müsste den Block also replizieren und ersetzen

    Und genau hier hab ich keine Idee ich glaube mein Weg ist falsch. Meine interne Template For Schleife geht ja aber wenn von ausserhalb ein Block mehrmals auftauchen soll dann kann es nicht gehen weil ich den Block einmal ersetzen kann und dann ist Schluss......

    Ich hoffe ihr könnt meine Beschreibung nachvollziehen:
    kurz:
    - Template wird als Text komplett eingeladen
    - Wird ein Block übergeben wird dieser ermittelt und mit den Blockinhalten ausgetauscht
    - Wird der Block nochmals übergeben wird es auch temporär vorbehalten
    - eigentlicher Parsevorgang ersetzt dann die Arrays wenn der erste Block ersetzt wurde existiert der Block nicht mehr....Beim erneuten Blockparsen existieren diue Blockvariablen nicht mehr daher ein Leerlauf........

    Es wäre schon wenn ihr mir eine Idee geben könntet weil ich seh den Wald vor den Bäumen nicht mehr liegt vielleicht am Glühwein

    Gruß Pod
    [color=blue]MfG Payne_of_Death[/color]

    [color=red]Manual(s):[/color] <-| PHP | MySQL | SELFHTML |->
    [color=red]Merke:[/color]
    [color=blue]Du brauchst das Rad nicht neu erfinden ! [/color]<-ForumSuche rettet Leben-> || <-Schau in den Codeschnippsels->

    Murphy`s Importanst LAWS
    Jede Lösung bringt nur neue Probleme
    Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht.
    In jedem kleinen Problem steckt ein großes, das gern raus moechte.

  • #2
    warum taucht php-code in den Templates auf?

    Templates sind dazu da, Design vom Code zu trennen, also hat php-code da
    nichts zu suchen.

    Das was ich so kenne (und meine eigene auch) arbeiten ausschließlich mit loops, variablen und includes

    {loop schleife}
    blablabla {variable} blablabla
    {/loop schleife}
    {include anderestemplate}


    ein loop ist dabei gleichzeitig ein if -> nur einmal ausfüllen

    sieht dann bei mir so aus
    Code:
    <div class=kartei>Emailverkehr</div>
    <table class=border>
    	<tr>
    		<td style="padding: 10px;">
    			<table style="width:100%;">{loop noemail}
    				<tr>
    					<td>keiner</td>
    				</tr>{/loop noemail}{loop email}
    				<tr>
    					<th>angefordert</th>
    					<th>gedruckt</th>
    					<th>Type</th>
    				</tr>{loop emaildetail}
    				<tr>
    					<td>{anfdat_d}</td>
    					<td>{drudat_d}</td>
    					<td></td>
    				</tr>{/loop emaildetail}{/loop email}
    			</table>
    		</td>
    	</tr>
    </table>
    TBT

    Die zwei wichtigsten Regeln für eine berufliche Karriere:
    1. Verrate niemals alles was du weißt!


    PHP 2 AllPatrizier II Browsergame

    Kommentar


    • #3
      Original geschrieben von TBT
      warum taucht php-code in den Templates auf?
      Ganz einfach weil das ein kompiliertes Template darstellt und wie es im Endeffekt nach dem Parsing aussieht daher die Schilderung.....

      Mein Problem ist schlicht und ergreifend das ich keinen Block mehrmals ausgeben kann weil ich in nachdem ersten mal bereits die Template Vars ersetzt habe.....

      Das ist mein einziges Problem

      @TBT du bist der Template King und ich kann dir schlicht und ergreifend nicht folgen
      [color=blue]MfG Payne_of_Death[/color]

      [color=red]Manual(s):[/color] <-| PHP | MySQL | SELFHTML |->
      [color=red]Merke:[/color]
      [color=blue]Du brauchst das Rad nicht neu erfinden ! [/color]<-ForumSuche rettet Leben-> || <-Schau in den Codeschnippsels->

      Murphy`s Importanst LAWS
      Jede Lösung bringt nur neue Probleme
      Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht.
      In jedem kleinen Problem steckt ein großes, das gern raus moechte.

      Kommentar


      • #4
        wieso kann ein designer nicht ein bisschen PHP lernen ?

        isses nicht leichter, dass bisschen PHP zu kennen, dass man braucht, um ne if abfrage zu machen, als so ein wirrwar von z.B. smarty zu lernen ?

        wenn ein 13 jähriger junge PHP lernen kann, dann kann man doch von einem ausgewachsenen designer das selbe erwarten

        also ich würde jedem designer das grundlegende, was er braucht, in 2 h beibringen, dazu nen merkzettel und fertig

        templatesysteme sind imho in der heutigen form sowas von hirnissig 0_o

        sobald logik in das system eingefügt wird, is der vorteil, alles in reinen wysiwyg editoren zu bearbeiten, ja schon wieder weg...



        An mich bitte keine unaufgeforderten E-Mails senden (ausser ihr seid bereit geld zu zahlen, dann gerne )

        Kommentar


        • #5
          @PoD: wenn das dein kompiliertes Tempate ist, wirst du wahrscheinlich mit eval arbeiten.
          Das kann schnell ins Auge gehen, und außerdem ist eval sehr langsam. Ein ersetzen
          der variablen per preg_replace ist viel schneller.
          TBT

          Die zwei wichtigsten Regeln für eine berufliche Karriere:
          1. Verrate niemals alles was du weißt!


          PHP 2 AllPatrizier II Browsergame

          Kommentar


          • #6
            kompilierte templates müssen nicht unbedingt mit eval arbeiten

            meine templateklasse geht ein template bei der ersten verwendung (/oder bei einer änderung) durch, pickt sich die tags raus und bastelt eine php.datei, die dann bei jeder verwendung per include eingebunden wird

            aus
            Code:
            allo, du bist der {visitor}. Besucher.
            
            Das Template wurde am {_now cachable dateformat:"d.m.Y u\m H:i:s"} zuletzt geändert.
            
            Heute ist der {_now dateformat:"d.m.Y"}.
            
            {if _server.HTTP_HOST = "localhost"}
            Ich denke, ich bin auf deinem lokal installierten Webserver.
            {else}
            Juhu, ich bin im großen weiten Internet.
            {endif}
            wird dann
            PHP-Code:
            Hallo, du bist der <?php
            echo $this->_data['visitor'];
            ?>. Besucher

            Das Template wurde am 23.12.2004 um 10:04:03 zuletzt geändert.

            Heute ist der <?php  echo ext_dateformat_modify(time(), array (
              
            => '"d.m.Y"',
            ));  
            if (
            $_SERVER['HTTP_HOST'] == "localhost"):  
            ?>Ich denke, ich bin auf deinem lokal installierten Webserver.<?php
            else: ?>Juhu, ich bin im großen weiten Internet.<?php
            endif;
            ?>
            das sollte schneller sein, als bei jedem aufruf einer seite mit preg_replace zu arbeiten.
            Genauso sind Schleifen möglich und das Einbinden von Subtemplates möglich und mir persönlich gefällt meine Templateklasse und ich vermisse momentan auch nichts bei ihr.

            Kannst dich ja mal damit auseinandersetzen wenn du willst
            Ich denke, also bin ich. - Einige sind trotzdem...

            Kommentar


            • #7
              @TBT: Ja ich arbeite mit eval(); wenn ich direkt nach den Ersetzungen die Strings in einen PHP Code umgewandelt habe läuft das durch.....

              Ansonsten wenn ich die Caching Funktion enable wird der ersetzte String als eine File abgelegt und danach eingebunden so wie das Happy auch schon geschrieben hat.....Die Mehrsprachigkeit binde ich via eines includes einer Language File mit unzählen $lang[] ein die aus dem jeweiligen Spachpfad geholt wird....Language Variablen beginnen bei mir mit dem Prefix {lang_}

              Bisher hab ich nur die Möglichkeit gesehen einen Block in eine Bedingung umzuformen und dann einen Zustand zu setzen ob ja oder nein

              Das ist mein Kernproblem wie ich auch einem Block dann 3 Blöcke ausgebe wenn ich nur einmal einen parsen kann.......

              Bin nämlich so schlau wie vorher

              Mein Problem ist ich kann manchmal nicht "einfach" denken....

              Daher wäre es schön wenn ich mal mit TBT oder Happy im ICQ ein wenig Erfahrung sammeln könnte wäre nett......
              [color=blue]MfG Payne_of_Death[/color]

              [color=red]Manual(s):[/color] <-| PHP | MySQL | SELFHTML |->
              [color=red]Merke:[/color]
              [color=blue]Du brauchst das Rad nicht neu erfinden ! [/color]<-ForumSuche rettet Leben-> || <-Schau in den Codeschnippsels->

              Murphy`s Importanst LAWS
              Jede Lösung bringt nur neue Probleme
              Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht.
              In jedem kleinen Problem steckt ein großes, das gern raus moechte.

              Kommentar


              • #8
                Nachdem ich mal vollkommen erholt wieder rumgedoktert habe.....

                Stellt sich mir die Frage:

                a) Wie parst ihr verschachtelte Blöcke?
                Block holen schauen ob noch einer drinnen ist -> Rekursion?

                b) Ob es Variablen geben kann die nicht in Blöcken sind?
                Ignoriert ihr dabei alle Blöcke und parst nur den restlichen Text?
                Oder unterscheidet ihr Template Blockvars von ausstehenden Vars mit:

                {Blocka.name} und {name} ?

                Wenn ich alle {name} ersetze könnte das nämlich innerhalb eines Blocks vorkommen. Was dem Block geschlossende Einheitprinzip wiederspricht

                Oder ersetzt ihr erst die Blöcke und dann die ausserhalb stehenden Vars.....
                Dann müsste es kein Problem ergeben wenn ich zuerst {name} im Block ersetze und dann ausserhalb.......

                Sprachvars die unterschiedlich sind handle ich so das ich im Template anhand eines Parameters aus dem jeweiligen Pfad eine language File include und dann vars die mit lang_ beginnen durch den Gegenpart ersetze.
                ......

                Ist das verbesserungsfähig

                Soweit zum Brainsorming und dem unvollständigen Template.....

                Würde mich über Anregungen freuen.....
                [color=blue]MfG Payne_of_Death[/color]

                [color=red]Manual(s):[/color] <-| PHP | MySQL | SELFHTML |->
                [color=red]Merke:[/color]
                [color=blue]Du brauchst das Rad nicht neu erfinden ! [/color]<-ForumSuche rettet Leben-> || <-Schau in den Codeschnippsels->

                Murphy`s Importanst LAWS
                Jede Lösung bringt nur neue Probleme
                Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht.
                In jedem kleinen Problem steckt ein großes, das gern raus moechte.

                Kommentar


                • #9
                  Ich gehe Das Template Tag für Tag durch und bastel meinen PHP-Code zusammen.

                  Dabei werden Tags wie else, elseif oder endif dahingehen geprüft, ob sie dort, wo sie stehen, stehen dürfen.
                  Wenn ja: gut
                  Wenn nein: Fehlermeldung mit Angabe des Tags, der Zeile und des Templates

                  Wenn ich das komplette Template durch habe, und alle Tags geschlossen sind: gut
                  Wenn nicht: Fehlermeldung mit Angabe des Tags, der Zeile und des Templates

                  Mit dieser Vorgehensweise ist es mir schnurzpiepegal, wie tief was verschachtelt ist.

                  Beispiel:
                  Code:
                  {if a}
                  {elseif b}
                  	{loop at c into d}
                  		{d}
                  		{else}
                  	{endloop}
                  {endif}
                  ist falsch verschachtelt, daher bekomme ich die meldung
                  Code:
                  unexpected {else} - missing {if} or {elseif} - found {loop} instead
                  line: 5 - index.tpl
                  Ich denke, also bin ich. - Einige sind trotzdem...

                  Kommentar


                  • #10
                    Original geschrieben von Payne_of_Death
                    Nachdem ich mal vollkommen erholt wieder rumgedoktert habe.....

                    Stellt sich mir die Frage:

                    a) Wie parst ihr verschachtelte Blöcke?
                    Block holen schauen ob noch einer drinnen ist -> Rekursion?
                    rekursives preg_match pattern


                    b) Ob es Variablen geben kann die nicht in Blöcken sind?
                    Ignoriert ihr dabei alle Blöcke und parst nur den restlichen Text?
                    Oder unterscheidet ihr Template Blockvars von ausstehenden Vars mit:

                    {Blocka.name} und {name} ?

                    Wenn ich alle {name} ersetze könnte das nämlich innerhalb eines Blocks vorkommen. Was dem Block geschlossende Einheitprinzip wiederspricht
                    die Blöcke werden von innen nach außen und oben nach unten ersetzt,
                    so wie ein Baum ... du fängst oben an, und verfolgst jeden Ast rekursiv und beginnst da jeweils an seiner Spitze

                    Oder ersetzt ihr erst die Blöcke und dann die ausserhalb stehenden Vars.....
                    Dann müsste es kein Problem ergeben wenn ich zuerst {name} im Block ersetze und dann ausserhalb.......
                    durch die Rekursion muß die Variable nicht innerhalb eines Blockes gesetzt werden, sondern kann auch in den Blöcken darüber definiert sein. Nicht gesetzte Variablen werden nicht! ersetzt

                    Sprachvars die unterschiedlich sind handle ich so das ich im Template anhand eines Parameters aus dem jeweiligen Pfad eine language File include und dann vars die mit lang_ beginnen durch den Gegenpart ersetze.
                    ......
                    bei mir {lang.variablenname}

                    Ist das verbesserungsfähig

                    Soweit zum Brainsorming und dem unvollständigen Template.....

                    Würde mich über Anregungen freuen.....
                    TBT

                    Die zwei wichtigsten Regeln für eine berufliche Karriere:
                    1. Verrate niemals alles was du weißt!


                    PHP 2 AllPatrizier II Browsergame

                    Kommentar


                    • #11
                      @tbt
                      du hast ja wahrscheinlich nicht für alles ein einzelnes preg_match_all, sondern eines in der art {tag}(.*){/\\1} oder so ähnlich?

                      Hast du dann kein else oder was passiert bei dir bei
                      Code:
                      {if bedingung}
                        {schleife}
                          {else}
                        {/schleife}
                      {/if}
                      Bei meinen Tests mit rekursion wird das {else} einfach verschluckt und wenn ich hintendran {/else} schreibe wird es gefunden, aber es ist trotzdem falsch an der stelle, deswegen mache ich das stück für stück und gebe bei einem tag an, auf welche tags er folgen darf (in der jeweiligen funktion, nicht im template)

                      Meine Ergebninse mit preg_match dafür (ohne Korrektur) wären
                      Code:
                      if
                        schleife
                      
                      bzw:
                      
                      if
                        schleife
                          else
                      Wie prüfst du nach, ob Blöcke geschlossen sind?
                      OffTopic:
                      danke für die mail, bin bei meinen messungen etwas besser als smarty, auch beim kompilieren
                      die kompilierten templates bekomme ich wohl nicht mehr schneller, aber beim kompilieren wird denke ich, noch potential sein
                      Zuletzt geändert von mrhappiness; 06.01.2005, 09:18.
                      Ich denke, also bin ich. - Einige sind trotzdem...

                      Kommentar


                      • #12
                        es gibt kein else bei mir,
                        das Template kennt nur "loops" und "variablen".

                        If/Else Konstrukte werden bei mir durch den Programmcode gefüttert,
                        da das Template zum Anzeigen ist, und keinerlei Programmlogik enthalten sollte.

                        das geht dann so
                        PHP-Code:
                        $this->tpl->add$blabla?'block':'alternativer_block' ) ); 
                        TBT

                        Die zwei wichtigsten Regeln für eine berufliche Karriere:
                        1. Verrate niemals alles was du weißt!


                        PHP 2 AllPatrizier II Browsergame

                        Kommentar


                        • #13
                          PHP-Code:
                          $this->tpl->add'searchresults',
                            
                          count($searchresults) > 0  
                            
                          $searchresults 
                            
                          'Keine Ergebnisse gefunden'); 
                          so?

                          Und wenn du den angezeigten Text ändern willst, musst du das Skript ändern?
                          Code:
                          {loop at searchresults into treffer}
                          {elseloop}
                          Keine Ergebnisse gefunden
                          {endloop}
                          finde ich besser und soviel Programmlogik ist es ja nicht, oder?

                          Dadurch, dass ich beim Kompilieren von {elseloop} eine Fehlermeldung ausgebe, wenn der Tag davor nicht {loop} ist, kann ich auch nichts falsch verschachteln

                          Die Templates enthalten bei mir keine Anwendungslogik (Ermittlung von Daten, ...) und keine Ablauflogik im Sinne von "Was für ein Template soll hier eingebunden werden?" aber sie enthalten Anzeigelogik (so nenn ich's jetzt mal), bieten also die Möglichkeit, im Template festzulegen, was passieren soll, wenn eine Schleife nicht ausgeführt wird, weil kein Element enthalten ist.
                          Brauche ich diese Alternativausgabe ("Keine Ergebnisse gefunden") nicht mehr, muss ich nur das Template ändern, nämlich {elseloop} rausnehmen. Das erscheint mir besser als aus
                          PHP-Code:
                          $this->tpl->add'searchresults',
                            
                          count($searchresults) > 0  
                            
                          $searchresults 
                            
                          'Keine Ergebnisse gefunden'); 
                          das hier machen zu müssen, weil's einfach weniger fehleranfällig ist
                          PHP-Code:
                          $this->tpl->add'searchresults',  $searchresults); 
                          Ich denke, also bin ich. - Einige sind trotzdem...

                          Kommentar


                          • #14
                            es gibt keinerlei Texte im Programmcode,
                            die gibt es auschließlich im Template. Für jede Alternative gibt es dort einen Block
                            TBT

                            Die zwei wichtigsten Regeln für eine berufliche Karriere:
                            1. Verrate niemals alles was du weißt!


                            PHP 2 AllPatrizier II Browsergame

                            Kommentar


                            • #15
                              Das heißt, du hast im Template zwei Blöcke
                              Code:
                              {loop searchresults}
                              {/loop}
                              {loop nosearchresults}
                              {/loop}
                              und es wird immer nur genau einer der beiden ausgeführt?

                              Dann hättest du if-else ja im Skript, wo du einen der beiden Blöcke zuweist und im Template, da du die beiden im Skript möglichen Blöcke dort aufführen musst.

                              Wie würdest du eigentlich Blättern einbauen?
                              Code:
                              {loop searchresults}
                                Einträge anzeigen
                                {loop more_than_1_page}
                                  {loop navback}<a href="Link zur Seite vorher">Zurück</a>{/loop}
                                  {loop nonavback}Sie sind schon auf Seite 1{/loop}
                                  {loop navnext}<a href="Link zur nächsten Seite">Vor</a>{/loop}
                                  {loop nonavnext}Sie sind schon auf der letzten Seite{/loop}
                                {/loop}
                              {/loop}
                              {loop nosearchresults}
                              {/loop}
                              Dann führe doch wenigstens ifs ein und benenne {if} und {/if} dann intern in {loop} und {/loop} um.
                              Ist doch nur eine einmalige Sache, aber erleichtert das Lesen finde ich
                              Ich denke, also bin ich. - Einige sind trotzdem...

                              Kommentar

                              Lädt...
                              X