makro {noCache} – vyjmutí části z cachované obalsti
- pepakriz
- Člen | 246
Už nějakou dobu přemýšlím nad makrem noCache. Častokrát jsem se dostal do situace, kdy můžu cachovat celou stránku, až na oblast s proměnlivým obsahem jako třeba anketa. V tu chvíli musím makro {cache} rozkouskovat na dvě části. Teď si ale představte CMS systém, kdy nevíte, jaké komponenty kodér do šablony vloží. V základním layoutu mám třeba něco jako
<html>
<body>
<div id="content" class="module-{$moduleName|lower}">
{cache .....}
{include #content}
{/cache}
</div>
</body>
</html>
tím jsem si zařídil cachování modulu s určitými pravidly podle potřeb. Nyní se přesuneme do šablony konkrétního modulu.
<h1>Nadpis modulu</h1>
<p>
Nějaký text
</p>
Tady nenastává žádný problém. Mé CMS nabízí možnost skinování a přetěžování šablon. Někdo tedy vytvoří šablonu třeba takovou:
<h1>Nadpis modulu</h1>
<p>
Nějaký text
</p>
{control comments}
U takové šablony začneme časem bádat, proč nám do diskuze nikdo nepíše :D. V tu chvíli by se hodilo napsat něco jako:
<h1>Nadpis modulu</h1>
<p>
Nějaký text
</p>
{noCache}
{control comments}
{/noCache}
Otázka zní, je vůbec něco takového možné implementovat do stávajícího šablonového systému? Napadlo mě obsah mezi makrem {noCache} nepřekládat přes latte a ukládat ho do cache tak, jak leží. Při vykreslování by se celé html zachytilo do proměnné a na tuto proměnnou by se opět nahodil latte překlad a znovu by se kód pustil. Nedokážu odhadnout, na kolik je tento přístup robustní a rychlý. Máte někdo nějaké další nápady?
- Filip Procházka
- Moderator | 4668
Ukládat to „v Latte“ do cache, je hloupost. Protože to překládání
je velice náročné. Spíše zjistit, jak z toho udělat PHPko, které se
vykoná. Problém je v tom, že makro {cache}
obalí celý blok
kódu do podmínky, takže se vykoná jen jednou, výsledek se serializuje a
znovu ho nevykonáš.
Zde se nabízí možnost vlastního makra {cache}
, které by
neserializovalo výsledek, ale uložilo by zpracovanou šablonu, v
„executable“ podobě. S tím, že makro {noCache}
by
zajistilo, že jeho obsah bude uložen právě v té „vykonatelné“
podobě.
Bude tě zajímat hlavně funkce Cache::start kterou CacheMacro využívá.
Ještě mě napadá, využít senzační vlastnost Latte, o které David
mluvil při představení Nette 2.0beta, což je přetěžování maker.
Můžeš si registrovat to samé makro vícekrát a když jedno odmítne
zpracování, tak se o něj může postarat jiné. Představoval bych si to
tak, že tvoje makro {cache}
by se podívalo, jestli jsou v něm
nějaké makra {noCache}
a když ne, tak předalo otěže
původnímu Nette makru.
To je zatím tak všechno, co mě narychlo napadlo :)