kostenloser Webspace werbefrei: lima-city


DB-Inhalt in String speichern (Templates)

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    Hi...

    Ich habe, auf Lucas9991's Tutorial aufbauend, ein eigenes Template-System entwickelt, das bisher ganz normale Texte ausgeben kann.

    template.inc:
    function set_file($tplfile)
     {
       global $templatefile;
       $templatefile = file_get_contents($tplfile);
       $tplvars = array();
     }
    function set_var($indexwert, $inhalt) 
     {
       global $tplvars;
    
       $tplvars[$indexwert] = $inhalt;
     }
    function parse()
     {
       global $templatefile;
       global $tplvars;
       foreach($tplvars as $tplindex => $tplvarcont) {
       $templatefile = str_replace("{".$tplindex."}",
       $tplvarcont, $templatefile);
     }
     }
    function p()
     {
       global $templatefile;
       echo $templatefile;
     }


    Und diese Funktionen werden dann halt auf der Seite ansich angesteuert:

    index.php:

    include "template.inc";
    
    set_file("templates/index.html");
    
    set_var("Pagetitle","Template-Test-Datei!");
    
    parse();
    p();


    Jetzt aber meine Frage:

    Ich will ja auch so genannte Bl?cke ausgeben!
    D.h. ich will Daten aus der Datenbank ausgeben.

    Jetzt ging mir folgendes durch den Kopf:

    Ich muss erstmal den Block-Teil, der wiederholt werden muss, speziell markieren.
    Dann muss das Script diesen Teil aus dem String mit dem html-Code filtern, diesen in einen neuen String speichern und mit dem Inhalt aus der Datenbank f?llen.
    Dann muss der html-Code wiederholt werden, nur halt jeweils mit neuem inhalt! (Aus der Datenbank)

    Und genau da steh ich an.
    Ich weo? nicht, wie ich den Inhalt entsprechend in einen Strin lade und dann durch das Script wiederholen lasse...

    Wenn mir da jemand weiterhelfen k?nnte, w?re das super!

    Beitrag ge?ndert am 21.07.2005 22:44 von schrotti12
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hiho!

    Freut mich, dass meine Tutorials benutzt werden! :)
    Dein Code sieht an sich sehr gut und sch?n aus, aber du solltest mit der Funktion "file_get_contents" aufpassen, denn nicht jede PHP Version unterst?tzt die.

    Ich wei? jetzt aber nicht genau, wie du das mit den Bl?cken meinst.
    Wie sieht die DB aus?
    Ich w?rde es ganz einfach so machen :
    id | platzhalter | text

    Jetzt lieste das ganze einfach aus und setzt es in deine Funktion "set_var ()" ein.



    P.S.: K?nntest du vllt [ code ] verwenden? W?re nett, denn dann kann man den Code besser lesen.

    Beitrag ge?ndert am 21.07.2005 21:59 von lucas9991
  4. Autor dieses Themas

    schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    Also:

    im html-Code solls so bzw. so ?hnlich aussehen:

    <--BEGIN Block-->
    <tr><td><a href="{url}">{urlname}</a></td></tr>
    <--END Block-->

    Jetzt nimmt das php-Script die Daten f?r die Linkliste, in diesem Fall halt, aus der Datenbank.

    Und dann soll das ganze so ablaufen:

    1. Die Tabellenspalte soll in einen String gelesen werden.

    2. Die Variablen {url} und {urlname} sollen durch entsprechende Werte aus der DB ersetzt werden (am besten mit set_var("urlname","$row->urlname"); oder so!)

    3. Selbstverst?ndlich soll dann die Schleife, mit der die Daten aus der DB wiedergegeben werden, durchlaufen, bis alle Daten ausgegeben sind.

    4. Der String sollte am Schluss so aussehen:

    $string =
    "
    <tr><td><a href="Link1">Linkname1</a></td></tr>
    <tr><td><a href="Link2">Linkname2</a></td></tr>
    <tr><td><a href="Link3">Linkname3</a></td></tr>
    <tr><td><a href="Link4">Linkname4</a></td></tr>
    ";

    Das allerdings erst, sobald die Schleife durchgelaufen ist.

    Dann soll das Script diesen String statt des Blockes in den html-Code einf?gen und folglich sollte es dann richtig ausgegeben werden.
    Hoffe ich zumindest...

    Aber eben, wie ich das mit der Schleife mache, bekomm ich nicht raus!
  5. Gro?er lucas9991!

    Was der schrotti meint, ist das deine Template-Engine nur "flat templates" unterst?tzt. Verschachtelte oder rekursive Templates k?nnen von so einer Engine eben nicht verarbeitet werden.

    @schrotti12

    Ich habe sowas mal angefangen (vor langer Zeit, als ich noch jung war ... ):

    Wenn du gerne anderer Leute Qu?lcodes durchforstest und zu verstehen versuchst, kuckst du mal hier:

    http://alopex.pyrokar.lima-city.de/srccodelist/index.php?name=httb_templateengine

    und hier:
    http://alopex.pyrokar.lima-city.de/srccodelist/index.php?name=hted

    Beide Teile geh?ren zusammen (Eins "required" das andere). Die unterst?tzte Template-Syntax ist die gleiche wie beim PHP-PECL-Modul f?r Templates. Man kann sie aber auch ?ndern.

    Ich leiste allerdings keinen Support. Und nat?rlich gibt es im Web bessere Engines. Im PEAR gibt es AFAIK eine Klasse namens Smarty, die sowas leisten k?nnte. Ich werde mal recherchieren.

    http://pear.php.net/search.php?q=template+engine&in=packages&x=0&y=0

    http://search.dmoz.org/cgi-bin/search?search=template&all=no&cs=UTF-8&cat=Computers%2FProgramming%2FLanguages%2FPHP%2FScripts%2FContent_Management

    MfG
    alopex

    Beitrag ge?ndert am 21.07.2005 23:35 von alopex
  6. Autor dieses Themas

    schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    Danke...

    Ich habs mal zu den Fav's gegeben...
    Ich geh jetzt pennen...

    Aber ich meine, das iss nur ein L?sungsansatz von mir...

    Wenn ihr bessere L?sungen habt, bin ich umm alles froh... ehrlich...

    MfG
    schrotti

  7. Gro?er lucas9991!

    Was der schrotti meint, ist das deine Template-Engine nur "flat templates" unterst?tzt. Verschachtelte oder rekursive Templates k?nnen von so einer Engine eben nicht verarbeitet werden.


    Ahaa! xD


    Vieleicht gehts so :
    $template = '
    <html>
    <!-- html code... //-->
    [Block1]
    <tr><td><a href="{url}">{urlname}</a></td></tr>
    [/Block1]
    </html>';
    
    $block1 = preg_replace ('/\[Block1\](.*?)\[\/Block1\]/U', '$1', $template);
    // jetzt m?sste theoretisch der String mit "<tr><td><a href="{url}">{urlname}</a></td></tr>" in der Variable $block1 gespeichert werden
    // links aus der db lesen...
    while ($row = myqsl_fetch_array ()) {
      $links = str_replace ('{url}', $row['link'], $block1 );
      $links = str_replace ('{urlname}', $row['linkname'], $block1 );
    }

    So, oder so ?hnlich k?nnte es klappen.
    Ich hoffe, dass du damit was anfangen kannst!
  8. Autor dieses Themas

    schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    Danke...

    Im Moment bin ich leider nicht zu Hause, aber ich werds versuchen, sobald ich zu Hause bin.

    Sieht vielversprechend aus...

    Ich habe mir gestern noch ein paar Sachen bzgl. ereg_replace und ?hnliche angeschaut...
    Also machbar ist es auf jeden Fall...
  9. c*********c

    Hier mein Quellcode (funktioniert auch mit mehreren Bl?cken):

    error_reporting(E_ALL);
    
    $Template = htmlspecialchars("
    
    blablalba
    <--BEGIN Block-->
    <tr><td><a href=\"{url}\">{urlname}</a></td></tr>
    <--END Block-->
    restlicher Code....
    
    <--BEGIN Block-->
    <tr><td><a href=\"{url}\">{urlname}</a></td></tr>
    <--END Block-->
    
    muh");
    
    
    $text = preg_split("/&lt;\-\-BEGIN Block\-\-&gt;/",$Template);
    
    print_r($text);
    
    $anz = count($text) - 1;
    $muster = array();
    
    for($i = 0; $i <= $anz; $i++)
    {
    if(preg_match("/&lt;\-\-END Block\-\-&gt;/", $text[$i]))
    {
    $temp = preg_split("/&lt;\-\-END Block\-\-&gt;/",$text[$i]);
    $muster[] = $temp['0'];
    }
    }
    
     
    print("<br /><br />");
    print_r($temp);
    print("<br /><br />");
    print_r($muster);
    
    print("<br /><br />");
    
    
    // -----------------------------------------------
    
    $ausgabe = array();
    
    while($row = mysql_fetch_array($result))
    {
    $ausgabe[] = str_replace("{url}", $row['url'], $muster['1']);
    }
    
    print("Ausgabe formatiert:<br>");
    
    print_r($ausgabe);
    
    // -----------------------------------------------
  10. Autor dieses Themas

    schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    So...

    Ihr habt mich auf die Idee gebracht:

    $template = '<html><head><title></title></head><body>[Block]<tr><td><a href="{url}">{urlname}</a></td></tr>[/Block]</body></html>';
    
    $part1 = explode("[Block]",$template);
    $part2 = explode("[/Block]",$part1[1]);
    
    $blockinhalt = $part2[0];
    
    echo $blockinhalt;


    So bekomm ich den Inhalt des Blocks in einen String...

    Was haltet ihr von der Idee?

    @lucas:
    das auslesen des Blockinhalts hat nicht hingehaun, aber dein Ansatz hat mich auf das gef?hrt...

    @compact:
    Sorry, aber dein Code iss ein wenig umfangreich f?r meine Zwecke...
    Au?erdem blick ich leider nicht ganz durch...
  11. c*********c

    @schrotti

    Wenn es vorkommen kann, dass sich mehrere Bl?cke in einem Template befinden, dann wird Dein Script m?glicherweise nicht mehr richtig funktionieren, da immer nur das Erste Element im Array weiterverarbeitet wird.
    Aber wie gesagt, solange nur 1 Block vorhanden ist, sollte das tadellos funktionieren!

  12. Autor dieses Themas

    schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    Das kommt ja nacher in eine Funktion und wird dann direkt in einen String gespeichert.
    Wenn also mehrere Bl?cke sind (Men?, News und noch etwas) dann werden die ja
    fertig geparst in einem String gespeichert und dann, wie normale Variablen auch, ?ber den
    letzten Teil (das str_replace) in den
    string mit dem restlichen html-code eingef?gt...

    Beitrag ge?ndert am 24.07.2005 00:31 von schrotti12
  13. Autor dieses Themas

    schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    So, also:

    Den html-Code, der sich wiederholen soll, hab ich ja jetzt...

    Aber wenn ich nun die Daten aus der Datenbank einf?gen will, macht er das immer nur mit einer Zeile...
    Den rest l?sst das Skript links liegen...

    Jetzt noch eine Frage:

    Ich habe also den Code.
    Der sollte nun irgendwie "aufgeteilt" werden und dazwischen, wenn man so will, sollten die Template-Variablen mit Inhalt gef?llt werden...
    Der Rest des html-Codes sollte "mitgeschleift" werden bzw. wiederholt werden.

    Iss das irgendwie zu berwerkstelligen?
  14. c*********c

    include("connect.inc.php");
    
    $sql = "SELECT * FROM template" WHERE irgendwas = 'xxx'";
    $result = mysql_query($sql);
    
    if($result === FALSE)
    {
    print("Fehler: ". mysql_error() ."<br />");
    exit();
    }
    
    $template = get_template_file("Ordner/meintemplate.htm");
    $block = block();
    $rep = array();
    
    while($row = mysql_fetch_array($result))
    {
    $temp = str_replace("{url}",$row['url'], $block);
    $temp = str_replace("{urlname}",$row['urlname'], $block);
    
    $rep .= $temp;
    }
    
    $template = str_replace("<--BEGIN Block -->". $block ."<--END Block-->", $rep, $template);
    
    // dummdidum


    Versuchs mal so...

  15. Autor dieses Themas

    schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    Nein, eure Vorschl?ge funtzen irgendwie nicht...

    Also, nochmals als Zusammenfassung:

    Ich habe den Code, der sich wiederholen soll in einer Variable gespeichert. Diese hat den Namen, treffenderweise, "$block".
    Darin ist rein der Quelltext enthalten, der immer wieder wiederholt wird! Die Template-Variablen, die ersetzt werden sollen, sind da auch drinnen!

    Dann sieht das ganze in etwa so aus:

    block = "<tr><td><a href="{url}">{urlname}</a></td></tr>";


    So, bei euren Vorschl?gen iss es immer insofern schief gelaufen, dass er es nicht richtig ersetzt hat!
    Also immer nur die erste Zeile und nacher war schluss...

    Ich will jetzt ungef?hr folgendes Schema:

    |html-code1|Zeile1|html-code2|Zeile1|html-code3|
    |html-code1|Zeile2|html-code2|Zeile2|html-code3|
    |html-code1|Zeile3|html-code2|Zeile3|html-code3|
    |html-code1|Zeile4|html-code2|Zeile4|html-code3|

    Der Inhalt von Zeile 1,2,3 und 4 kommt aus der Datenbank und soll ersetzt werden...
    Das m?sste doch rigendwie m?glich sein!

  16. <--BEGIN Block-->
    <tr><td><a href="{url}">{urlname}</a></td></tr>
    <--END Block-->


    Das ist ja Lustig. Denn so ?hnlich arbeiten auch das Template-System von Wiki4You.de.

    Jens
  17. Mhh...
    Also ehrlich gesagt sollten die Scripte genau das tun.
    Vllt l?dste das ganze mal irgendwo als *.php und als *.txt hoch, dann kann man dir vllt besser helfen.
  18. Autor dieses Themas

    schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    @ jacr:
    Ich habs mir von phplib abgeschaut...
    Also zumindest den Aufbau!

    Zu den Templates:

    $block = "<tr><td><a href="{url}">{urlname}</a></td></tr>";
    $ergebnis = mysql_query("SELECT * FROM test");
    
    while ($row = mysql_fetch_array($ergebnis))
    {
    
    }


    Das ist der Kerncode, der mir Probleme macht...

    Jetzt sollte der String mit dem html-code ca. 4 mal wiederholt werden und die Variablen da drin mit dem Inhalt aus der DB ersetzt werden...
  19. $block = "<tr><td><a href="{url}">{urlname}</a></td></tr>";
    $ergebnis = mysql_query("SELECT * FROM test");
    string = '';
    $temp = '';
    while ($row = mysql_fetch_array($ergebnis)) {
    
    $temp = str_replace("{url}",$row['url'], $block);
    $temp = str_replace("{urlname}",$row['urlname'], $block);
    $string .= $temp;
    }

    So m?sste es eigetnlich funtzten...
  20. c*********c

    @lucas

    Du hast die letzte Variablen im zweiten str_replace-Befehl verwechselt, es m?sste (glaub ich) so heissen:

    while ($row = mysql_fetch_array($ergebnis)) {
    
    $temp = str_replace("{url}",$row['url'], $block);
    
    $temp = str_replace("{urlname}",$row['urlname'], $temp);
    
    $string .= $temp;
    
    }
    ?>


    Ansonsten finde ich keine Fehler im Code ...
  21. Autor dieses Themas

    schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    @ Compact:
    Stimmt, da war ein Fehler drin, aber jetzt gehts...

    Eine Frage:
    f?r was ist das ".="?
    Also der Punkt im speziellen mein ich...

    Zum Theme:
    Danke an euch!
    Jetzt kann ich weiter "entwickeln"...
    Das war das, was mich im Moment wirklich aufgehalten hat!

    Ich werde (ziemlich) sicher wieder irgendwelche Fragen haben.. Ich hoffe jedoch, nicht allzubald...

    Wenn das System fertig und voll funktionst?chtig ist, k?nnt ihr dann gerne eine "Gratis-Kopie" ohne Copyright haben :)!
  22. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!