makro {noCache} – vyjmutí části z cachované obalsti

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
pepakriz
Člen | 246
+
0
-

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
+
0
-

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 :)