Ivalidace cache šablony z presenteru

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

V šabloně mám blok cache

{cache tags => ['category']}

V presenteru chci pak invalidovat. Zkoušel jsem např.:

$this->context->templateCacheStorage->clean(array(
	\Nette\Caching\Cache::TAGS => array("category")
));

Ale to mě nefunguje. Jak na to?

bojovyletoun
Člen | 667
+
0
-

v prvé řadě mazat cache a ne storage. instanci keše máš pravdepodobně někde uloženou, takže

$this->cache->clean
{cache $id, tags

PS: Mám pocit, že by se hodilo, dát do contextu odkaz na Cache, ať se furt nemusí psát storage

ldown
Člen | 29
+
0
-

To právě netuším jak se dostanu k instanci keše která řeší šablony …

ldown
Člen | 29
+
0
-

Tak nakonec stačilo místo

$this->context->templateCacheStorage->clean
$this->context->cacheStorage->clean
uestla
Backer | 799
+
0
-

Není to špatně?

Nemá se uvolňovat na úrovni objektu Nette\Caching\Cache a ne až na Storage (viz de facto o 3 příspěvky výše)?

Jde o to, že v instanci Cache se po načtení data rovněž udržují, čili po vyčištění Storage je teoreticky možné v dalším běhu programu s daty v Cache pracovat (neboť v paměti tato data zůstala).

Já při hledání řešení postupoval takhlenc:

Čili bych se nebál (za použití této šablony:

{cache 'mojeCache', tags => ['category']}
...
{/cache}

) v presenteru volat

$cache = new Caching\Cache($this->context->cacheStorage, 'Nette.Templating.Cache');
$cache->clean(array(
	\Nette\Caching\Cache::TAGS => array("category",),
));

Ale nevím… Není to ani trochu voňavé :-(


EDIT:
Tak chybička – opravil jsem získání Cache v Presenteru (jelikož Environment je deprecated, tak do správné podoby – vzal jsem kód přímo z Environment::getCache() ;) ).

Editoval uestla (16. 6. 2011 16:32)

ldown
Člen | 29
+
0
-

Asi máš pravdu.
Na kód Environment::getCache jsem taky pak narazil …

Oggy
Člen | 306
+
0
-

Ahoj, narazil jsem na podobný problém, při mazaní cache vytvořené v šabloně..

šablona:

<?php
{cache jmeno, tags => [backgrounds]}
 ...
{/cache}
/>

a při invalidaci v presenteru:
<?php
//$cache = new \Nette\Caching\Cache($this->context->cacheStorage, 'Nette.Templating.Cache');

$this->context->cacheStorage->clean(array(
	\Nette\Caching\Cache::TAGS => array("backgrounds"),
));
?>

narážím na chybu:

Undefined index: i

…/libs/Nette/Caching/Storages/FileJournal.php:703 source ► Nette\Caching\Storages\FileJournal→ saveNode (arguments ►)

…/libs/Nette/Caching/Storages/FileJournal.php:506 source ► Nette\Caching\Storages\FileJournal→ saveNode (arguments ►)

…/libs/Nette/Caching/Storages/FileJournal.php:311 source ► Nette\Caching\Storages\FileJournal→ cleanFromIndex (arguments ►)

…/app/AdminModule/presenters/HotelPresenter.php:304 source ► Nette\Caching\Storages\FileStorage→ clean (arguments ►)

302: $this->context->cacheStorage->clean(array(
303: \Nette\Caching\Cache::TAGS ⇒ array(„backgrounds“),
304: ));

…/libs/Nette/Caching/Storages/FileStorage.php:322 source ► Nette\Caching\Storages\FileJournal→ clean (arguments ►)

…/app/AdminModule/presenters/HotelPresenter.php:304 source ► Nette\Caching\Storages\FileStorage→ clean (arguments ►)