Nakupni kosik pomoci sessions?

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

Ahoj,

uz asi den se snazim prijit na to, jak v nette funguji session.. Nemuzu bohuzel ani na foru ba ani z dokumentace prijit na zakladni vec, jako je napriklad nakupni kosik (na tom se to asi vysvetli nejlepe).

Nedari sem i do sessions (a nasledne to v sablone vypsat) ulozit nejkae pole… kdyz mam napr takoveto pole:

$polozkyNakupnihoKosiku = array(
    1 => array(
        'title' => 'Autodraha',
        'price' => 499
    ),
	2 => array(
        'title' => 'Deka pro deti',
        'price' => 1499
    )
);

jak jej ulozim do session a v nasledne jej v sablone vypisi?

Dekuji za tipy, uz opravdu nevim kde hledat podklady :(

Editoval tomasnikl (30. 8. 2011 20:07)

22
Člen | 1478
+
0
-

a jak to teda do te session ukládáš? Předpokládám, že vícerozměrné pole všichni tady znají, tak zkus další kus kodu :-)

Editoval 22 (30. 8. 2011 20:12)

Filip Procházka
Moderator | 4668
+
0
-

Uděláš si třídu na košík

class ShoppingCart extends Nette\Object
{
	private $cart;

	public function __construct(Nette\Http\Session $session)
	{
		$this->cart = $session->getSection(__CLASS__);
	}

	public function add(Item $item, $count = 1)
	{
		if (isset($this->cart[$item->id])) {
			// kdybych napsal += tak to u tohohle objektu bude AFAIK hazet chybu
			$this->cart[$item->id] = $this->cart[$item->id] + $count;
			return;
		}

		$this->cart[$item->id] = $count;
	}


	public function remove(Item $item)
	{
		unset($this->cart[$item->id]);
	}

	public function getItems()
	{
		return $this->cart->getIterator()->getArrayCopy();
	}
}

a přidáš do configu

services:
	shoppingCart:
		class: ShoppingCart
		arguments: [@session]

pak v presenteru můžeš košík používat, třeba ve zpracování formuláře

$this->context->shoppingCart->add($item, 10);

a nebo číst

$ids = $this->context->shoppingCart->getItems();

Tohle je samozřejmě jenom hloupoučká obálka :) Reálná by toho musela umět daleko více.

V Nette máš službu session, ze které si pomocí metody ->getSection($section) vytáhneš nějaký namespace a do něj si pak jako do pole ukládáš data. Když pak ke stejnému namespace přistoupíš znovu, data by měla být přístupná.

https://doc.nette.org/…ttp/sessions

tomasnikl
Člen | 137
+
0
-

ja jsem si to chtel vyzkouset na komponente, a tak jsem naprasil neco sileneho.

radsi bych to ani neukazoval a cele smazal, protoze to vpodstate vubec nefunguje :) jdu si prostudovat ten "HosipLan"uv priklad, opet budu o neco chytrejsi, dekuji vam

No a zde ta moje prasarna, kdy jsem doufam ze to zacne fungovat (at se pobavite pri uternim veceru) :)..

<?php
/* jen test */
use Nette\Application\UI\Control;

class BasketControl extends Control {

		public function render()
		{

			$session = $this->presenter->getContext()->session;
			$basket = $session->getSection('basket');
			$template = $this->template;
			$template->setFile(dirname(__FILE__) . '/basket.phtml');
			$template->items = $basket;
			$template->render();
		}

		public function handleBuy($id)
		{
			/* jen test */
			$polozkyNakupnihoKosiku = array(
			    1 => array(
			        'title' => 'Autodraha',
			        'price' => 499
			    ),
			    2 => array(
			        'title' => 'Deka pro deti',
			        'price' => 1499
			    )
			);
			$session = $this->presenter->getContext()->session;
			$basket = $session->getSection('basket');
			$basket = $polozkyNakupnihoKosiku;

		}

		public function handleEmptyBasket()
		{
			$session = $this->presenter->getContext()->session;
			$basket = $session->getSection('basket');
			$basket->remove();
		}
}

Editoval tomasnikl (30. 8. 2011 20:36)

tomasnikl
Člen | 137
+
0
-

narazil jsem jeste na jeden problem..

v prezenteru mam tento kod pro pridani do kosiku:

public function handleBuy()
        {
        	$item = $this->context->item;
	        $item->setId($this->params['id']);

	        $this->context->shoppingCart->add($item, 1);
        }

a v latte sablone mam pote toto:

	<a href="{link buy! id=>1}">koupit polozku 1</a>
	<a href="{link buy! id=>2}">koupit polozku 2</a>

kdyz poprve kliknu na koupit polozku 1, tak mi to do kosiku prida polozku 1. Kdyz pote kliknu na koupit polozku 2, tak mi to do kosiku prida polozku 1. Kdyz pote kliknu na koupit polozku 1 tak mi to do kosiku prida polozku 2, kdyz pote kliknu na koupit polozku 1 tak mi to do kosiku prida polozku 1… chova se to tak, ze to prida do kosiku vzdy tu polozku z predchazejiciho kliknuti… (je to jakoby o jedno kliknuti zpozdene)

Nevite kde by mohla byt chyba?

*edit:

tak jsem zjistil, ze problem se vyresi kdyz kod upravim takto, ale i tak mi to nejde moc dohlavy proc se to tak chova:*

public function handleBuy()
        {
        	$item = $this->context->item;
	        $item->setId($this->params['id']);

	        $this->context->shoppingCart->add($item, 1);
		// Pridam redirect po uspesnem pridani polozky do kosiku
		$this->redirect('this');
        }

Editoval tomasnikl (30. 8. 2011 21:27)

Filip Procházka
Moderator | 4668
+
+1
-

to

$item = $this->context->item;
$item->setId($this->params['id']);

se mi moc nelíbí, lepší by bylo mít nějaký repozitář, který ti podle ID tu položku vrátí. Nebo pokud tě ta typová kontrola mate, tak ji můžeš odstranit

public function add($item, $count = 1)

Tvůj problém s tím přesměrováním bude pravděpodobně způsoben neznalostí životního cyklu aplikace a komponent. Někde se ti prostě někam něco předá moc brzo a pak se neprojeví změny.

tomasnikl
Člen | 137
+
0
-

ok diky za info, urcite prostuduju ;)