[Hilfe] Templates Parser

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

  • [Hilfe] Templates Parser

    Hallo,

    ich bräuchte mal eure Hilfe. Und zwar geht es darum: Ich möchte mir einen Templates Parser
    Programmieren der in der Lage ist Funktionen direkt in der Template aufzurufen.

    Zum Beispiel so:
    Code:
    <function>include("test.txt")</function>
    Mein Problem ist jetzt das ich nicht weis wie ich den Inhalt
    von test.txt als Rückgabe von der Funktion erhalte?

    Ich habe es mir so gedacht, ich hole mir mit einem regulären Ausdruck
    den teil der zwischen <function> und </function> steht und übergebe ihn
    an die Funktion parse_function und ersetze das ganze dann mit der Rückgabe
    der Funktion.

    Hier mal mein bescheidenen versuch das ganze umzusetzen

    PHP-Code:
    function parse_function($function) {
        eval(
    "$function;");

    Wäre echt Cool wenn mir hier einer Helfen kann.
    [COLOR=#9C5245]Internet-Explorer[/COLOR] [COLOR=#334D7B]User und stolz drauf! :P[/COLOR]

  • #2
    Tja,wenn ich sowas könnte,würde ich nicht Smarty einsetzten...
    Guck einfach mal bei Smarty rein:
    http://smarty.php.net/
    Zuletzt geändert von V 9 1 9 V; 05.02.2003, 21:18.

    Kommentar


    • #3
      Absurd ... wirklich absurd ... es wird Zeit da jemand mal anfängt ein Template-System in "Smarty" zu entwickeln ...
      carpe noctem

      [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
      [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

      Kommentar


      • #4
        Original geschrieben von goth
        Absurd ... wirklich absurd ... es wird Zeit da jemand mal anfängt ein Template-System in "Smarty" zu entwickeln ...
        Ähm...Wieso verstehe ich den Satz nicht?

        Kommentar


        • #5
          bitte nicht spammen das ist echt wichtig
          [COLOR=#9C5245]Internet-Explorer[/COLOR] [COLOR=#334D7B]User und stolz drauf! :P[/COLOR]

          Kommentar


          • #6
            @V 9 1 9 V: Die Frage ist ja nicht erst gemeint ... oder?
            carpe noctem

            [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
            [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

            Kommentar


            • #7
              Original geschrieben von goth
              @V 9 1 9 V: Die Frage ist ja nicht erst gemeint ... oder?
              Hmm...Wenn du meintest "es wird Zeit das jemand" anstatt "es wird Zeit da jemand" meintest,dann verstehe ich das auch

              Ich meinte nicht das er ein Template-System in Smarty entwickeln soll (wäre irgendwie absurd... ),sondern das er sich das mal angucken soll...

              Kommentar


              • #8
                so absurd ist das garnicht, hab selber mal so einen Parser geschrieben.
                Der war dann zum Ende in der Lage solche Templates (und kompliziertere) zu parsen
                Code:
                [if doc_status='0']offen[endif]
                [if doc_status='1']eingereicht[endif]
                [if doc_status='2']in Begutachtung[endif]
                [if doc_status='3']akzeptiert[endif]
                [if doc_status='4']abgelehnt[endif]
                [if doc_status='5']in Revision[endif]</td></tr>
                          <tr><td colspan=2 align=center class=textdunkel>
                [if $status!'1']
                  [if doc_status!'0']
                    [if doc_status!'5']
                            <br>Bitte hier klicken, zum
                              <a href="veran.php?action=docdet&id=[text doc_id]&akz=1" class=linkdunkeldick>akzeptieren</a>
                              &nbsp;/ <a href="veran.php?action=docdet&id=[text doc_id]&akz=2" class=linkdunkeldick>ablehnen</a>
                              oder <a href="veran.php?action=docdet&id=[text doc_id]&akz=3" class=linkdunkeldick>in Revision geben</a>
                              des Dokumentes.<br>Der Status des Dokumentes geht beim zuweisen eines Gutachters automatisch in "in Begutachtung" über.<br><br></td>
                    [endif]
                  [endif]
                [endif]
                [if $status='1']
                  <form method=post action="veran.php?action=docdet">
                  <input type=hidden name="akz" value="[text akz]">
                  <input type=hidden name="id" value="[text doc_id]">
                  Sind Sie sicher, den Status des Dokumentes von <b>
                [if doc_status='0']offen[endif]
                [if doc_status='1']eingereicht[endif]
                [if doc_status='2']in Begutachtung[endif]
                [if doc_status='3']akzeptiert[endif]
                [if doc_status='4']abgelehnt[endif]
                [if doc_status='5']in Revision[endif]
                </b> auf <b>
                [if $akz='1']akzeptiert[endif]
                [if $akz='2']abgelehnt[endif]
                [if $akz='3']in Revision[endif]
                </b> ändern zu wollen?<br>
                  <input type=submit name="submit" value="Status ändern" class=textdunkel>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                  <a href="veran.php?action=docdet&id=[text doc_id]" class=textdunkeldick>Abbruch</a>
                  </form>
                [endif]
                </tr>
                [colorset BED0EEADC0DD]
                <tr><td colspan=2 class=textdunkel bgcolor=#[color]>
                [if doc_id=gu_doc_id]
                <b>Legende&nbsp;&nbsp;&nbsp;</b> <img src="images/delete.gif" border=0> Gutachterzuweisung löschen&nbsp;&nbsp;<img src="images/mail.gif" border=0> Mail an den Gutachter<br><br>
                [endif][list]
                [if doc_id=gu_doc_id]
                <table width=100% bgcolor=#[color]>
                <tr><td valign=top class=textdunkeldick width=150>Gutachter</td>
                  <td class=textdunkel width=430>[text user_vorname] [text user_name]</td>
                  <td><a href="mailto:[text user_mail]"><img src="images/mail.gif" border=0></a></tr>
                <tr><td valign=top class=textdunkeldick>Bemerkungen<br>des Gutachters</td>
                  <td valign=top class=textdunkel colspan=2>[text gu_memo]</td></tr>
                <tr><td valign=top class=textdunkeldick>Bewertung</td>
                <td class=textdunkel>
                [if gu_bewertung='0']noch nicht bewertet[endif]
                [if gu_bewertung='1']excellent[endif]
                [if gu_bewertung='2']sehr gut[endif]
                [if gu_bewertung='3']gut[endif]
                [if gu_bewertung='4']akzeptabel[endif]
                [if gu_bewertung='5']schlecht[endif]
                </td>
                <td><a href="veran.php?action=docdet&del=1&id=[text doc_id]&gut=[text gu_id]"><img src="images/delete.gif" border=0></a></tr>
                </table>
                [endif]
                [endlist]
                der dazugehörige PHP Code um das Template zu füllen sah dann so aus
                PHP-Code:
                $t->setsql("SELECT * FROM dokumente
                          left join gutachter on doc_id=gu_doc_id
                          left join user on gu_user_id=user_id
                          where doc_id='
                $id';");
                $t->setfile($TEMPLATE."/".$language."/veran_document_detail.txt");
                $t->execute(); 
                die Klasse hat dann einige Grundlegende Befehle interpretiert wie if,while und text

                nur für den Einsatz bei richtig großen Projekten ist sie zu langsam (war meine 1. Klasse in PHP)

                die execute Methode sah damals so aus:
                PHP-Code:
                function execute($aktInput=0,$aktSql=0)
                  {
                    if(
                $this->readed!=true)                               // read the template if does'nt done
                    
                { if($x=$this->read_file()!=0)
                      { echo 
                "Error: ".$x." - ".$this->show_error($x);
                        die();
                      }
                      
                $this->query[$aktSql]=new Query();
                      
                $this->query[$aktSql]->set_sql($this->sql[$aktSql]);
                      
                $this->query[$aktSql]->execute();
                      
                $this->rownumber[$aktSql]=1;
                    }
                    
                $inputzeile=$aktInput;

                    switch (
                $this->commandlist[$this->commandnumber]):
                    
                  
                ////////////////////////////////////////////////////////////////////////////////
                  // execute - command 'list'  READY only without param!
                  ////////////////////////////////////////////////////////////////////////////////

                    
                case 'list':
                      if(
                $this->get_param($aktSql,3))                     // 2 param - create subsql with condition
                      
                {
                        
                $sql=$this->getsql($this->get_param($aktSql+1,1));
                        
                $pos=strpos($sql,'[');
                        if(
                $pos==0)
                        {
                          echo 
                "[var] not found in sql-query";
                          die();
                        }
                        
                // aktuelle Zeile holen
                        
                $row=$this->query[$aktSql]->get_row($this->rownumber[$aktSql]);
                        
                // Parameter und Condition holen
                        
                $wert=$this->get_param($aktSql,3);
                        
                $condition=$this->get_param($aktSql,2);
                        
                // neue sql bauen
                        
                $sql_neu=substr($sql,0,$pos).$condition.$wert.substr($sql,$pos+6);
                        
                // aktuelle sql speichern und hochzählen
                        
                $aktSql_puffer=$aktSql;
                        
                $aktSql++;
                        
                // Queryobject vorhanden ? sonst anlegen
                        
                if(!is_object($this->query[$aktSql]))
                          
                $this->query[$aktSql]=new Query();
                        
                // sql setzen und ausführen / row auf 1 setzen
                        
                $this->query[$aktSql]->set_sql($sql_neu);
                        
                $this->query[$aktSql]->execute();
                        
                $this->rownumber[$aktSql]=1;
                        
                // list abarbeiten
                        
                for($i=1;$i<=$this->query[$aktSql]->lines;$i++)
                        {
                          
                $this->rownumber[$aktSql]=$i;
                          
                $this->add_command('work');
                          
                $inputzeile=$this->execute($aktInput,$aktSql);
                        }

                        
                // query freigeben
                        //delete $this->query[$aktSql];
                        // zurück zu alter Query
                        
                $aktSql=$aktSql_puffer;

                      }elseif(
                $this->get_param($aktSql,1))                // 1 param - get subsql
                      
                {

                    
                      }else
                      {

                        
                $aktrownumber=$this->rownumber[$aktSql];
                        if(
                $this->query[$aktSql]->lines!=0)
                        {
                          for(
                $i=1;$i<=$this->query[$aktSql]->lines;$i++)
                          {
                            
                $this->rownumber[$aktSql]=$i;
                            
                $this->add_command('work');
                            
                $inputzeile=$this->execute($aktInput,$aktSql);
                          }
                        
                $this->rownumber[$aktSql]=$aktrownumber;
                        }else
                        {

                          
                // nothing to output (sql - empty) find endlist!
                          
                $anzahlendif=1;
                          while(
                $anzahlendif!=0)
                          {
                            
                $inputzeile++;
                            if(
                $this->work[$inputzeile].$this->work[$inputzeile+1]=="[endlist")
                              
                $anzahlendif--;
                            elseif(
                $this->work[$inputzeile].$this->work[$inputzeile+1]=="[list")
                              
                $anzahlendif++;

                            if(
                $inputzeile>=$this->num_work)
                            {
                              echo 
                "Inputzeile: ".$inputzeile."<br>";
                              echo 
                '<br><b><font color=red>[endlist] not found</font></b><br>';
                              die();
                            }
                          }
                          
                $inputzeile+=3;
                        }
                      }
                      
                $this->remove_command();
                      break;
                      
                  
                ////////////////////////////////////////////////////////////////////////////////
                  // execute - command 'text'  READY
                  ////////////////////////////////////////////////////////////////////////////////

                      
                case 'text':
                      if(!
                $this->extra[$this->get_param($aktSql,1)])      // echo from activ sql
                        
                echo $this->get_param($aktSql,1);
                      else                                                
                // echo from extra
                        
                echo $this->extra[$this->get_param($aktSql,1)];
                      
                $this->remove_command();
                      break;
                      
                  
                ////////////////////////////////////////////////////////////////////////////////
                  // execute - command 'while'  TODO
                  ////////////////////////////////////////////////////////////////////////////////

                    
                case 'while':
                      
                //$query=new Query();
                      //$query->set_sql($this->commandparam[$this->commandnumber]);
                      //while
                      
                for($i=1;$i<=3;$i++)
                      {
                        
                $this->add_command('work');
                        
                $inputzeile=$this->execute($aktInput,$aktSql);
                      }
                      break;
                      
                $this->remove_command();
                      break;

                  
                ////////////////////////////////////////////////////////////////////////////////
                  // execute - command 'if'  READY
                  ////////////////////////////////////////////////////////////////////////////////
                      
                    
                case 'if':
                      
                // controlling with activ sql-question and extras
                      
                $condition=false;
                      
                      
                // getting parameter 1
                      
                $param1=$this->get_param($aktSql,1);

                      
                // getting parameter 2
                      
                $param2=$this->get_param($aktSql,3);

                      
                // getting condition and controlling
                      
                switch ($this->get_param($aktSql,2)):
                      case 
                '=':
                        if(
                $param1==$param2)
                          
                $condition=true;
                        break;
                      case 
                '>':
                        if(
                $param1>$param2)
                          
                $condition=true;
                        break;
                      case 
                '<':
                        if(
                $param1<$param2)
                          
                $condition=true;
                        break;
                      case 
                '!':  // !=
                        
                if($param1!=$param2)
                          
                $condition=true;
                        break;
                      default:
                        echo 
                ">Fehler in Zeile: ".$inputzeile."<br>";
                        echo 
                '<br><b><font color=red>unbekannte Bedingung bei [if ...]</font></b><br>';
                        die();
                      endswitch;

                      
                // if condition true output
                      
                if($condition)
                      {
                        
                $this->add_command('work');
                        
                $inputzeile=$this->execute($aktInput,$aktSql);
                      }else
                     
                      
                // .... hier geht's noch weiter 
                TBT

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


                PHP 2 AllPatrizier II Browsergame

                Kommentar


                • #9
                  das hilft mir nicht wirklich weiter
                  [COLOR=#9C5245]Internet-Explorer[/COLOR] [COLOR=#334D7B]User und stolz drauf! :P[/COLOR]

                  Kommentar

                  Lädt...
                  X