Problém so sessions – prepisovanie, nakupny kosik

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

Ahojte,

Rozhodol som sa naprogramovať si nakupný košík v nette, používam quickstart blog aplikáciu akurát som si to rozšíril o produkty. Zasekol som sa pri nasledovnom kóde

Do tejto funkcie si posielam formulár v ktorom si vlastne môžem meniť množstvo produktov v nákupnom košíku, keď chcem kúpiť jeden produkt napr. a 2ks.

	private function updateCart($form)
	{
		$session = $this->getSession('cart')->items;
		foreach($form->values as $key => $quantity) {
			$key = explode("_", $key);
			$key = $key[1];
			echo "Id produktu : ".$key;
			echo "Prev:".$session[$key]['quantity'];
			unset($session[$key]['quantity']);
			$session[$key]['quantity'] = (int)$quantity;
			echo "Now:".$session[$key]['quantity'];
			die();
		}
}

Output je vlastne nasledovný (tvári sa že všetko funguje)

Id produktu : 1
Prev:4
Now:12

Tracy ukazuje

cart => array (3)
items => array (2)
1 => array (2)
id => 1
quantity => 4
2 => array (2)
id => 2
quantity => 1

Už podľa tracy je videť že mi to session naozaj neprepísalo aj keď pri kontrolonom echu sa to tvári že ju naozaj prepísalo, skúšal som už naozaj všetko a možno je tam len maličká chyba ktorú už nevidím tak skúšam požiadať o pomoc ešte Vás.

Editoval johnnie (23. 8. 2015 21:31)

duke
Člen | 650
+
+1
-

Problém je nejspíš už v řádku:

$session = $this->getSession('cart')->items;

Nyní je totiž v proměnné $session kopie položky items, nikoli sama položka items. Proto jakákoli změna proměnné nemá na session vliv.

Řešením je buď použít přiřazení reference:

$session =& $this->getSession('cart')->items;

… nebo přiřazovat přímo položce session:

$this->getSession('cart')->items[$key]['quantity'] = (int) $quantity;
johnnie
Člen | 54
+
0
-

Funguje uplne podla predstavy, dakujem velmi pekne za pomoc.