Latte: makro {cache} a invalidace nadřazených

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

Snažím se docílit toho, aby invalidovaná cache invalidovala i všechny nadřazené.

Nette tento problém řeší automaticky, bohužel jen v rámci jedné šablony. Tato ukázka funguje:

{cache ...}
	{cache ...}
		...
	{/cache}

	{cache ...}
		...
	{/cache}
{/cache}

Když ovšem vnitřní cache nahradíte za komponenty, které mají cache uvnitř své šablony, k invalidaci nadřazených už docházet nebude. Ukázka:

// šablona presenteru
{cache ...}
	{control poll1}
	{control poll2}
{/cache}

// šablona komponenty
{cache ...}
	...
{/cache}

Potřebuji tedy tyto šablony nějak propojit. Zkoušel jsem si chvíli hrát s makrem Nette\Latte\Macros\CacheMacro a nahradil jsem v generovaném kódu proměnnou $_g za $presenter->template->_g. Díky tomu se zásobník zanoření cache využívá globální z prezenteru. Hurá, invalidace mi začla fungovat i skrze komponenty!

Jenže máme tu ještě třetí variantu s layouty:

// @layout.latte
{cache ...}
	{include #content}
{/cache}

// šablona presenteru
{block #content}
{cache ...}
	{control poll1}
	{control poll2}
{/cache}

// šablona komponenty
{cache ...}
	...
{/cache}

V této variantě ať se snažím o jakoukoliv úpravu makra {cache}, nikdy při změně šablony presenteru nedojde k automatické invalidaci cache v layoutu. Dá se toho nějakou úpravou makra docílit? Případně jsem slepý a existuje pro to jiný postup?

pepakriz
Člen | 246
+
0
-

Měl jsem možnost zase chvilku se v tom šťourat a zjistil jsem příčinu nefunkčnosti poslední ukázky. Pokud má šablona presenteru nastaven layout, vykreslování probíhá opačně – tedy nejprve se spustí šablona presenteru (nadefinují se bloky) a až potom se spustí šablona layoutu. Díky tomu se šablona presenteru nemá jak dovědět o keších v layoutu. Nenapadá mě jednoduchý způsob, jak z toho ven.

pepakriz
Člen | 246
+
0
-

Konečně se mi podařilo rozchodit i poslední variantu invalidace přes layouty. Řešení mám rozdělané zde: https://github.com/…cheMacro.php .

Napadla mě ještě jedna užitečná funkce, kterou by cache makro mohlo mít. Opět nejdříve ukázka:

// @layout.latte
{cache $presenter->route->id}
    {include #content}
{/cache}

// šablona presenteru
{block #content}
{cache $foo}
    ...
{/cache}

V šabloně layoutu dojde k „nakešování“ celé stránky, což je super. Když změním šablonu layoutu nebo presenteru, celá cache se díky mým úpravám invaliduje a dojde k novému překreslení, což je také super. Co už ovšem super není, když se změní proměnná $foo, k žádné invalidaci nedojde. Samozřejmě to dává smysl, jelikož u keše v layoutu bych musel uvést něco jako {cache [$presenter->route->id, $foo]}, pak by ukázka fungovala. Ale co když layout netuší, jaké vnořené cache s jakými klíči bude vykreslovat?

Ukázku upravím do jiné podoby:

// @layout.latte
{cache $presenter->route->id, loadKeys => TRUE}
    {include #content}
{/cache}

// šablona presenteru
{block #content}
{cache $foo, propagateKeys => TRUE}
    ...
{/cache}

Co se změnilo? Cache v presenteru nastavuje argument, který říká, aby se klíč zpropagoval do nadřazených keší označených argumentem loadKeys. Je vůbec reálné něco takového do Nette implementovat?

PS: Obdobná funkcionalita by mohla být implementována i s {cache if => ...}