Jak se dostanu ke {cache ‚article‘} v presenteru?
- Michalek
- Člen | 211
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)
- Michalek
- Člen | 211
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
Můžeš zkusit použít LazyAccessor
. Klidně
si ho napiš sám, je to jedna malá třída.