Expirace a zjištění stavu cache šablony v presentru
- peacemaster
- Člen | 11
Ahoj,
snažím se zjistit stav cache šablony v presentru. Mám nadefinovanou šablonu jako:
<?php
{cache "page_$pageId", tags=>['page', "page_$pageId"]}
{include $inc}
{/cache}
?>
V presentru se k té cachi nedostanu.
<?php
$cache = new Cache($this->context->cacheStorage, 'Nette.Templating.Cache');
$cached = $cache->load("page_$pageId");
?>
proměná cached nic neobsahuje. Nicméně pokud chci cache expirovat, tak přes tagy není problém. Nicméně potřebuju už v presentru zjistit, jestli je daná stránka nacachovaná a pokud je, tak nevykonávat zbytečné dotazy na DB a rovnou ji načíst.
Našel sem tady na foru, něco s Environment, ale je to už označený jako deprecated, tak se mi to nechce moc používat. Existuje nějaká alternativa? Nezajímá mě obsah cache, ale stačí detekovat, jestli existuje. klidně i přes tagy.
Dík
- David Matějka
- Moderator | 6445
https://api.nette.org/…cro.php.html#112 podle tohodle to vypada, ze pokud pouzivas argumenty (jako tags), tak se tyto argumenty „pripojeji“ ke klici
ale lepsi by mozna bylo, aby model rovnou dotaz neprovadel, ale vracel nejakej lazy objekt, ktery dotaz provede az pri pozadavku na data (jako to treba dela Nette\Database\Table\Selection)
- peacemaster
- Člen | 11
ViPErCZ napsal(a):
V presenteru by mělo jít
$cache = new Caching\Cache($this->template->getCacheStorage(), 'Nette.FileTemplate'); $cached = $cache->load("page_$pageId");
Toto nevrací pořád nic. Ani když dám místo ‚Nette.FileTemplate‘ ‚Nette.Templating.Cache‘.
Skusil jsem i odebrat tagy. Ty jsem původně vůbec nechtěl, ale přidal jsem je jenom kvůli mazání.
Celé jádro problému spočívá v tom, že při vykreslení šablony se může provést 200–300, někdy i více dotazů do DB na základě toho co je v dané šabloně. V administraci po změnění nějakých položek chci cache expirovat – to není problém přes tagy, ale potom v presentru mám cca dalších 7 dotazů, které vykonat nepotřebuju pokud je šablona vycachovaná. Presenter zjišťuje co má akce includovat za soubory atd. Pokud ale mám ID, tak to není potřeba a vše se zrychlí
- duke
- Člen | 650
A nebude lepší prostě tu cachovanou část šablony generovat komponentou? Tj. nikoli presenter, ale komponenta presenteru by pak řešila, jaké soubory je třeba includovat do šablony komponenty (a pokládala při tom potřebné dotazy). V případě, že je obsah nacachován, tak by se vůbec ta komponenta nevytvářela, neboť k jejímu vytváření by docházelo až v cachované části šablony presenteru.
- peacemaster
- Člen | 11
Komponentám bych se v tomto případě raději vyhnul. Teď jsem tu šablonu, i její části schopen přetížit na více místech a je to relativně srozumitelné i pro designéra – tohoto bych se nerad vzdal.
- peacemaster
- Člen | 11
Tak jsem tam mrknul a vidím, že se tam vkládá random string jako klíč. Ten se mi jednoduše zjistit nepodaří. Jediná možnost je předpokládám tedy napsat vlastní makro na cachování?