Nette ajax a session. Změna textu na základě dat v session
- Re4DeR
- Člen | 71
Ahoj, mám nákupní košík v session. Pokud je zboží v košíku tak chci upravit text „přidat do košíku“ na text „zbozi uz mate v kosiku“.
Bez ajaxu to vse funguje dobre. s ajaxem ne – jakoby si stránka nenacetla data v session. pouzivam nette.ajax.
CategoryPresenter.php ve kterém předávám šabloně produkty a košík
public function renderDefault($id){
$cart = $this->getSession('cart');
$this->template->cart = $cart->cart;
$this->template->categoryID = $id;
$this->template->products = $this->getProductsByCategory($id);
}
default.latte pro categorypresenter.php
{block content}
<div class="row" n:snippet="products">
{foreach $products as $product}
{var $id = $product['product']['id'] }
<div class="col-md-15 product {if $iterator->last}last{/if}"
n:snippet="product-$id">
{ifset $cart[$categoryID][$product['product']['id']]}
<span class="btn disabled btn-success addTo">
Již máte v seznamu
</span>
{else}
<a class="ajax btn btn-success addTo"
n:href="addToList! $product['product']['id'], $categoryID ">Přidat
do seznamu</a>
{/ifset}
</div>
{/foreach}
</div>
{/block}
a a addTolist! vypada takto:
public function handleAddToList($id, $category_id){
$cart = $this->getSession('cart');
$product["id" = $id;
$product["name"] = "TEST" ;
$cart->cart[$category_id][$id] = $product;
if ($this->isAjax()){
$this->redrawControl('cart'); //prekresli kosik - to funguje parádne
//a ted nevim jak revalidovat ten napis
//$this->redrawControl('products'); //produkty komplet zmizi
//$this->redrawControl('product-'.$id); //nic se nezmeni.
} else{
$this->redirect('Category:', $category_id);
}
}
- Felix
- Nette Core | 1247
$this->redrawControl(‚products‘); //produkty komplet zmizi
Ze je snippet prazdnej?
Imho to je na prvni pohled vsechno oukey, zkus zmenit renderDefault za actionDefault. A ten snippet cart je kde presne?
$this->redrawControl(‚product-‘.$id); //nic se nezmeni.
Tohle takhle nefunguje.
- neznamy_uzivatel
- Člen | 115
Mel bych k tomu jen poznamku:
Ukladat kosik „jen“ do session neni uplne nejlepsi, nedavno jsem to na
jednom shopu resil.
Tam muze dojit ke spouste zbytecnych problemu..
Uzivatel je jiz registrovany a jako prihlaseny si naplni zbozi do kosiku:
Pak vznika problem, ze po manualnim odhlaseni (nebo vyprseni session) ten
kosik zmizi.
Tak stejne pro neregistrovaneho – naplni kosik, chce se prihlasit treba k registraci z minuleho nakupu a behem prihlaseni session taktez zmizi.
Celkove nemoznost parovani kosiku s konkretnim uzivatelem bez navaznosti na prohlizec/sessid je docela velka nevyhoda.
Takze kosik ukladam do db a pri prvni prilezitosti ho sparuju s nejakym
user-id.
Navic abych kvuli kosiku nemusel prodluzovat platnost prihlaseni/session, tak id
docasne ID kosiku (pro neprihlasene) predavam v samostatne cookie, ktera ma
platnost podstatne delsi, nez aktualni session. A jakmile se uzivatel prihlasi,
kosik se sparuje s jeho userid a ma platnost neomezenou.
Chapu, ze jsem ti moc neporadil, jen upozornuju na „pruser“, do ktereho jsem se sam dostal :)
- Re4DeR
- Člen | 71
@neznamy_uzivatel: jasan to si uvedomuji, ale tohle není přímo eshop a neprobiha tu zatim registrace. takze ukladat kosik do dtb je zbytecny. jinak bych to udelal taky. hlavne data co lidi davaj do kosiku muze byt zajimavy info.
@Felix: jo – snippet je prázdnej. a nedocházi mi proč. pokud zmeni render na action tak se nic nezmeni.
zkoušel jsem i znova naplnit proměnou products, ale žádná zmena.
if ($this->isAjax()){
$this->redrawControl('cart');
$this->redrawControl('products');
$this->template->products = $this->getProductsByCategory($category_id);
snippet cart je v @layout.latte do kterého je vložen block content a v něm je snippet products
Editoval Re4DeR (25. 9. 2014 11:01)
- Re4DeR
- Člen | 71
Zjistil jsem, že to funguje pokud $id a $category_id jsou stejny. Divny.
a z toho jsem dospel k teto funkcni uprave:
public function handleAddToList($product_id, $category_id){
$cart = $this->getSession('cart');
$product["id" = $product_id;
$product["name"] = "TEST" ;
$cart->cart[$category_id][$id] = $product_id;
...
}
Editoval Re4DeR (28. 9. 2014 20:14)