Problem mit Templatesystem + Blöcke

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

  • #16
    Werde jetzt noch mal ein wenig alles überarbeiten.

    Mit folgendem Konzept der abarbeitung:

    1. Template-Files einlesen
    2. Einfache Variablen "assignen" und speichern
    3. Blöcke "assignen" und speichern
    4. Die Daten aus 2. und 3. zusammenführen
    5. Augabe der geparseden Seite

    Würdest du mir da zustimmen oder würdest du anders vorgehen?

    mfg Sodan

    Kommentar


    • #17
      ja das klingt schon mal ganz gut - für die blöcke würd ich mir noch was überlegen - es wäre ja sinnvoll wenn man einen block immer wieder wiederholen kann - d.h. mann braucht z.B. für news nur einen block auf die seite schreiben und kann den dann sooft wiederholen wie nötig - vielleicht könnte man den blöcken ja namen geben und dann im code diesen block dann wiederholen (block_into($blockname,$variablen) oder so) - man muss dann nur diesen block wieder an die richtige stelle im template einsetzen - und nicht einfach nur am ende - was ja bei größeren designs nicht sinnvoll wäre
      Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

      Kommentar


      • #18
        mmmh.
        ich sag dir jetzt mal was mir probleme bereitet.

        ich habe alles geparsed und bin jetzt wieder an dem punkt wo es zu den blöcken geht.

        das heißt, ich habe eine variable names $this->content in der schon die statischen sachen ersetzt sind.

        nun lese ich den teil aus der ein block ist.

        bei einer news sieht das so aus:

        Autor: {Author}
        Text: {Text}

        er erkennt diesen block aus anstandslos.
        nun muss dieser block eben mit daten besetzt werden und eingefügt werden.

        ich dachte es mir so, dass man quasi den fertigen block in array schreibt und dann immer wieder mit array_push einen neuen dran hängt.
        am ende hat man dann eine variable, z.b. blöcke, in der dann schon der komplett geparsede code steht.

        nun würde ich den einfach an die stelle im tpl file einfügen wo er wieder so einen block finden

        Autor: {Author}
        Text: {Text}

        aber irgendwie ..........
        ich poste dir mal was ich für einen code habe, vllt. schaffst du es ja, denn fehler zu finden.

        er macht alles.
        doch er ersetzt im block

        Autor: {Author}
        Text: {Text}

        immer nur {Text}

        hier der code:

        1. news.php
        PHP-Code:
        include('template.class.php');
        include(
        'config.inc.php');

        $SQL =  "SELECT news_author, news_text ".
                    
        "FROM news ";

        $DATA mysql_query($SQL);

        $blockcount mysql_num_rows($DATA);

        $block_var = array();

        $tpl = new tpl;
        $tpl->set_tpl_file('news.tpl');

        $vars =     array   (
                            
        'Ueberschrift1' => 'template',
                            
        'Ueberschrift2' => 'engine',
                            );

        while ( 
        $row mysql_fetch_array($DATA) )
        {
            
        $values =   array   (
                                
        'AUTHOR' => $row['news_author'],
                                
        'TEXT' => $row['news_text']
                                );
                                
            
        array_push($block_var,$values);
        }

        $tpl->replace_vars($vars);
        $tpl->replace_block('newsrow',$block_var);
        $tpl->parse(); 
        2. news.tpl
        PHP-Code:
        <html>
        <
        head>
        <
        title>{title}</title>
        </
        head>
        <
        body>
        Überschrift 1: {Ueberschrift1}<br><br>

        {
        block name="newsrow"}<br>
        Autor: {AUTHOR}<br>
        Text: {TEXT}<br>
        {/
        block name="newsrow"}

        <
        br><br>
        Überschrift 2: {Ueberschrift2}<br><br>
        </
        body>
        </
        html
        3. template.class.php
        PHP-Code:
        class tpl
        {
            var 
        $content;
            var 
        $tpl_var;

            function 
        set_tpl_file($file)
            {
                if ( empty(
        $file) || !file_exists($file) )
                {
                    echo 
        "Cant find template-file"$file ."<br>";
                }
                else
                {
                    
        $this->content file_get_contents($file);
                }
                
                return 
        $this->content;
            }
            
            function 
        replace_vars($vararray)
            {
                if ( empty(
        $vararray) )
                {
                    echo 
        "Cant assign Vars. There are no Vars!";
                }
                else
                {
                    foreach ( 
        $vararray as $keyname => $value )
                    {
                        
        $search "{"$keyname ."}";
                        
        $this->content str_replace($search,$value,$this->content);
                    }
                }
                return 
        $this->content;
            }
            
            function 
        replace_block($blockname,$vararray)
            {
                
        $open "\{block name=\"$blockname\"}";
                
        $close "\{/block name=\"$blockname\"}";

                
        $start_pos strpos($this->content$open);
                
        $close_pos strpos($this->content$close);

                
        $buffer substr($this->content$start_pos strlen($open), $close_pos - ($start_pos strlen($open)));

                
        $compiled "";

                foreach(
        $vararray as $array)
                {
                    foreach (
        $array as $k => $v)
                    {
                           
        $tag '{'.$k.'}';
                        
        $tmp str_replace($tag$v$buffer);
                    }
                    
        $compiled .= $tmp;
                }
                
                
        $this->content str_replace($open$buffer $close$compiled$this->content);
                return 
        $this->content;
            }
            
            function 
        parse()
            {
                echo 
        $this->content;
            }

        ich hoffe du siehst den fehler. er wird sicher in funktion replace_block sein.

        falls du lust hast rumzutesten, habe ich das alles mal in eine zip gepacket.
        Angehängte Dateien

        Kommentar


        • #19
          PHP-Code:
                      foreach ($array as $k => $v)
                      {
                             
          $tag '{'.$k.'}';
                          
          $tmp str_replace($tag$v$buffer);
                      }
                      
          $compiled .= $tmp
          hier liegt der fehler => in $tmp steht logischerweise immer nur das letzte element aus dem array
          Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

          Kommentar


          • #20
            ja ich hatte mir das auch schon gedacht.
            das problem ist nur, würde ich es "richtig" machen

            PHP-Code:
            foreach ($array as $k => $v)
            {
                   
            $tag  '{'.$k.'}';
                   
            $buffer str_replace($tag$v$buffer);
            }

            $compiled .= $buffer
            dann gibt er folgendes aus:

            Überschrift 1: template

            {block name="newsrow"}
            Autor: {AUTHOR}
            Text: {TEXT}
            {/block name="newsrow"}

            Überschrift 2: engine

            ------------

            so wie es jetzt ist, gibt er folgendes aus:

            Überschrift 1: template


            Autor: {AUTHOR}
            Text: Dies ist ein Test

            Autor: {AUTHOR}
            Text: bla

            Autor: {AUTHOR}
            Text: haha

            Autor: {AUTHOR}
            Text: karl ist blöd

            Autor: {AUTHOR}
            Text: ist semipermeabel

            Autor: {AUTHOR}
            Text: ist max sein bester freund


            Überschrift 2: engine

            tjoa. also muss man an dieser schleife irgendwie was ändern.
            habe auch schon ein wenig experimentiert, leider nichts gefunden.

            Kommentar


            • #21
              so ich habs jetzt - folgendes muss geändert werden:
              PHP-Code:
                      foreach($vararray as $array)
                      {
                          
              $tmp $buffer;
                      foreach (
              $array as $k => $v)
                          {
                             
              $tag '{'.$k.'}';
                              
              $tmp str_replace($tag$v$tmp);
                          }
                          
              $compiled .= $tmp;
                      } 
              so geht es bei mir jetzt
              Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

              Kommentar


              • #22
                man könnte jetzt noch ein paar interessante funktionen einbauen z.B.
                • global variablen (auch über blöcke hinaus) - hab grad gemerkt das man die variablen schon über die blöcke hinaus sind - vielleicht kann man das noch ändern und dann globale varible einbauen
                • evt. cache funktion

                fänds gut wenn wir hier noch ein bisschen bauen können - den tread kann ja dann jemand in brainstorming oder so verschieben
                EDIT:
                Noch ein Funktion: template parse sollte denn content nur zurück geben damit man auch ein template file im template file ersetzen kann
                Zuletzt geändert von tontechniker; 25.09.2005, 16:07.
                Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                Kommentar


                • #23
                  DANKE DANKE DANKE DANKE DANKE DANKE DANKE DANKE .....

                  finde ich super nett von dir, dass du so eine geduld mit mir hattest.
                  und bei mir funktioniert das jetzt auch.
                  das ist ein richtig schöner sonntag ^^

                  ich werde das auf jedenfall weiter ausbauen.
                  aber ich mach wie gesagt schritt für schritt. und der erste war eben, dass erstmal in der einfachsten form zum laufen zu bringen.

                  mal sehen, was da noch so rauskommt

                  mfg Sodan

                  Kommentar


                  • #24
                    weiter Entwicllung der klasse

                    Hi, ich habe mir gerade den thread sehr aufmerksam angeschaut. ich habe versucht genau so etwas mit Fasttemplate zu machen

                    siehe thread ;-)

                    bei meiner suche bin ich auch ein projekt namens TemplatePower gestoßen.

                    Für die Entwiclung dieser Klasse ist es glaube ich garnicht verkehrt mal rein zu schauen und wer ne idee zu meinem problem hat denke das es aber genau das selbe ist wie das welches hier beschrieben wurde zu Anfang
                    das ich einfach keine Blöcke ausgebe aber uach nicht weis wie :-(

                    Edit viell. sollt eich die URL des projektes noch mal posten

                    http://templatepower.codocad.com/manual/manual_de.html

                    Kommentar


                    • #25
                      Hallo,

                      ich habe nun mal mit dem template system aus diesem Thred rumgespielt
                      Mein menu bekomme ich nun als block ausgeben. Nun habe ich aber das Problem das der Inhalt nicht mehr angezeigt wird!

                      Example hier: http://www.03et2.de/projekte/test/cms2/

                      und nun mein code:

                      index.php
                      PHP-Code:
                      <?php
                      include('class/template.class.php');

                      include (
                      "class/var.inc.php");



                      /* $blockcount = mysql_num_rows($result); */

                      $block_var = array();

                      $tpl = new tpl;
                      $tpl->set_tpl_file('template/cms.tpl');

                      $vars =     array   (
                                          
                      'title' => 'Test Titel',
                                          );

                      /* menu Anfang */
                      $result mysql_query("SELECT * FROM menu ORDER BY 'sort' ASC");
                       while(
                      $row mysql_fetch_array($result)){

                          
                      $values =   array   (
                                              
                      'mid' => $row["mid"],
                                              
                      'menu' => $row['menu']
                                              );                     
                          
                      array_push($block_var,$values);
                      }
                       
                      /* menu Ende */ 
                       /* Content Submenu Anfang */
                          
                      if (!empty($m)) {
                           if (!empty(
                      $s)) {
                           
                      $result mysql_query("SELECT * FROM submenu WHERE sid='$s'");
                           
                      $row mysql_fetch_array($result);
                              
                      $row[content] = stripslashes($row[content]);
                       
                      $vars1 =     array   (
                                          
                      'content' => '$row["content"]'
                                          
                      );    
                                        }
                       
                      /* Content Submenu Ende */
                       
                        /* Content Anfang */                  
                                      
                      else {
                               
                      $result mysql_query("SELECT * FROM menu WHERE mid='$m'");
                               
                      $row mysql_fetch_array($result);
                                  
                      $row[content] = stripslashes($row[content]);
                       
                      $vars1 =     array   (
                                          
                      'content' => '$row["content"]'
                                          
                      );    
                                        }
                                        }
                      /* Content Ende */

                         /* Content Startseite Anfang */
                              
                      else {
                            
                      $result mysql_query("SELECT * FROM menu WHERE home='1'");
                            
                      $row mysql_fetch_array($result);
                              
                      $row[content] = stripslashes($row[content]);
                       
                      $vars1 =     array   (
                                          
                      'content' => '$row["content"]'
                                          
                      );                
                                   }
                         
                      /* Content Startseite Ende */
                          
                      $tpl->replace_vars($vars);
                      $tpl->replace_vars($vars1);
                      $tpl->replace_block('menu',$block_var);
                      $tpl->parse(); 

                      ?>
                      PHP-Code:
                      <html>
                      <
                      head>
                      <
                      title>{title}</title>
                      <
                      meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
                      </
                      head>

                      <
                      body bgcolor="#FFFFFF" text="#000000">
                      <
                      table width="100%" border="1" cellpadding="0" cellspacing="1" bordercolor="#990000">
                        <
                      tr
                          <
                      td colspan="2"><p>&nbsp;</p>
                            <
                      p>Hier iNhalt bla! <br>
                              <
                      br>
                            </
                      p></td>
                        </
                      tr>
                        <
                      tr
                          <
                      td width="150" valign="top"><table width="150" border="2" cellpadding="0" cellspacing="0">
                            {
                      block name="menu"}
                            <
                      tr>
                              <
                      td><a href="index.php?m={mid}&s=0">{menu}</a></td>
                            </
                      tr>
                            {/
                      block name="menu"}
                          </
                      table>
                         
                      </
                      td>
                          <
                      td valign="top" class="text">{content}
                          </
                      td>
                        </
                      tr>
                      </
                      table>
                      </
                      body>
                      </
                      html
                      Hoffe mir kann wer weiter helfen

                      PS: Habe auch einen thread wegen genau umgekehrten porblem laufen denke fast template ist einfach veraltet und dieses hier scheint mir für meine zwecke genau richtig zu sein!

                      Kommentar


                      • #26
                        ich habe dein code mal überflogen:

                        1.

                        warum wendenst du 2 mal die funktion replace_vars an?
                        Einfach alles in ein Array und dann einmal ausführen.
                        Habe das mal alles gemacht und denke, dass das so funktionieren würde.
                        Am besten ist, du schaust dir alles um die definition von $vars1 an.
                        mit der funktion array_push fügst du immer die neuen variablen an das array $vars an.

                        PHP-Code:
                        /* $blockcount = mysql_num_rows($result); */

                        $block_var = array();

                        $tpl =  new tpl;
                        $tpl -> set_tpl_file('template/cms.tpl');

                        $vars = array   (
                                        
                        'title' => 'Test Titel'
                                        
                        );

                        /* menu Anfang */

                        $result mysql_query("SELECT * FROM menu ORDER BY 'sort' ASC");

                        while( 
                        $row mysql_fetch_array($result) )
                        {

                            
                        $values =   array   (
                                                
                        'mid' => $row["mid"],
                                                
                        'menu' => $row['menu']
                                                );
                                                
                            
                        array_push($block_var,$values);
                        }

                        /* menu Ende */

                        /* Content Submenu Anfang */

                        if (!empty($m))
                        {
                            if (!empty(
                        $s))
                            {
                                
                        $result mysql_query("SELECT * FROM submenu WHERE sid='$s'");
                                
                        $row mysql_fetch_array($result);
                                
                        $row[content] = stripslashes($row[content]);
                                
                                
                        $vars1 = array  (
                                                
                        'content' => $row[content]
                                                );
                                                
                                
                        array_push($vars$vars1);
                            }
                            
                            
                        /* Content Submenu Ende */

                            /* Content Anfang */

                            
                        else
                            {
                                
                        $result mysql_query("SELECT * FROM menu WHERE mid='$m'");
                                
                        $row mysql_fetch_array($result);
                                
                        $row[content] = stripslashes($row[content]);
                                
                                
                        $vars1 = array  (
                                                
                        'content' => $row[content]
                                                );
                                                
                                
                        array_push($vars$vars1);
                            }
                        }

                        /* Content Ende */

                        /* Content Startseite Anfang */

                        else
                        {
                            
                        $result mysql_query("SELECT * FROM menu WHERE home='1'");
                            
                        $row mysql_fetch_array($result);
                            
                        $row[content] = stripslashes($row[content]);
                            
                            
                        $vars1 = array  (
                                            
                        'content' => '$row["content"]'
                                            
                        );
                                            
                            
                        array_push($vars$vars1);
                        }

                        /* Content Startseite Ende */

                        $tpl->replace_vars($vars);
                        $tpl->replace_block('menu',$block_var);
                        $tpl->parse(); 

                        Kommentar


                        • #27
                          des weiteren will ich gerne nun neue funktionen hinzufügen.

                          habe schon eingefügt, dass mehrere tpl-files eingelesen werden können.

                          denn mir ist aufgefallen, dass wir jede seite einzeln "rendern".
                          oder was meint ihr?
                          wie sollte man es am besten machen?
                          ich denke, dass es besser ist, wenn man auf der index.php
                          einfach nur folgendes macht:

                          $tpl = new tpl;
                          $tpl -> set_tpl_files('xyz.tpl','abc.tpl','123.tpl');


                          jetzt die ganzen sachen einlesen bla. alle content-daten herausfinden ....

                          dann am ende nur noch

                          $tpl -> parse;

                          auf jeder seite dann eben noch

                          $tpl -> replace_vars();
                          $tpl -> replace_blocks();

                          ich hoffe ihr versteht jetzt was ich meine ^^

                          mfg Sodan
                          Zuletzt geändert von Sodan; 27.09.2005, 21:02.

                          Kommentar


                          • #28
                            HI Sodan,

                            habe das versucht wie du es geschrieben hast geht keider nicht.
                            Wenn ich aber die 2 variable auch ersaetze geht es zum teil.

                            die startseite wird angezeigt! aber sobald ich auf einen menupunkt klicke wird dieser nicht weiter angezeigt!

                            vielleicht hast du ja noch ne idee!

                            Kommentar


                            • #29
                              Hallo,

                              wollte mal fragenw ie weit dein Template system nun ist.

                              Vielleicht hast du ja nun erneuerunmgen für uns.

                              Und mein Problem hat sich leider immer noch nicht gelegt

                              Kommentar

                              Lädt...
                              X