Cache různých volání jedné šablony

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

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>&nbsp;&nbsp;<a href="{plink Article:edit $article->getPrimaryKey()}">Editovat</a>&nbsp;&nbsp;<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
+
0
-

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

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

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

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

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

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.

Jan Tvrdík
Nette guru | 2595
+
0
-

Třeba tě inspiruje toto – https://forum.nette.org/…tor-v-modelu?…

David Grudl
Nette Core | 8228
+
0
-

Makro {cache} se bude co nevidět předělávat, tak jej zkus později ;)

Jur4
Člen | 51
+
0
-

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

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

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)