Template cachen - Ja, schon wieder...

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Template cachen - Ja, schon wieder...

    Ich weiß, so langsam könnte das Thema nervig werden.
    Aber vielleicht hat ja trotzdem jemand Lust...

    Erstmal das,was funktioniert:

    Ich habe Templates, die nach jeder Änderung "kompiliert" werden, so dass ich ein Datei mit PHP-Code erhalte, die dann bei jedem Aufruf des Templates abgearbeitet wird.

    Schreibe ich irgendwo in ein Template
    Code:
    {cache_file /}
    , so wird das Template kompiliert wie vorher auch, allerdings gibt es noch eine weitere Funktion, die beim ersten Aufruf des kompilierten Templates ausgeführt wird, das Template "still" (also ohne Ausgabe) prozessiert und dann das kompilierte Template so umschreibt, dass es nur noch das Ergebnis der "stillen" Ausführung zurückliefert.
    Das nutze ich z. B. bei FAQ-Seiten, die online gepflegt werden können.
    Da sich deren Inhalt nicht allzu oft ändert, wird nach Ändern der FAQs das kompilierte Template einfach gelöscht.
    Beim nächsten Aufruf der FAQ-Seite wird es erneut kompiliert, "still" ausgeführt und das Ergebnis davon wird gespeichert, so dass ich nicht jedesmal über Arrays iterieren und ähnliches muss.

    Jetzt das, was noch nicht funktioniert:
    Code:
    {cache_file /}
    cached das komplette Template, ich hätte jetzt aber gerne noch die Möglichkeit nur bestimmte Teile eines Templates zu cachen

    Beispiel:
    Code:
    {cache}
    {loop sitemap}
      {if _first}<ul>{endif}
       <li><a href="{link_link}">{link_title escape}</a>
        {recursion sitemap /}
       </li>
      {if _last}</ul>{endif}
    {endloop}
    Die Sitemap ist gültig seit dem {_now date_format "d.m.Y"}
    {endcache}
    Hallo, heute ist der {_now date_format "d.m.Y"}
    Soll mir die komplette Sitemap anzeigen und zwar nur beim ersten Aufruf des Templates, danach soll sie statisch im kompilierten Template stehen.
    Das Datum soll aber immer aktuell ausgegeben werden.

    Aus
    PHP Code:
    $result '';
    $result .= loop_sitemap($sitemapt);
    $result .= 'Die Sitemap ist gültig seit dem ';
    $result .= date('d.m.Y'time());
    $result .= 'Hallo, heute ist der ';
    $result .= date('d.m.Y'time());
    return 
    $result
    sollte dann also das hier werden:
    PHP Code:
    $result 'HTML-Code der Sitemap
    $result .= '
    Die Sitemap ist gültig seit dem 04.03.2005';
    $result .= '
    Halloheute ist der ';
    $result .= date('
    d.m.Y', time());
    return $result; 
    Hat jemand einen tollen Ansatz wie ich sowas realisieren könnte?

    Wenn nicht, muss ich erstmal selbst weiter überlegen und wenn mir weiterhinnichts einfällt, muss ich aus dem Sitemap-Template wohl oder übel zwei Templates machen. Eines für die Sitemap,das dann komplett gecached wird und eines für den "Hallo, heute ist..."-Teil
    Ich denke, also bin ich. - Einige sind trotzdem...

  • #2
    PHP Code:
    //eventuell verstehe ich dich falsch


    $result '';
    $result .= loop_sitemap($sitemapt);
    $result .= 'Die Sitemap ist gültig seit dem ';
    $result .= date('d.m.Y'time());
    $result .= 'Hallo, heute ist der ';
    $result .= date('d.m.Y'time()); 
    // du müsstest deiner engine irgendwie mitteilen das 
    // es die zweite Datefunktion nicht ausführen soll
    //$result .= function_erhalten('date('d.m.Y', time())'); 
    return $result
    mfg
    marc75

    <Platz für anderes>

    Comment


    • #3
      Die zweite Date-Funktion soll immer ausgeführt werden

      1. Aufruf
      PHP Code:
      $result '';
      $result .= loop_sitemap($sitemap);
      $result .= 'Die Sitemap ist gültig seit dem ';
      $result .= date('d.m.Y'time());
      //Jetzigen Inhalt von $result an die Stelle des bisherigen Codes setzen
      $result .= 'Hallo, heute ist der ';
      $result .= date('d.m.Y'time());
      return 
      $result
      2. Aufruf
      PHP Code:
      $result 'Das, was beim ersten Aufruf rauskam';
      $result .= 'Hallo, heute ist der ';
      $result .= date('d.m.Y'time()); 
      Mir fehlt momentan der Ansatz, wie ich an die zu cachenden Teile des Templates komme.

      Mir fiele nur sowas ein:
      PHP Code:
      $result '';
      /* cache 35763743437 (oder ein anderer Zufallswert */
      $result .= $cache35763743437 loop_sitemap($sitemap);
      $result .= $cache35763743437 .= 'Die Sitemap ist gültig seit dem ';
      $result .= $cache35763743437 .= date('d.m.Y'time());
      store_cache('35763743437'$cache35763743437);
      /* cache 35763743437 (oder ein anderer Zufallswert */
      $result .= 'Hallo, heute ist der ';
      $result .= date('d.m.Y'time());
      return 
      $result
      Und dann im Anschluss daran alles zwischen den Kommanteren durch den entsprechenden Block ersetzen.

      Aber dann müsste ich dafür sorgen, dass sich cache-Blöcke nicht verschachteln, ich überall die Cache-Zwischenspeichervariable eintrage, meine Bedingen umprogrammieren, da die nicht mit if und elseif und ähnlichem realisiert sind, sondern mit
      PHP Code:
      $result .= 'Die Bedingung ist '.(bedingung 'erfüllt' 'nicht erfüllt').'.'
      Insofern hoffe ich auf einen Geistesblitz der mir oder jemand anderem noch kommen wird
      Ich denke, also bin ich. - Einige sind trotzdem...

      Comment


      • #4
        Hallo,


        Ist es eventuell möglich das du dem Cache-Block einem Namen gibst (z.B. "sitemap")?


        Wenn das Template zum ersten mal aufgerufen wird:

        Die beiden Cache-Tags werden einfach ignoriert, dass ganze Template wird geparst. Danach ließt du mithilfe der beiden Cache-Tags den Bereich aus welcher gecacht werden soll, diesen Speicherst du dann in einer Cache-Datei (im Dateinamen müsste irgendwo der Name des Cache-Tags drinsein, mitsamt dem Template Namen (also theoretisch "templatename_cacheblockname.cache" o.ä.)).



        Beim 2. Aufruf:

        Du prüfst ob der Cache-Block schon existiert (den Namen mithilfe regulärer Ausdrücke auslesen?) und dann musst du dir wieder den Cache-Datei-Namen zusammenbasteln. Dann einfach alles zwischen den beiden Cache-Tags mit dem Inhalt aus der Cache-Datei ersetzen und das ganze Template am Ende wieder parsen..



        Weiß nicht ob ich da was falsch verstanden hab, ich weiß noch nicht einmal wie leicht bzw. schwer sich das umsetzen lässt..



        Floriam



        [..]dass sich cache-Blöcke nicht verschachteln[..]
        Kannst du mich darüber aufklären wieso sich die Cache-Blöcke verschachteln sollten?
        Last edited by Floriam; 16-03-2005, 19:41.
        PHP Handbuch - MySQL Handbuch - PHP Einsteiger Tutorial - CSS Referenz - Browserunterstützung von CSS

        Comment


        • #5
          Original geschrieben von Floriam
          Kannst du mich darüber aufklären wieso sich die Cache-Blöcke verschachteln sollten?
          Z. B., weil in einem File, das per include eingebunden wird, auch so ein cacheblock ist?
          Code:
          {cache}Ganz viel text
          {include "irgendwas.tpl"/}
          {endcache}
          Code von irgendwas.tpl
          Code:
          Etwas Text und dann ein Riesenloop
          {cache}
          {loop riesig}
          In {_key} steht {_value}
          {endloop}
          {endcahce}
          @Rest
          Ma schauen, ich hab da schon so eine Idee, die in etwa in die Richtung geht
          Ich denke, also bin ich. - Einige sind trotzdem...

          Comment

          Working...
          X