Template Klasse - Rekursiv Pattern

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

  • Template Klasse - Rekursiv Pattern

    Hallo zusammen,

    Ich habe vor, mir für ein Projekt eine Template Klasse zu schreiben.
    Ich brauche kaum extra Funktionen, im Grunde hat mir eval() immer für Templates gereicht.

    Von eval() will ich jetzt aber mal weg, zumal viele sagen, "eval ist evil".
    Die Klasse muss folgende Funktionen enthalten:

    - Variablen bzw. strings ersetzen.
    (- Eine Schleifenfunktion -- Ist nicht unbedingt nötig)
    - Template ausgeben

    Außerdem sollte sie mit Templates aus verschiedenen Verzeichnissen klarkommen.

    Das wars schon soweit.
    An sich kein Problem, ich poste hier allerdings, weil die Klasse möglichst schnell und unkompliziert funktionieren soll.

    Der Punkt des Ersetzen von Strings ist mir ein Dorn im Auge, zumal sich das Problem ja scheinbar nur mit str_replace lösen lässt. Ich habe mir überlegt, ob es da vielleicht noch bessere Möglichkeiten gibt, zumal die Funktion sicher nicht die schnellste sein dürfte.

    Wie ist es denn mit einer Verwaltung der Templates per Datenbank, also einer Art cache Funktion?
    Wie könnte ich das Problem lösen, eine möglichst schnelle und einfache Template Klasse zu basteln?

    Es wär nett, wenn ihr ein paar Denkanstöße geben könntet.

    Mfg Oli

  • #2
    hmm,

    um str_replace wirst du wohl nicht drumherum kommen.

    eine schleifenfunktion sollte meiner meinung nach auf jeden fall rein, bzw. das parsen von ganzen blöcken ... dafür wirst du wohl preg_replace nehmen müssen.

    zum thema cache: du speicherst das erstellte tpl im filesystem, und aktualisierst es nur, wenn es nötig ist. speicherst einfach noch eine datei, wo drin steht, ob das tpl neu aufzubauen ist ... (was dümmeres ist mir zumindest zu diesem thema nicht eingefallen)
    Zuletzt geändert von derHund; 10.10.2004, 19:51.
    Die Zeit hat ihre Kinder längst gefressen

    Kommentar


    • #3
      (- Eine Schleifenfunktion -- Ist nicht unbedingt nötig)
      schwates! und wie die nötig ist. das ist mit das effektivste einer tpl-class. sollte sogar verschachtelungen zulassen.

      Kommentar


      • #4
        guckst du hier

        viel spaß damit.
        ach ja: API ist wie die von smarty.

        irgendwo fliegt noch ne php5 portierung rum. müsste ich suchen wenn bedarf ist.
        Zuletzt geändert von rythms; 11.10.2004, 00:14.

        Kommentar


        • #5
          Hm, danke erstmal für die Antworten.

          @TobiaZ: Eine Schleifenfunktion habe ich an sich nie gebraucht, ich hab die Schleifen immer im Script durchlaufen lassen und einfach das Template erweitert... Da sind Verschachtelungen natürlich auch möglich gewesen.
          Das Problem ist eben bei einer schleifenfunktion, dass man z.B. mit den Strings die aus einer Datenbank kommen nichts mehr anstellen kann.

          @rythms: Die Klasse sieht ganz ok aus, aber ich würd gern was eigenes machen. Was genau verstehst du denn unter dem Ersetzen einer Methode? (Methoden hab ich bisher nur in Bezug auf Klassen gehört...)

          @derHund: "Das Parsen von Blöcken"? Wie meinst du das? (Mit Blöcken meinst du kommentierte Blöcke im HTML oder?)

          Ich bin noch recht neu auf dem Gebiet, verzeiht mir die Fragen.

          MfG Oli

          Kommentar


          • #6
            ich hab die Schleifen immer im Script durchlaufen lassen und einfach das Template erweitert.
            Dass ist unsinnig. Templates dienen dazu den HTML-Code von Programmcode zu trennen, und was machst du, du schmeißt es noch zudammen. Aber das ist noch nicht genug. Du verteils den HTML-Code zusätzlich auf mehrere Dateien, so dass man den absoluten Wirrwar hat.

            Das Problem ist eben bei einer schleifenfunktion, dass man z.B. mit den Strings die aus einer Datenbank kommen nichts mehr anstellen kann.
            Das kann ich nicht nachvollziehen.

            @derHund: "Das Parsen von Blöcken"? Wie meinst du das? (Mit Blöcken meinst du kommentierte Blöcke im HTML oder?)
            Wohl eher die Schleifenfunktion!

            Kommentar


            • #7
              Hm, ich sagte doch ich bin recht neu auf dem Gebiet...

              Also ich hatte Schleifenbits immer in extra Dateien, das stimmt. War auch sehr unübersichtlich.

              Das Problem ist eben bei einer schleifenfunktion, dass man z.B. mit den Strings die aus einer Datenbank kommen nichts mehr anstellen kann.
              Ich meine sowas:

              PHP-Code:
              for($i=0;$i<count($arr);$i++) {
                 
              $arr[$i] = trim($arr[$i]);

              Hier kann ich den String oder was auch immer noch mit trim() bearbeiten, wenn ich das array gleich an die klasse weitergebe, hab ich die Möglichkeit nicht, es sei denn ich lasse es vorher im script machen. Das läuft darauf hinaus, dass ich nachher 2 Schleifen habe, einmal die, die alle Elemente mit trim() bearbeitet, im Script und einmal die in der Template Klasse, die das array schließlich mit dem Template verarbeitet.

              Kommentar


              • #8
                , wenn ich das array gleich an die klasse weitergebe, hab ich die Möglichkeit nicht, es sei denn ich lasse es vorher im script machen.
                Wo willst du es denn sonst machen, wenn nicht im Script??? Bei ordentlichen Programmen ist es meist so, dass du ohnehin erst deine strings bearbeiten musst, und es nicht 1:1 auf der seite ausgeben kannst. Alleine schon bei sachen wie specialchars, etc.

                Das läuft darauf hinaus, dass ich nachher 2 Schleifen habe, einmal die, die alle Elemente mit trim() bearbeitet, im Script und einmal die in der Template Klasse, die das array schließlich mit dem Template verarbeitet.
                Ja und??? dafür ist die Klasse schließlich dar. Sehe dein Problem also nicht.

                Kommentar


                • #9
                  2 schleifen dauern länger als eine.

                  Aber ok, dann nehm ich das mal so hin.

                  Kann mir nochmal jemand erklären, was genau derHund mit seinen Blöcken meint?

                  Kommentar


                  • #10
                    Ein Block ist das Stückchen im Template, welche durch die Schleifenfunktion immer wieder wiederholt wird. Das was du in extra Dateien hast.
                    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
                      hmm,

                      mit blöcken meine ich bereiche im script, die entweder mehrmals oder bedingungs-abhängig geparst werden ... z.b.
                      Code:
                        <tbody>
                        {{BEGIN:SENTENCES}}
                        <tr class="{{CLASS}}">
                          <td>{{SENTENCE}}</td>
                          <td>{{COUNT}}</td>
                        </tr>
                        {{END:SENTENCES}}
                        </tbody>
                      das feature ist elementar, ich wüßte nicht, wie du sonst sich wiederholende sachen parsen willst ...

                      der block wird 'ausgewählt', und dann in einer schleife mehrmals geparsed, durchlaufen, ... um dann z.b.
                      Code:
                        <tbody>
                        <tr class="odd">
                          <td>puzzle generator</td>
                          <td>3</td>
                        </tr>
                        <tr class="even">
                          <td>flash "puzzle generator" -crossword</td>
                          <td>1</td>
                        </tr>
                        <tr class="odd">
                          <td>noothertemplate</td>
                          <td>1</td>
                        </tr>
                        </tbody>
                      zu erhalten ... weißt?

                      ein feature, was die class auf jeden fall enthalten sollte.
                      Die Zeit hat ihre Kinder längst gefressen

                      Kommentar


                      • #12
                        das feature ist elementar, ich wüßte nicht, wie du sonst sich wiederholende sachen parsen willst ...
                        Hat er doch gesagt, er knallt das alles hart in denPHP-Code rein.

                        Weil das ja viiiel schneller ist, als eine schleife bem zusammenstellen des Templates

                        Kommentar


                        • #13
                          Original geschrieben von TobiaZ
                          Hat er doch gesagt, er knallt das alles hart in denPHP-Code rein.

                          Weil das ja viiiel schneller ist, als eine schleife bem zusammenstellen des Templates
                          Jaja, macht euch nur lustig...
                          Ich mach mich mal an die Klasse.

                          /Edit:

                          So, ich hab auf ganzer Linie versagt.
                          Meine bisherige Klasse:

                          PHP-Code:
                          <?php
                          /*
                              * Template Class 
                          */

                          class template {

                              var 
                          $open// Starttag der Platzhalter
                              
                          var $close// Endtag der Platzhalter
                              
                          var $values// Werte der zu ersetzenden Strings
                              
                          var $tplF// Template Verzeichnis
                              
                          var $fileType// Endung der Templates (.tpl, .htm o.ä.)

                              // Definieren von Variablen
                              
                          function template($open='{'$close='}'$fileType='.tpl'$tplF='./') {
                                  
                          $this->open $open;
                                  
                          $this->close $close;
                                  
                          $this->values = array();
                                  
                          $this->fileType $fileType;
                              }

                              
                          // Den Platzhaltern Werte zuweisen
                              // Wenn isFile = true, wird versucht eine Datei als Wert einzubinden
                              
                          function assign($var$value$isFile=false$tplFolder=$this->tplF) {
                                  if(
                          $isFile == true) {
                                      if(!
                          is_readable($tplFolder.$value.$this->fileType)) {
                                          
                          // ERROR
                                      
                          } else {
                                          
                          $this->values[$var] = file_get_contents($tplFolder.$value.$this->fileType);
                                      }
                                  } else {
                                      
                          $this->values[$var] = $value;
                                  }
                              }
                              
                              
                          // Ausgabe der Templates
                              
                          function output($tpl) {
                                  if(!
                          is_readable($this->tplF.$tpl.$this->fileType)) {
                                      
                          // ERROR
                                  
                          } else {
                                      
                          $content file_get_contents($this->tplF.$tpl.$this->fileType);
                                      echo 
                          $this->parse($content);
                                  }
                              }
                              
                              
                          // Parsen
                              
                          function parse($string) {
                                  
                              }
                          }
                          ?>
                          Die Frage ist jetzt, wie ich die parse Funktion gestalte. Klar ist mir folgendes:
                          Ich muss das Template nach {Platzhaltern} durchsuchen. Außerdem können Schleifen ( {loop}{/loop} ) vorkommen.
                          Ich kann mir aber irgendwie nicht vorstellen, wie das mit den Schleifen laufen soll.
                          Mal angenommen, ich hab im auszuführenden Script ne SQL query, verarbeite das ganze und hab folgendes array:
                          Code:
                          Array
                          (
                              [1] => Array
                                  (
                                      [name] => Peter
                                      [nachname] => Mueller
                                      [Wohnort] => Berlin
                                  )
                          
                              [2] => Array
                                  (
                                      [name] => Klaus
                                      [nachname] => Raus
                                      [Wohnort] => Hamburg
                                  )
                          
                              [3] => Array
                                  (
                                      [name] => Hans
                                      [nachname] => imGlueck
                                      [Wohnort] => Hoelle
                                  )
                          
                          )
                          Ich hab irgendwie gar keine Vorstellung, was ich jetzt im Script und im Template tun muss, damit er mir alle drei Datensätze anzeigt, zumal ich beim Erstellen des Templates ja keine Ahnung habe, wie viele Datensätze aus der Tabelle geholt wurden.

                          Kann mir das vielleicht jemand an einem Beispiel erklären? Den anderen Template Klassen kann ich das nicht entnehmen, wie die mit Schleifen umgehen.

                          MfG Oli
                          Zuletzt geändert von OliOli; 12.10.2004, 16:45.

                          Kommentar


                          • #14
                            Nach weiteren Stunden probieren hab ichs immer noch nicht so richtig hinbekommen.

                            Klar ist mir jetzt, dass ich zum Parsen einmal mit nem normalen preg_replace die Platzhalter ersetzen muss, und mit preg_replace_callback Schleifen bearbeiten muss. Der Inhalt der Schleifen wird dann an eine Funktion übergeben, die diesen dann eben mehrmals zurückgibt.
                            Schleierhaft ist mir nur, wie ich das mit dem Script nachher in Verbindung bringen soll. Woher weiß diese Funktion zum Beispiel, wie oft die Schleife durchgeführt werden soll?
                            An verschachtelte Arrays mag ich gar nicht erst denken, geschweige denn an verschachtelte Blöcke.

                            Wär nett wenn ihr mir weiterhelfen würdet,

                            MfG Oli

                            Kommentar


                            • #15
                              Ich verstehe nicht, warum du nicht meine Klasse benutzen willst wenn du fast identisch das gleiche baust?

                              Kommentar

                              Lädt...
                              X