Template-System und while

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

  • Template-System und while

    Hallo Forum.

    Ich habe mir mal ein einfaches Template-System aus diversen Code-Schnipseln aus dem Web zusammengebastelt. Das läuft jetzt auch wunderbar. Aber ich habe das Problem, dass ich gewisse Teile in meinem Template mehrfach wiederholen will und andere nur einmal ausgeben.

    Beim "googlen" bin ich auf folgendes gestossen: Teilbereiche aus Template ersetzen

    Leider versteh ich da irgendwie nur Bahnhof und hab keine Ahnung wie ich mein "Template-System" erweitern soll, dass das Ganze klappt. Vllt. ist ja jemand so net und kann mir das Tpl-System erweitern, damit ich sehe wie das ganze geht. Hier mal die Dateien:

    viewtopic.tpl
    PHP-Code:
    <h1>{TOPICTITLE}</h1>
    [<
    a href="{POST_REPLY}">Reply</a>]

    <
    Wiederholen>
    <
    a name="{ID}"></a>
    <
    table align="center" border="1" width="650">
        <
    tr
             <
    td>{USERNAMEwrote on <b>{DATE}</b></td>
             <
    td rowspan="2" align="right" width="20px">{AVATAR}</td>
         </
    tr>
         <
    tr>
             <
    td valign="bottom" height="2"><b>{TITLE}</b></td>
         </
    tr>
         <
    tr>
             <
    td colspan="2">{MESSAGE}</td>
         </
    tr>
         <
    tr>
             <
    td align="right" colspan="2"><a href="viewtopic.php?id={TOPICID}#{ID}"><b>#{ID}</b></a></td>
         
    </tr>
    </
    table>
    <
    br>
    </
    Wiederholen>

    [<
    a href="{POST_REPLY}">Reply</a>]
    <
    p>{COPYRIGHT}</p




    viewtopic.php
    PHP-Code:
    <?php

    $topic 
    $_topicarray["topictitle"];
    $postreply "reply.php?topic=$topicid";

        
    $var_array = array("TOPICTITLE" => $topic,
                            
    "POST_REPLY" => $postreply);
        
      
      
    //Das was wiederholt wird

      
    while($row mysql_fetch_object($result))
        {
        
        if(empty(
    $row->avatar)) { $row->avatar "blank.gif"; };

     
    //Definition der Variablen durch die die Platzhalter
     //ersetzt werden.
     
    $id        $row->id//$_array["id"];
     
    $title        $row->title//$_array["title"];
     
    $message    $row->message//$_array["message"];
     
    $user        = (!empty($row->user))?'<a href="viewprofil.php?id='.$row->userid.'">'
    .$row->name.'</a>':'$row->name';
     
    $userid    $row->userid;
     
    $date        $row->date//$_array["date"];
     
    $avatar    "<img src=\"images/avatars/$row->avatar\">";

     
    //Array mit den Platzhaltern (Keys) und den Inhalten.
     
    $var_array = array("ID" => $id,
                         
    "TITLE" => $title,
                        
    "DATE" => $date,
                        
    "MESSAGE" => $message,
                        
    "USERNAME" => $user,
                        
    "VISIT_USER" => $visituser,
                        
    "AVATAR" => $avatar);

     
    //Initialisierung der Klasse und Parsen des Templates
     
    $tpl = new parser("templates/content.tpl"$var_array);
         
        }
      
      
    //Ende von dem Wiederholenden
     
        
    ?>



    tpl_parser.inc.php
    PHP-Code:
    <?php

     
    Class parser
     
    {
      var 
    $template;
      var 
    $temp_content;

      function 
    parser($template$var_array)
      {
       
    $this->template $template;
       
    $this->temp_content file($this->template);
       
    $parsed $this->rplc($var_array);
       echo(
    implode(""$this->temp_content));
      }

      function 
    rplc($var_array)
      {
       foreach(
    $var_array as $key => $value)
       {
        
    //$regex[var_name] : {VARIABLE}
        
    $regex['var_name'] = "#{[[:space:]]*?(".strtoupper($key)."){1,}?[[:space:]]*?}#si";
        
    $this->temp_content 
        
    preg_replace($regex['var_name'], $value$this->temp_content);
       }
      }
     }
    ?>
    Oder vielleicht könnt ihr mir auch sonst irgendwie weiterhelfen... auf jeden Fall schon mal vielen Dank.
    Zuletzt geändert von pascal007; 07.05.2007, 18:35.

  • #2
    Selber erweitern tun wir nicht. Wir geben nur Tips.

    Wie möchtest du denn die Syntax haben? Soll es bestimmte Loops geben? Oder soll der Text einfach nur wiederholt werden?


    Hast du schon Ansätze?
    Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
    var_dump(), print_r(), debug_backtrace und echo.
    Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
    Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
    Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

    Kommentar


    • #3
      Die Tabelle zwischen <Wiederholen></Wiederholne> soll einfach so oft angezeigt werden wie es Datensätze im mysql-Query gibt. Der Rest soll nur einmal angezeigt werden.

      Einen Ansatz hab ich eben leider noch nicht (geschafft) .

      Der Ansatz wäre höchstens, dass ich das Template schon mal so geschrieben habe wie ich es mir vorstelle mit <Wiederholen></Wiederholen> und aussen dran mit dem Code der nur einmal angezeigt werden soll. Bis jetzt hab ich es noch in 3 Dateien. Zuerst dem "Header" mit dem Titel und dem Reply-Link und dann das Wiederholende in einem Template und dann noch Reply-Link unten und Copyright wieder in einem anderen Template.
      Zuletzt geändert von pascal007; 07.05.2007, 06:17.

      Kommentar


      • #4
        http://www.php-resource.de/tutorials/read/20/2/

        Kommentar


        • #5
          PHP-Code:
          for ($i=0$icount($vereine); $i++)

          Hier wird mit einer for-Schleife gearbeitet kann ich diesen Teil auch durch eine while-Schleife austauschen? Weil das wäre ja für eine DB-Abfrage um einiges einfacher finde ich.

          Kommentar


          • #6
            klar.

            Kommentar


            • #7
              Ich nehme mal an fetchBlock() ist eine Funktion die das Template-System das im Tutorial benutzt wird verwendet. Aber die Seite zu dem System funktioniert nicht (404 Page not found). Sonst bin ich jetzt mal so weit:

              viewentry.php
              PHP-Code:
              <?php
              $topicid 
              $_GET["id"];

              include(
              "config.php");
              include(
              "tpl_parser.inc.php");
               

              $topicreq "SELECT topictitle FROM ".$tblpre."topics WHERE topicid = $topicid";
              $topictitle mysql_query($topicreq);
              $_topicarray mysql_fetch_assoc($topictitle);
               
              //Datenbankabfrage zusammenstellen
              $sql "SELECT * FROM ".$tblpre."entries
                          LEFT JOIN "
              .$tblpre."users ON ".$tblpre."users.userid = ".$tblpre."entries.user 
                          WHERE topicid = 
              $topicid";
              $result mysql_query($sql);

              $topic $_topicarray["topictitle"];
              $postreply "reply.php?topic=$topicid";

                  
              $var_array = array("TOPICTITLE" => $topic,
                                      
              "POST_REPLY" => $postreply);

              //    
              // Zu wiederholender Teil
              //
              $tplEntries $tpl->fetchBlock('entries');

              while(
              $row mysql_fetch_object($result))
                  {
                  
              if(empty(
              $row->avatar)) { $row->avatar "blank.gif"; };

               
              //Definition der Variablen durch die die Platzhalter ersetzt werden.
               
              $id        $row->id//$_array["id"];
               
              $title        $row->title//$_array["title"];
               
              $message    $row->message//$_array["message"];
               
              $user        = (!empty($row->user))?'<a href="viewprofil.php?id='.$row->userid.'">'
              .$row->name.'</a>':'$row->name';
               
              $userid    $row->userid;
               
              $date        $row->date//$_array["date"];
               
              $avatar    "<img src=\"images/avatars/$row->avatar\">";

               
              //Array mit den Platzhaltern (Keys) und den Inhalten.
               
              $var_array = array("ID" => $id,
                                   
              "TITLE" => $title,
                                  
              "DATE" => $date,
                                  
              "MESSAGE" => $message,
                                  
              "USERNAME" => $user,
                                  
              "VISIT_USER" => $visituser,
                                  
              "AVATAR" => $avatar);
                  }
                  
               
              //Initialisierung der Klasse und Parsen des Templates
               
              $tpl = new parser("../templates/content.tpl"$var_array);
                   
                  
              ?>
              Und das Template:

              content.tpl
              PHP-Code:
              <h1>{TOPICTITLE}</h1>
              [<
              a href="{POST_REPLY}">Reply</a>]
              <!-- 
              BEGIN entries -->
              <
              a name="{ID}"></a>
              <
              table align="center" border="1" width="650">
                  <
              tr
                       <
              td>{USERNAMEwrote on <b>{DATE}</b></td>
                       <
              td rowspan="2" align="right" width="20px">{AVATAR}</td>
                   </
              tr>
                   <
              tr>
                       <
              td valign="bottom" height="2"><b>{TITLE}</b></td>
                   </
              tr>
                   <
              tr>
                       <
              td colspan="2">{MESSAGE}</td>
                   </
              tr>
                   <
              tr>
                       <
              td align="right" colspan="2"><a href="viewtopic.php?id={TOPICID}#{ID}">
              <
              b>#{ID}</b></a></td>
                   
              </tr>
              </
              table>
              <
              br>
              <!-- 
              END entries -->
              [<
              a href="{POST_REPLY}">Reply</a>]
              <
              p>
              &
              copy2007 by TiME-SPlINTER
              </p
              Als Fehlermeldung bekomme ich
              Fatal error: Call to a member function fetchBlock() on a non-object in Server-address\viewentry.php on line 25
              zurück.
              Zuletzt geändert von pascal007; 07.05.2007, 18:36.

              Kommentar


              • #8
                Was hälst du davon, wenn du erstmal versuchst die ganze sache zu verstehen anstatt hier mit Copy&Paste was zusammenzuwürfeln.

                1. Ist da eine funktionierende ZIP zum Download bereit gestellt.
                2. Kuerbis.org ist erreichbar.
                3. mit ein bisschen geschick (einem einfachen Klick auf "Download") findet man dort auch eine aktuelle Version samt Downloads.

                War so viel Eigenständigkeit zu viel verlangt?

                BTW: Bitte Code gemäß unserer Regeln umbrechen. Ansonsten wird hier keiner mehr antworten.

                Kommentar


                • #9
                  Original geschrieben von TobiaZ
                  BTW: Bitte Code gemäß unserer Regeln umbrechen. Ansonsten wird hier keiner mehr antworten.
                  OffTopic:

                  UAHHH!!! ich hab 1280 * 1024 und horizontale scrollleiste


                  Bitte Beachten.
                  Foren-Regeln
                  Danke

                  Kommentar


                  • #10
                    So gut habe mir mal den Artikel mit dem Template-System von hier durchgelesen und da mal rumgebastelt. Was mir aufgefallen ist: test3.php funzt nicht (unverändert), es werden nur die {begriffe} angeizeigt, aber nicht deren Inhalt. Zeilen sind 18 dargestellt, aber eben nur mit den {}-Platzhaltern. Jetzt habe ich eine while-Schleife eingebaut und das selbe Problem, es wird 3 mal die Tabelle angezeigt (für 3 Datensätze in der DB), jedoch werden die Platzhalter nur in dem Ausgeschnittenen Block nicht übergeben. Ausserhalb geht es ohne Probleme. Hier mein Beispiel.

                    Kommentar


                    • #11
                      Hier mein Beispiel.
                      Meine Glaskugel ist so verschwommen ... ich kann nichts erkennen. (ähnliches Problem).
                      [COLOR=red]BTW: Bitte Code gemäß unserer Regeln umbrechen. Ansonsten wird hier keiner mehr antworten.[/COLOR]
                      Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                      Kommentar


                      • #12
                        Original geschrieben von tontechniker
                        Meine Glaskugel ist so verschwommen ... ich kann nichts erkennen.
                        Da kann ich dir leider nicht helfen... ich kann die Beispielseite klar erkennen .
                        Hm aber ich spreche hier das Problem spezifisch auf das Tutorial von PHP-Resource an, bei dem beiliegenden Zip-Archov funktioiniert Beispiel 3 nicht... alle anderen gehen. Ich habe auch keine Problem bei den Wiederholungen oder der Reihenfolge der Ausgabe sondern nur das die Platzhalter nicht ersetzt werden. Aber das wird in deinem verlinkten Thread nie erwähnt.

                        @Quellcode formatieren: tut mir ja leid, aber ich habe nun mal keine so tiefe Auflösung (1024x768). Ich habe es jetzt aber mal so gemacht das es unter 1280x1024 keine wagrechte Scrolleiste mehr gibt.

                        BTW: gebe ich noch kurz den Quelltext von der oben angegeben Beispiel-Datei an (falls du das mit "verschwomen" (unklar?) meintest:

                        PHP-Code:
                        <?php

                        include("../includes/config.php");

                        include(
                        'class_template.inc.php');

                        $tpl = new Template('template3.tpl.html');

                        $tpl->assign('title''Template Beispiel 1');

                        //Datenbankabfrage zusammenstellen
                        $sql "SELECT * FROM ".$tblpre."entries";
                        $result mysql_query($sql);

                        $tplEntries $tpl->fetchBlock('entries');
                        while(
                        $row mysql_fetch_object($result))
                            {
                        /*$tplEntries = array(  'message1' => '$row->message',
                                         'title' => '$row->title',
                                         'user' => '$row->user'  
                                ); */
                                
                                
                        $tplEntries->assign('message''$row->message'); 
                                
                                
                        $tpl->assign('entries'$tplEntries); 
                                
                        $tplEntries->reset(); 
                        }
                        $tpl->out();

                        ?>
                        Habe mir mal alle Fehler ausgeben lassen (mit error_reporting(e_all) da kam folgendes raus:


                        Notice: Undefined property: Template::$pl in tpl\class_template.inc.php on line 224

                        Notice: Undefined property: Template::$pl in tpl\class_template.inc.php on line 224

                        Notice: Undefined property: Template::$pl in tpl\class_template.inc.php on line 224
                        Das ist folgende Line:

                        PHP-Code:
                        if (is_array($this->pl))
                                { 
                        Zuletzt geändert von pascal007; 07.05.2007, 21:19.

                        Kommentar


                        • #13
                          Und da soll dir noch jemand helfen?
                          PHP-Code:
                          $tpl = new Template('template3.tpl.html'); 
                          PHP-Code:
                          if (is_array($this->pl)) 
                          Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                          Kommentar


                          • #14
                            Ja auf die Idee bin ich auch schon gekommen alle pl's in tpl umzubenennen. Die Fehlermeldung bleibt aber bestehen, also kann es nicht an dem liegen. Zudem ist das die Datei "class_template.inc.php" die hab ich nicht verändert. Wie gesagt, ich denke der Fehler liegt ausnahmsweise mal nicht bei mir weil das Beispiel 3 hier in der Tutorial Sektion auch nicht funktioniert.
                            Zuletzt geändert von pascal007; 08.05.2007, 06:41.

                            Kommentar


                            • #15
                              In den Tutorials sind wahrscheinlich absichtlich Fehler eingebaut,
                              damit die User nicht nur stumpfsinnig kopieren sondern mitdenken.

                              Fehler lassen sich mit error_reporting und dem Ausgeben von wichtigen Variableninhalten per echo oder print_r finden.

                              Dazu muß man das Script nachvollziehn und wissen welche Variableninhalte zu prüfen sind.

                              ----------

                              Fehler suchen und Debuggen macht jeder Programmierer tagtäglich.
                              Deswegen rennt man nicht in ein Forum, es sei denn man kann den Fehler schon mal eingrenzen und ganz konkret sagen wo man nicht weiterkommt.
                              Eine Aussage wie "bei dem beiliegenden Zip-Archov funktioiniert Beispiel 3 nicht... alle anderen gehen" bringt nichts.

                              Kommentar

                              Lädt...
                              X