Nette ajax a session. Změna textu na základě dat v session

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

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

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

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

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

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)