Jak se dostanu ke {cache ‚article‘} v presenteru?

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

Potřebuju v presenteru ověřit, jestli existuje cache ze šablony.

{cache 'article#'.$id.'#'.$seo} {* to funguje, cache se uloží do adresáře _Nette.Templating.Cache *}

A teď v Presenteru potřebuji udělat

public function actionDefault($id, $seo) {
	if(!isset($cache['article#'.$id.'#'.$seo])) {
		# načti článek z databáze, protože není nacachovaný
	}
}

SOLVED:

Myslel jsem, že po změně makra {cache} před pár lety se změnila i podstata práce s $key, ale bohužel ne tak jak jsem myslel. Při ukládání ze šablony se pořád vytváří i random string zřejmě pro kombinaci hodnot „přesně tahle šablona a přesně tenhle klíč“, takže klíč pro uložení je pak array($random, $key).

V presenteru já ale nedokážu ten random string nijak zjistit a nemůžu tak ověřit existenci cache.

Řešení je stejné jako minule (mělo mě to napadnout hned…) a to překrýt makro cache vlastní implementací, kde $key nebude array() ale string. K čemuž stačí v makru vyměnit %var za %node.word.

Vlastní makro:

$set->addMacro(
	'cacheId', // název makra, staré zůstane funkční pro použití bez $key
	'if (Nette\Bridges\CacheLatte\CacheMacro::createCache($netteCacheStorage, %node.word, $_g->caches, %node.array?)) {',
	'$_l->tmp = array_pop($_g->caches); if (!$_l->tmp instanceof stdClass) $_l->tmp->end(); }'
);

Editoval Michalek (19. 11. 2014 9:45)

Eda
Backer | 220
+
0
-

Jde to udělat i tak, abys tenhle problém nemusel vůbec řešit. Obal si to získávání článku do komponenty a až tu komponentu v latte obal do makra {cache}. Kód se pak provede jen tehdy, když bude skutečně potřeba (= když nebude nacachovaný).

Michalek
Člen | 211
+
0
-

Vím co myslíš, mám to takhle všude jinde, ale zrovna tady to nejde. Potřebuju zkontrolovat $seo v presenteru, zda souhlasí s tím z databáze a pokud ne, přesměrovat na správnou variantu. To při šáhnutí na load fci ze šablony už bohužel neprojde.

Zároveň ale nechci posílat dotaz na DB vždycky – jen když není nacachováno v šabloně (tzn článek neexistuje, je špatné seo (potřebuju ověřit) nebo jde o článek nový).

Editoval Michalek (19. 11. 2014 1:15)

mkoubik
Člen | 728
+
0
-

Můžeš zkusit použít LazyAccessor. Klidně si ho napiš sám, je to jedna malá třída.

Michalek
Člen | 211
+
0
-

Takhle jsem to v podstatě měl po staru, ale pak zbytečně udržuju dvě cache (jednu presenter, druhou šablona) a při sto tisících článků už je to podle mě zbytečné :) Každopádně vyřešeno, ráno chytřejší večera…

Editoval Michalek (19. 11. 2014 9:31)

mkoubik
Člen | 728
+
0
-

Presenter žádnou cache nepoužívá. Do šablony místo $article pošleš zabalený callback, který ho načte až když je potřeba (podobně jako to dělá nette/database). Tzn. jen když se nepoužije cache.

Michalek
Člen | 211
+
0
-

Jenže když pak potřebuju použít $this->redirect, je v šabloně už pozdě, ne?

mkoubik
Člen | 728
+
0
-

Pokud potřebuješ před vykreslením přesměrovat na základě dat z db, tak ti cache v šabloně sama o sobě nepomůže.