/me will auch ne templateklasse

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

  • /me will auch ne templateklasse

    Servus,

    aus gegebenem Anlass sitz ich auch grad an einer Templateklasse.
    Das Ersetzen von Variablen läuft und erste Tests sagen, dass ich schon mal schneller als Smarty bin, aber ich bin ja auch noch nicht fertig...

    Da das ganze erstmal als Eigenentwicklung firmenintern laufen soll, ist die Syntax eher an SAP angelehnt, da die Mitarbeiter damit vertraut sind (oder es zumindest sein sollten)

    Code:
    {title}
    {title modify with uppercase_first}
    {title modify with lowercase hexentity}
    {mail cachable modify with hexentity}
    {loop at array_1 into array_tpl name=firstloop cachable}
      {loop at array_2 into array_tpl name=secondloop}
        <span style="color:{alternate black red lime};">
          {array_tpl.firstloop.name} {array_tpl.secondloop.prename}
          <br />
        </span>
      {endloop}
    {endloop}
    Das ist für den PHPler als solchen zwar eine gewöhnungsbedürftige Syntax, aber es ist ja für PHP-Unbedarfte.

    Es klappt auch soweit alles (bis auf das Verschachteln der Schleifen, das kommt noch), aber...

    Das Schlüsselwort cachable sorgt dafür, dass bestimmte Einträge gecacht werden (Templates werden bei Änderung oder "auf Knopfdruck" kompiliert), bei einzelnen Variablen funktioniert das wunderbar, beim Cachen von Schleifen fehlt mir noch der Ansatz; vor allem in Hinblick auf eine eventuelle Verschachtelung, bei der das Attribut cachable, sofern gesetzt, "vererbt" werden soll.

    Hat jemand spontan eine Idee, wie ich das, was mir eine bzw. mehrere Schleifen liefern würden, möglichst elegant in das kompilierte Template bekomme?
    Ich will nicht zu interpretierenden PHP-Code im Template haben, sondern das Ergebnis des Codes.
    Ich denke, also bin ich. - Einige sind trotzdem...

  • #2
    hmm, ich glaube so wird das nichts. was soll denn zb passieren
    wenn du zwei verschachtelte loops mit chachable setzt?
    vielleicht solltest du eher einen eigenen block dafür erstellen
    der einen kompletten bereich cacht.

    für den technischen aspekt müsste ich halt wissen ob du die
    template syntax wirklich smarty like in php umwandelst oder
    ob du direkt die ausgabe erzeugst.
    im falle nummer eins müsstest du halt das cachable flag auslesen
    und prüfen ob der teil schon gecacht ist. wenn ja setzt du diesen
    ein, andernfalls wird der teil neu ausgewertet und gecacht.

    deine template syntax finde ich viel zu strange, ich würde sie
    eher wie xml oder html gestalten, damit sind wohl die meisten
    vertraut. naja gehört nicht zur fragestellung...

    Kommentar


    • #3
      Original geschrieben von .oOo.elias.oOo.
      hmm, ich glaube so wird das nichts. was soll denn zb passieren
      wenn du zwei verschachtelte loops mit chachable setzt?
      vielleicht solltest du eher einen eigenen block dafür erstellen
      der einen kompletten bereich cacht.
      Code:
      {mail cachable modify with hexentity}
      
      {cache}{mail modify with hexentity}{endcache}
      bewirkt exakt das gleiche, bei (verschachtelten) schleifen verhält es sich genauso (besser: soll es sich genauso verhalten)

      für den technischen aspekt müsste ich halt wissen ob du die
      template syntax wirklich smarty like in php umwandelst oder
      ob du direkt die ausgabe erzeugst.
      da kommen fertige php-dateien raus fertig mit ausnahme der nicht gecachten teile, die aber direkt von php ausgeführt werden)

      deine template syntax finde ich viel zu strange
      ein ABAP-entwickler, der außer ABAP und vll. HTML nix kann, nicht *g*
      Ich denke, also bin ich. - Einige sind trotzdem...

      Kommentar


      • #4
        Zwischenstand:
        Code:
        <h1>{title cachable modify with escape_all}</h1>
        <p>{text modify with escape_all nl2br}</p>
        <p>Dateiname: {_server.PHP_SELF}</p>
        <ul>
        {alternate silent font using red black}
        {loop at persons into person}
        <li style="background:{alternate bg using #aaa white};color:{alternate font};">
          Die {person.loopposition}. Person von {person.loopcount} hei&szlig;t: 
          {person.prename modify with escape_all} {person.family_name modify with escape_all}</li>
        {endloop}
        </ul>
        {cache}
        <hr /><p>Gecached:</p>
        <ul>
        {loop at persons into person}
        <li>
          Die {person.loopposition}. Person von {person.loopcount} hei&szlig;t: 
          {person.prename modify with escape_all} {person.family_name modify with escape_all}</li>
        {endloop}
        </ul>
        {endcache}
        <hr />
        <p>Template Kompilierungsdatum: {date cachable modify with dateformat:"d.m.y H:i:s"}<br />
        Jetzt {date modify with dateformat:"d.m.y H:i:s"}</p>
        So sieht ein Beispieltemplate aus, die Modifikatoren sollten selbsterklärend sein, die Schleifen an und für sich auch (meine SAP-Entwicklerversuchskaninnchen hier haben sich über die Syntax gefreut)

        cachable sorgt dafür, dass der Wert einer Templatevariable ins kompilierte Template geschrieben wird und direkt beim Kompilieren ausgewertet wird und danach nicht mehr (siehe die letzten beiden Zeilen im Template)

        {cache}...{endcache} bewirkt exakt das gleiche, nur ist es möglich, Abschnitte zu kapseln, wie z. B. die zweite Schleife

        alternate sollte auch klar sein, für die, die nichts damit anzufangen wissen, ist auf http://www.howtodo.de/showcase/ext die Ausgabe des Templates zu sehen.


        Was noch reinkommt ist ein if, z. B. bei
        Code:
        {if person.loopfirst}
          Das ist die erste Person
        {elseif person.looplast}
          Das ist die letzte Person
        {endif}
        und dann bin ich erstmal fertig.

        Fällt jemanden noch was ein, was rein muss außer Ersetzen von Variablen, Schleifen, Bedingungen und Cachen von Abschnitten?
        EDIT:
        Kompiliert wurde das Template in ca. 27ms
        EDIT:
        Ja, die Zeiten müssen noch besser werden, ich weiß
        Zuletzt geändert von mrhappiness; 22.11.2004, 11:44.
        Ich denke, also bin ich. - Einige sind trotzdem...

        Kommentar


        • #5
          hmm, wenn ich "{date modify with dateformat:"d.m.y H:i:s"}" einhacke müsste nur um ein Datum ausgespuckt zu bekommen, würdest Du Deine Template Klasse zum Frühstück essen Gehts noch etwas komplizierter?
          h.a.n.d.
          Schmalle

          http://impressed.by
          http://blog.schmalenberger.it



          Wichtige Anmerkung: Ich habe keine Probleme mit Alkohol ...
          ... nur ohne :-)

          Kommentar


          • #6
            wie soll die klasse denn erkennen, dass es sich um ein datum handelt?
            wie machst du das?

            im skript steht irgendwo
            PHP-Code:
            $tpl->assign('date'time()); 
            wenn ich statt dessen
            PHP-Code:
            $tpl->assign('bibabutzemann'time()); 
            schreibe, muss ich auch
            Code:
            {bibabutzemann modify with dateformat:"d.m.Y H:i:s"}
            schreiben
            Ich denke, also bin ich. - Einige sind trotzdem...

            Kommentar


            • #7
              Warum "wie würde ich das machen"? Dafür gibt es doch Titus
              Da würde der Aufruf so aussehen:
              Code:
              {date([zeitpunkt],[format])}
              Wobei zeitpunkt und Format natürlich vordefiniert sind, und ggf. überschrieben werden können. Sprich gibst Du nix an, kommt d.m.Y (HEUTE) raus. Was Du als Zeitpunkt übergibst ist natürlich auch banane
              Zuletzt geändert von schmalle; 22.11.2004, 12:04.
              h.a.n.d.
              Schmalle

              http://impressed.by
              http://blog.schmalenberger.it



              Wichtige Anmerkung: Ich habe keine Probleme mit Alkohol ...
              ... nur ohne :-)

              Kommentar


              • #8
                da nehm ich doch lieber
                Code:
                {_now}
                , das geht nämlich auch
                hab das im beispiel aber nicht gemacht, da alle spezialvariablen (die mit unterstrich am anfang) noch nicht gecached werden, bin auch noch unschlüssig, ob ich das noch reinnehme oder nicht

                einen funktionsaufruf (im endeffekt läufts ja dadrauf hinaus) ins template zu packen halte ich nicht für sinnvoll, das ist mit absicht eine "sprechende" syntax, angeleht an die ABAP-syntax und wenn ich da mit c-like syntax ankomme, springen die liebevoll im dreieck und mir an die kehle
                Code:
                {_now shortdate}
                {_now longdate}
                was dann intern in d.M.y bzw d.m.Y H:i:s umgesetzt wird, würde ich mir evtl. noch eingehen lassen, aber viel mehr verstehen die nicht *g*
                Ich denke, also bin ich. - Einige sind trotzdem...

                Kommentar


                • #9
                  Hier mal ein kurzer Zwischenstand dessen, was momentan geht und wie die Syntax aussieht (für die, die's interessiert)

                  Die Templates werden kompiliert, danach wird das kompilierte genutzt.
                  Kompiliert wird bei Änderung des Templates oder wenn der Parameter force_compile auf true gesetzt wird.

                  Ich hoffe mal, ich habe nichts vergessen.
                  Die Syntax erscheint etwas abstrus, aber
                  1. Küssen mir die "ABAPler" bald die Füße *g* und
                  2. sieht der generierte PHP-Code auch nicht anders aus als jeder andere PHP-Code



                  Ausgeben von Variablen
                  • Code:
                    {author}
                    Gibt den Wert der Templatevariablen »author« aus.
                  • Code:
                    {author escape}
                    Gibt den Wert der Templatevariablen »author« aus und ersetzt Sonderzeichen durch die entsprechenden Entitäten.
                  • Code:
                    {a_long_text wordwrap escape nl2br}
                    Gibt den Wert der Templatevariablen »a_long_text« aus.
                    Einzelne Wörter, die länger als 100 Zeichen sind, werden umgebrochen, Sonderzeichen werden durch die entsprechenden Entitäten ersetzt und \n wird durch <br /> ersetzt. Das passiert in eben dieser Reihenfolge.
                    Der Modifier wordwrap kann analog zu dateformat und anderen (Beispiel unten) parametrisiert werden hinsichtlich max. Zeichenzahl und Trennzeichen



                  Besondere Variablen

                  Sie fangen mit einem Unterstrich _ an und erlauben den Zugriff auf die superglobalen Arrays, die aktuelle Uhrzeit als Unix-Timestamp und definierte Konstanten
                  Code:
                  {_get.action}
                  {_server.PHP_SELF}
                  {_now} Sekunden seit 1.1.1970
                  {_const.__FILE__}
                  Cachen
                  • {cache}
                    Alles hier drin wird beim Kompilieren des Templates ausgewertet und als Text in das kompilierte Template geschrieben.
                    {endache}
                    Beispiel:
                    Code:
                    {cache}
                    Kompiliert am {_now dateformat:"d.m.Y"}
                    auf {_server.http_HOST escape}
                    um {_now dateformat:"H:i:s"}
                    {endcache}
                  • cachable
                    Bezieht sich im Gegensatz zu {cache}...{endcache} nicht auf einen wie auch immer gearteten Block, sondern auf genau eine Templatevariable.
                    Beispiel:
                    Code:
                    Kompiliert am {_now cachable dateformat:"d.m.Y"}



                  Subtemplates

                  {include datei}
                  Bindet das angebene Template »datei« ein.
                  Entweder fest:
                  Code:
                  {include datei.tpl}
                  Oder dynamisch mit Templatevariablen:
                  Code:
                  {include %template_var%.tpl}
                  Pfadangeben werden relativ zum Templateverzeichnis erwartet


                  Bedingungen

                  Code:
                  {if bedingung_1}
                  ...
                  {elseif bedingung_2}
                  ...
                  {elseif bedingung_n}
                  ...
                  {else}
                  ...
                  {endif}
                  Die Bedingungen folgen den gleichen Regeln wie in PHP, eine Verknüpfung mit »and« und »or« ist zulässig aber nicht erforderlich, genauso wie das Setzen von Klammern.


                  Schleifen / Blöcke

                  Code:
                  {loop at das_array into der_wert [color=green]step=2[/color] [color=blue]output first[/color]}
                  Der {der_wert.loopposition}. hat den Wert: {der_wert }
                  {if der_wert.loopfirst}Es ist der erste Eintrag
                  {elseif derwert.looplast}Es ist der letzte Eintrag
                  {endif}
                  Der Schlüssel ist: {derwert.loopkey}
                  {elseloop}
                  Keine Elemente gefunden
                  {endloop}
                  Es wird über alle Einträge der Templatevariablen »das_array« iteriert, der aktuelle Eintrag ist über »der_wert« verfügbar.
                  Neben loopposition, loopfirst, looplast und loopkey existieren noch loopcount und loopindex.

                  [color=green]step=2[/color] gibt die Schrittweite an, also jeder wievielte Eintrag ausgegeben werden soll (optional)

                  [color=blue]output first[/color] sorgt dafür, dass bspw. nicht die Einträge 2, 4, 6, 8, 10 ausgebeben werden, sondern die Einträge 1, 3, 5, 7, 9 (optional, hat nur eine Auswirkung, wenn step > 1)


                  Farbwechsel und ähnliches
                  • Code:
                    {alternate farben [color=green]silent[/color] red blue royalblue}
                    Im späteren Verlauf können z. B. Absätze mit
                    Code:
                    <p style="color:{alternate farbe};">Text</p>
                    in den Farben rot, blau und weiß ausgegeben werden.

                    Das optionale silent sorgt dafür, dass der aktuelle Wert nicht ausgegeben wird.
                    Code:
                    {alternate farben silent red blue royalblue}
                    {loop at werte into wert}
                    <p style="color:{alternate farbe};">{wert nl2br}</p>
                    {endloop}
                    und
                    Code:
                    {loop at werte into wert}
                    <p style="color:{ {alternate farben red blue royalblue}};">{wert nl2br}</p>
                    {endloop}
                    hätten den selben Effekt.
                  • Code:
                    {alternate farben [color=green]silent[/color] %colors%}
                    Iteriert über die Einträge in der Templatevariablen »colors«, die nach Möglichkeit ein Array sein sollte *g*




                  Formulare
                  • Code:
                    {create options using werte 
                    [color=green]for my_select[/color] [color=blue]allow multiselect[/color] 
                    [color=orange]with keys schluessel[/color]  [color=royalblue]size=3[/color] [color=red]selected=_post.my_select[/color]}
                    Erstellt eine Selectbox namens »my_select[]« (die [] kommen automatisch, da allow multiselect spezifiziert wurde, stehen sie schon im namen werden sie aber nicht nochmal angefügt)
                    Die Selectbox erlaubt die Auswahl mehrerer Einträge und stellt drei Einträge gleichzeitig dar.
                    Die angezeigten Werte kommen aus der Variablen »werte« die Werte für die value-Attribute der option-Tags aus der Variablen »schluessel«.
                    Die in $_POST['my_select'] enthaltenen einträge sind automatisch vorselektiert (Array oder Skalar)


                    Alle farbigen Teile sind optional, die Angabe einer Größe und das Erlauben einer Mehrfachauswahl machen allerdings nur dann Sinn, wenn auch ein Name angegeben wurde.
                    Fehlt die explizite Angabe von Werten für die value-Attribute der option-Tags, werden die Schlüssel des Arrays »Werte« benutzt.
                  • Code:
                    {create radios using werte for my_radio
                    [color=blue]allow multiselect[/color] [color=orange]with keys schluessel[/color]  
                    [color=royalblue]size=3[/color] [color=red]selected=_post.my_radio[/color]}
                    Erstellt Radiobuttons namens »my_radio«
                    allow multiselect wird ignoriert, genauso wie die Angabe einer Größe
                    Die angezeigten Werte kommen aus der Variablen »werte« die Werte für die value-Attribute der option-Tags aus der Variablen »schluessel«.
                    Die in $_POST['my_radio'] enthaltenen einträge sind automatisch vorselektiert (Array oder Skalar)


                    Alle farbigen Teile sind optional
                    Fehlt die explizite Angabe von Werten für die value-Attribute der option-Tags, werden die Schlüssel des Arrays »Werte« benutzt.
                  • Code:
                    {create checkboxes using werte for my_check 
                    [color=blue]allow multiselect[/color] [color=orange]with keys schluessel[/color]  
                    [color=royalblue]size=3[/color] [color=red]selected=_post.my_check[/color]}
                    Erstellt Checkboxen namens »my_check[]« (die [] kommen automatisch, da allow multiselect spezifiziert wurde, stehen sie schon im Namen werden sie aber nicht nochmal angefügt)
                    Die angezeigten Werte kommen aus der Variablen »werte« die Werte für die value-Attribute der option-Tags aus der Variablen »schluessel«.
                    Die in $_POST['my_check'] enthaltenen einträge sind automatisch vorselektiert (Array oder Skalar)


                    Alle farbigen Teile sind optional, die Angabe einer Größe und das Erlauben einer Mehrfachauswahl machen allerdings nur dann Sinn, wenn auch ein Name angegeben wurde.
                    Fehlt die explizite Angabe von Werten für die value-Attribute der option-Tags, werden die Schlüssel des Arrays »Werte« benutzt
                  Ich denke, also bin ich. - Einige sind trotzdem...

                  Kommentar


                  • #10
                    Was ich mich aber Frage, wie findet eine Kommunikation zwischen PHP Code und HTML-Code statt, dass PHP diese Boxen, Selects etc. verarbeitet?

                    Angenommen ich sage meinem Designer, er soll seine textarea, message nennen. Also name="message". Es aber jetzt aus irgendwelchen Gründen nicht tat, sei's ein Schreibfehler oder ähnliches, dann "denk" mein PHP-Code ja, dass dieser User entweder nichts eingeben hat, oder es gar keine Textarea gegeben hat. Und was nun? Gibt hier auch elegante Lösungswege, oder müssen neben den Schlüsselwörtern, auch diese Namen solchen Eingaberfelder strikt vom Programmierer eingehalten werden, da es keinen anderen Weg gibt?

                    Es kommt nicht darauf an, mit dem Kopf durch den Monitor zu rennen,
                    sondern mit den Augen das Manual zu lesen.

                    Kommentar


                    • #11
                      das ist richtig, aber das hat keinerlei auswirkung auf so sachen wie
                      Code:
                      <textarea name="message">{_post.message}</textarea>
                      da im kompilierten template dann einfach
                      PHP-Code:
                      <textarea name="message"><?php echo isset($_POST['message']) ? ($_POST['message'] : '';?></textarea>
                      steht und das ja ausgeführt wird

                      Dass in Ablauf- und Anwendungslogik die gleichen Namen verwendet werden sollten wie in der Präsentationslogik (Template) versteht sich von selbst und wenn das nicht passiert, ist es eh zu spät.

                      Oder hab ich deine Frage falsch verstanden?
                      Ich denke, also bin ich. - Einige sind trotzdem...

                      Kommentar


                      • #12
                        Oder hab ich deine Frage falsch verstanden?
                        Ja. Könnte aber auch meine Schuld sein! ;D
                        Ich meine, was ist wenn mein Designer jetzt statt:

                        Code:
                        <textarea name="message">{_post.message}</textarea>
                        das:

                        Code:
                        <textarea name="forum_antwort">{_post.message}</textarea>
                        eingibt. In der verarbeiteten PHP-Datei verwende ich ja z.B.

                        PHP-Code:
                        if ( isset($_POST['message']) ) { $x true;} else { $x=false;} 
                        Hier hätte er gar keine Freiheit, oder? Weil ich entweder sagen muss:
                        "Bitte nenne die Textarea name="message" oder name={$message_name}"

                        Ihm hier eine Freiheit zu geben, ist schlichtweg unmöglich, oder?

                        Es kommt nicht darauf an, mit dem Kopf durch den Monitor zu rennen,
                        sondern mit den Augen das Manual zu lesen.

                        Kommentar


                        • #13
                          Original geschrieben von xManUx
                          Ihm hier eine Freiheit zu geben, ist schlichtweg unmöglich, oder?
                          Richtig, das geht nicht, aber man sollte einem Designer zutrauen können, das Wort "message" zweimal fehlerfrei abschreiben zu können

                          Ich wüsste aber auch keine Templateklasse, die diese Möglichkeit bietet.
                          Irgendwo muss ich die Zuordnung ja machen
                          Ich denke, also bin ich. - Einige sind trotzdem...

                          Kommentar


                          • #14
                            Ich wüsste aber auch keine Templateklasse, die diese Möglichkeit bietet.
                            Irgendwo muss ich die Zuordnung ja machen
                            Ja, was bedeutet, dass hier präzise Kommunikation zwischen Coder/Designer erforderlich ist Allerdings bin ich aber auch der Meinung, dass ein Designer nichts zu Designen brauch, wenn er nicht mal das simpelste vom simplesten kann Dazu gehören - wie ich finde - auch kleine Anweisungen sowie Anwendungen, von kleinen miniloops, die man ja vormachen kann in der TPL... Soviel Grundverständis, sollte man eigentlich schon besitzen?

                            Es kommt nicht darauf an, mit dem Kopf durch den Monitor zu rennen,
                            sondern mit den Augen das Manual zu lesen.

                            Kommentar


                            • #15
                              Original geschrieben von xManUx
                              Dazu gehören - wie ich finde - auch kleine Anweisungen sowie Anwendungen, von kleinen miniloops, die man ja vormachen kann in der TPL... Soviel Grundverständis, sollte man eigentlich schon besitzen?
                              Da bin ich voll und ganz deiner Meinung.
                              Undmit meiner tollen Syntax wird's ja gleich viel einfacher *g* (wenn man sie prinzipiell schon kennt auf jeden Fall)

                              Hab' grad beschlossen, dass ich weg von Smarty hin zu meoiner Templateklasse gehe, brauche nur noch 'nen Namen
                              Ich denke, also bin ich. - Einige sind trotzdem...

                              Kommentar

                              Lädt...
                              X