Přístup k cache ze template do Presenteru
- Zuben45
- Člen | 268
Dobrý den,
potřeboval bych poradit jestli jde, popřípadě jakým způsobem, přistoupit
k cache, které jsem si vytvořil v templatu. Potřeboval bych ve fci provést
promazání konkrétní cache.
{cache "basket"}
<div id="basket">
<div id="basketName">{_menu.kosik}</div>
<a id="basketInner" href="{link Basket:default}">
<div id="basketIcon"><img src="{$basePath}/css/images/kosik_40x40.gif" title="{_menu.kosik}" alt="BaskIT!!!"></div>
<div id="basketCounter">
<div class="basketColumb">{_menu.pocet}: <span n:snippet="basketCount">{$pocetKsKosik}</span> {_menu.ks}</div>
<div class="basketColumb">{_menu.cena}: <span n:snippet="basketAmount">{number_format($cenaKosik,0,'.',' ')}</span> {_menu.mena}</div>
</div>
<div id="baskets"></div>
</a>
</div>
{/cache}
Děkuji
Editoval Zuben45 (4. 1. 2016 13:32)
- David Matějka
- Moderator | 6445
pridej si tomu tag, ktery pak invalidujes, viz doc https://doc.nette.org/cs/caching#…
mimochodem, cache je sdilena mezi vsemi uzivateli, takze jeden basket uvideji vsichni :) musis do klice pridat nejaky identifikator
- Zuben45
- Člen | 268
David Matějka napsal(a):
pridej si tomu tag, ktery pak invalidujes, viz doc https://doc.nette.org/cs/caching#…
mimochodem, cache je sdilena mezi vsemi uzivateli, takze jeden basket uvideji vsichni :) musis do klice pridat nejaky identifikator
Děkuji za odpověď, o identifikátoru přemýšlím, myslel jsem že bych použil nejspíše SESSION_ID, ale nejsem si jistý jestli je to moudré.
Dokumentaci jsem si pročítal, jen jsem si nebyl jistý jestli to funguje obousměrně. Takže si budu muset vytvořit službu pro cache s Istorage do
_Nette.Templating.Cache
, pokud se nepletu.
A nebo asi bude lepší když cache budu vytvářet již ve službě Basket ?
Editoval Zuben45 (4. 1. 2016 13:44)
- David Matějka
- Moderator | 6445
Děkuji za odpověď, o identifikátoru přemýšlím, myslel jsem že bych použil nejspíše SESSION_ID, ale nejsem si jistý jestli je to moudré.
session id se muze zmenit treba pri prihlaseni
Dokumentaci jsem si pročítal, jen jsem si nebyl jistý jestli to funguje obousměrně. Takže si budu muset vytvořit službu pro cache s Istorage do
_Nette.Templating.Cache
kdyz volaz clear(), tak se namespace nebere v potaz, takze to
_nette.templating.cache
nastavovat nemusis
A nebo asi bude lepší když cache budu vytvářet již ve službě Basket ?
asi ano, ale zamysli se, jestli vubec cache potrebujes. odkud beres stav kosiku? z db nebo ze session? „premature optimization is the root of all evil“ …
- Zuben45
- Člen | 268
David Matějka napsal(a):
A nebo asi bude lepší když cache budu vytvářet již ve službě Basket ?
asi ano, ale zamysli se, jestli vubec cache potrebujes. odkud beres stav kosiku? z db nebo ze session? „premature optimization is the root of all evil“ …
Stav kočíku beru jak z db tak z session, z db beru cenu, kvli tomu, že když zákazník nahodí něco do košíku a poté se přihlásí, tak se zkontroluje jeho cena (různé cenové hladiny), počet ks již beru ze session.
Jinak cache potřebuje nastavit storage nebo ne?
new Cache($storage);
https://api.nette.org/…g/Cache.html https://api.nette.org/…Storage.html
Editoval Zuben45 (4. 1. 2016 14:08)
- David Matějka
- Moderator | 6445
Jinak cache potřebuje nastavit storage nebo ne?
ano, storage musis nastavit (vyzadas si IStorage pres DI), ale v pripade cisteni cache pres clear() se nemusis starat o namespace
- David Matějka
- Moderator | 6445
tak uz nenastavis namespace (jen pres derive), ale mrkni pro inspiraci na https://jiripudil.cz/…-integration
- Zax
- Člen | 370
Zrovna nedávno jsem si s tím hrál a dostal jsem se k něčemu podobnému, nicméně jsem to vzal jakoby o úroveň výš – místo toho, abych v konstruktoru vyžadoval storage či factory, tak rovnou vyžaduju Cache a o vyrábění cache se správným namespace se mi stará DI kontejner. Stačí jen vyrobit továrnu, zaregistrovat a vhodně upravit službu cache (nastavit factory a parameters).
Zkusím nastřelit jak zhruba by se to dalo řešit, nicméně copy&paste řešení to opravdu není, nejsem si teď jistý, jestli mám tu definici správně (dokonce si nejsem jistý, jestli to vůbec jde udělat přes config, já to mám řešený jako CompilerExtension). Ale pro inspiraci:
interface ICacheFactory {
/** @return Cache */
function create($namespace = NULL);
}
services:
- ICacheFactory # zaregistrujeme továrnu
nette.cache:
# tahle definice bude pravděpodobně trošku jinak - neotestováno
class: Nette\Caching\Cache
parameters: namespace
create: @ICacheFactory::create($namespace)
A potom v jednotlivých servisách kde se pracuje s Cache:
services:
- SomeService(@Nette\Caching\Cache(namespace))
# nebo
service:
class: SomeService
arguments:
cache: @Nette\Caching\Cache(namespace)
Přijde mi to ještě o chlup hezčí, akorát si s tím člověk musí trochu pohrát ;-)