Cache různých volání jedné šablony
- Jur4
- Člen | 51
Zdravím,
na jednoduché aplikaci si testuju práci s Nette a jsem naprosto nadšený :). Ale narazil jsem na jednu věc, se kterou si nevím rady.
Mám šablonu, ve které kešuju zobrazování článků:
...
{cache "article/$id"}
{*assign $article ArticlesModel::getInstance()->findById($id)
aby se data nacitala jen kdyz jsou opravdu treba, zkousel jsem tuhle variantu a
i klasiku, kdy data prirazuju normalne v renderArticle, ale muj problem to neovlivni *}
<h1>{$article->title}</h1>
<p><i>{$article->perex}</i></p>
<p>{$article->text}</p>
<p><a href="{plink Article:default}">Zpět</a> <a href="{plink Article:edit $article->getPrimaryKey()}">Editovat</a> <a href="{plink Article:delete $article->getPrimaryKey()}">Smazat</a></p>
{/cache}
...
Ta šablona je společna pro všechny články a který se zobrazí zavisí na parametru id.
Pokud tam nedam tagy {cache}
tak vše funguje ok, ale jakmile je
tam dám a zobrazím si nějaký članek, tak se zakešuje a v případě, že
si chci zobrazit článek jiný, změním parametr ale vždycky dostanu první
zobrazený článek z cache.
Takže dokud cache nesmažu dostávám pokaždě článek, který jsem si zobrazil jako první.
Nevím jestli je to nějaká moje blbá chyba, bug nebo to takto funguje správně a musím to udělat jinak. Ale na fóru jsem nic nenašel.
Takže co Vy na to? :)
- Honza Marek
- Člen | 1664
Ten parametr makra cache není cachovací klíč, ale invalidační tag (viz dokumentace Nette\Chache). Klíčem je něco jako název souboru a číslo řádky, proto se vždy zobrazuje první záznam.
- Jur4
- Člen | 51
Honza M. napsal(a):
Ten parametr makra cache není cachovací klíč, ale invalidační tag (viz dokumentace Nette\Chache). Klíčem je něco jako název souboru a číslo řádky, proto se vždy zobrazuje první záznam.
Jo toto chápu. Ale jak to co nejelegantněji vyřešit, abych nemusel cache přenášet do prezenteru.
Něco jako závislost parametrech se kterýma je presenter volán. Nic jiného mě nenapadá.
- Honza Marek
- Člen | 1664
To záleží na situaci… Tenhle příklad mi ale přijde dost zvláštní, protože vypsání několika proměnných se nemůže vyplatit cachovat.
- Jur4
- Člen | 51
Toto beru jen jako testovací aplikaci. Jestli se cache vyplatí nebo ne vubec neřeším :D. Jde mi o to vyzkoušet si co všechno se s tím dá udělat.
Můžeme vzít jiný příklad. Nějaký článek na webu, kde je text prohnaný přes texy, a nějaké komentáře. Tady už by se mohla cache vyplatit. Docílím tady nějak očekávaného chování, aniž bych musel cache přesunout pryč z šablon?
Editoval Jur4 (6. 9. 2009 23:37)
- Honza Marek
- Člen | 1664
Jak využít tagů cache je popsané tu: http://zdrojak.root.cz/…ework-cache/
Pokud by ti tenhle způsob nevyhovoval, musel by sis napsat vlastní helper či makro.
- Jur4
- Člen | 51
Teď jsme se asi uplně nepochopili. Chápu princip tagů. Ale pomocí nich toho, čeho chci dosáhnout (tj. cache šablony pro volání s rozdílnými parametry, aniž bych dostával vždy to co se uložilo při prvním volání) nedosáhnu.
Každopádně se podívám na to, jak je to s vlastními makry.
- Jur4
- Člen | 51
Jan Tvrdík napsal(a):
Třeba tě inspiruje toto – https://forum.nette.org/…tor-v-modelu?…
Tohle je ono, o čem jsem psal. Dík.
David Grudl napsal(a):
Makro {cache} se bude co nevidět předělávat, tak jej zkus později ;)
Tak jestli toto bude pořešeno přímo v Nette bude cachování opravdu skvělé.
- Honza Marek
- Člen | 1664
David Grudl napsal(a):
Makro
{cache}
se bude co nevidět předělávat, tak jej zkus později ;)
A kdy a jak? .)
- Michalek
- Člen | 211
Nacpu se sem s dotazem.
Udělal jsem si tag
{scache 'diskuze#'.$id}dlouho generovaný obsah i s dotazy z databáze{/scache}
kdy parametr scache neslouží jako tag pro smazání, ale přimo cachovací
název (místo rádku v souboru).
V presenteru pak pomocí
$this->cacheTemplate = Environment::getCache('Nette.Template.Curly');
if(!isset($this->cacheTemplate['diskuze#' . $id]))
{
$values = $this->db->select($id)->fetch();
}
řeším, zda se dotázat modelu pro nová data, nebo se v šabloně načte cache. Daří se mi udržovat načítání nacachovaných stránek úplně bez dotazů na DB (mluvíme o složité strukturované diskuzi, ale i o jednoduchém článku titulek – nadpis).
Mám tak také řešený třeba box „poslední komentáře“, který se cachuje pro celou aplikaci nezávisle na ostatních změnách různých stránek.
Nejsem si ale jistý, jestli to dělám „správně“… Co vy na to?
Editoval Michalek (22. 10. 2009 23:33)