Vytvoření košíku pro eshop

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

Zdravím snažím se vytvořit košík pro eshop. Vzhledem k tomu, že se session dělám poprvé tak se s ním trochu peru. Vytvořil jsem si tuto funkci pro přidávání id zboží do session:

public function renderAddToCart($id = 0){
    $id = $this->getParam('id');
    $name = $this->getParam('name');
    $container = $this->context;
    $session = $container->session;
    $section = $session->getSection('cart');
    $section->setExpiration(0, $name);
    $section->$name = $id;
    $this->redirect(':Front:Cart:');
}

to mi nějak funguje problém je v tom, když chci zobrazit zboží v košíku

public function renderDefault(){
    $container = $this->context;
    $session = $container->session;
    $section = $session->getSection('cart');
    foreach ($section as $key => $val) {
    echo "$key = $val";
    }
}

Takhle mi to správně zobrazuje id i názvy těch jednotlivých sekcí, ale už nevím to jak dostat do šablony to správné zboží.

Zřejmě to bude něco takového

$this->template->products = $this->cartRepository->findProducts()->where(array('id' => $val));

ale nevím jak to správně sestavit tak, aby to fungovalo.

Díky za pomoc.

pawouk
Člen | 172
+
0
-

No takhle by si ale dělal query pro každe zboží jednotlivě, lepší je určitě udělat jednu query a získat veškeré zboží:

$this->template->products = $this->cartRepository->findProducts()->where('id IN ?', '('.implode(', ', $section).')');

pak už jen v šabloně:

{foreach $products as $product}
	{$product->name}<br />
{/foreach}

Pozn: předpokládám že ($this->cartRepository->findProducts() instanceof \Nette\Database\Selection)

Editoval pawouk (6. 5. 2013 11:21)

quiced
Člen | 85
+
0
-

Díky za pomoc, ale stále to nejede. Nevím zda je vůbec dobře způsob ukládání do session, konkrétně myslím to, že se mi vytvoří sekce s názve produktu a tam se vloží id toho daného produktu.

Co mi hlavně hlava nebere je jestli ten kód co jsi napsal tedy

$this->template->products = $this->cartRepository->findProducts()->where('id IN ?', '('.implode(', ', $section).')');

mám vložit do toho foreache ?

foreach ($section as $key => $val)

Ještě aby to bylo komplet tak přidávám kód přes který tahám data z tabulky:

public function getProduct(){
    return $this->connection->table('products');
}

public function findProduct(){
    return $this->getProduct();
}

Ještě jednou díky za pomoc

Petr Hudík
Člen | 49
+
0
-

Ahoj, velice by pomohlo, kdybys napsal, proč to ‚nejde‘, co nefunguje, nebo jaká chybová zpráva se zobrazí.

Když jsem koukal na Tvůj kód, myslím, že důležité je, co máš v proměnné $name, možná bych zvážil ji tam vůbec dávat, $id by mělo bohatě stačit. Navrhuji kód pro uložení upravit následujícím způsobem:

	public function renderAddToCart($id)
	{
		$section = $this->session->getSection('cart');
		$section->setExpiration(0, $id);
		$section->$id = true; // nebo přidat počet kusů
		$this->redirect('default');
	}

a renderDefault by mohl vypadat takto:

public function renderDefault()
	{
		$section = $this->session->getSection('cart');

		$in = array();
		foreach ($section as $key => $val) {
			$in[] = $key;
		}
		$this->template->products = $this->cartRepository->findProducts()->where('id', $in);
	}

Odzkoušeno, mělo by to fungovat, pokud ne, napiš prosím jaká chyba se zobrazí.

Myslím, že renderAddToChart by bylo vhodnější přejmenovat na actionAddToChart viz (životní cyklus presenteru).

Editoval Petr Hudík (6. 5. 2013 14:23)

David Matějka
Moderator | 6445
+
0
-

a jeste poznamka: pridavani do kosiku by asi bylo lepsi ne pres akci, ale pres signal

a nejlepsi by bylo tuhle logiku presunout z presenteru do modelu, vytvorit si sluzbu, ktera se bude starat o spravu kosiku s metodama pro pridani produktu, odebrani produktu, vraceni seznamu produktu v kosiku atd :)

quiced
Člen | 85
+
0
-

Díky moc za pomoc řešení od Petra Hudíka funguje perfektně ještě jsem tam přidal to množství jak píšeš protože jsem na to úplně zapomněl.

Ještě jednou díky za pomoc.