Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Template cachen - Ja, schon wieder... [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
ebiz-webhosting
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Template cachen - Ja, schon wieder...


 
mrhappiness
04-03-2005, 09:13 
 
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{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:
{cache_file /}cached das komplette Template, ich hätte jetzt aber gerne noch die Möglichkeit nur bestimmte Teile eines Templates zu cachen

Beispiel:{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 $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:$result = 'HTML-Code der Sitemap
$result .= 'Die Sitemap ist gültig seit dem 04.03.2005';
$result .= 'Hallo, heute 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

 
marc75
04-03-2005, 10:58 
 
//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;

 
mrhappiness
04-03-2005, 11:32 
 
Die zweite Date-Funktion soll immer ausgeführt werden

1. Aufruf$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$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:$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 $result .= 'Die Bedingung ist '.(bedingung ? 'erfüllt' : 'nicht erfüllt').'.';Insofern hoffe ich auf einen Geistesblitz der mir oder jemand anderem noch kommen wird

 
Floriam
16-03-2005, 19:38 
 
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?:confused:

 
mrhappiness
17-03-2005, 08:27 
 
Original geschrieben von Floriam
Kannst du mich darüber aufklären wieso sich die Cache-Blöcke verschachteln sollten?:confused: Z. B., weil in einem File, das per include eingebunden wird, auch so ein cacheblock ist?{cache}Ganz viel text
{include "irgendwas.tpl"/}
{endcache}Code von irgendwas.tplEtwas 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

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 20:08 Uhr.