Latte: makro {cache} a invalidace nadřazených
- pepakriz
- Člen | 246
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
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
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 => ...}