Nakupni kosik pomoci sessions?
- tomasnikl
- Člen | 137
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)
- Filip Procházka
- Moderator | 4668
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á.
- tomasnikl
- Člen | 137
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
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
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.