Vytvoření košíku pro eshop
- quiced
- Člen | 85
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
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
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
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
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 :)