Přístup k cache ze template do Presenteru

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

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

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

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

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

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

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

Zuben45
Člen | 268
+
0
-

David Matějka napsal(a):

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

Aha,mockrát děkuji :)

CZechBoY
Člen | 3608
+
0
-

btw je lepší si vyžádat Cache nebo IStorage?

David Matějka
Moderator | 6445
+
0
-

Sluzba Cache ani neexistuje (iirc byla, ale pak byla odebrana)..

CZechBoY
Člen | 3608
+
0
-

A kdyz si ji zaregistruju do configu?

David Matějka
Moderator | 6445
+
0
-

tak uz nenastavis namespace (jen pres derive), ale mrkni pro inspiraci na https://jiripudil.cz/…-integration

Zax
Člen | 370
+
+1
-

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 ;-)

Zuben45
Člen | 268
+
0
-

Děkuji ještě jednout všem za pomoc, nakonec jsem to pořešil přes session košíku, který zachovává položky v košíku, a už si jen zavolávám potřebné informace [ids,ks,celkem]. Myslím že je to docela dobré řešení, co vy na to ? :)