Nákupní košík: Jak data společně z DB a SESSION do latte?
- Petr Havlíček
- Člen | 4
Zdravím,
řeším nákupní košík. Určitě to řešilo již mnoho lidí dříve, ale
zatím nemohu najít řešení. Mám nákupní košík vyřešen přes SESSION,
lze do něj vkládat i mazat, v SESSION se ukládá pouze
‚id_zbozi‘=‚mnozstvi‘ <?php $cart->$id = $count ?> .
Následně dle SESSION ID vypíšu z DB všechny údaje a mohu je dát do latte
šablony.
Uniká mi ale jedna věc: Jak do latte dostanu ‚mnozstvi_zbozi‘, které je uloženo v SESSION? Jak tedy sloučit data v presenteru ze SESSION a DB a vypsat je dohromady v latte nejlépe pomocí foreach?
Cart:default presenter
<?php
public function renderDefault()
{
$session = $this->session;
$cart = $session->getSection('cart');
$params = array();
$counts = array();
foreach($cart as $key => $value){
array_push( $params, $key );
array_push( $counts, $value );
$this->template->counts = $counts;
if(!isset($condition)){
$condition = 'id = ?';
}
else
{
$condition = $condition . ' OR id = ?';
}
}
$conditions = "'".$condition."'";
$this->template->dbs = $this->database->table('catalogue')->where($condition, $params);
}
?>
Cart:default latte
<table>
<th>id</th><th>polozka</th><th>cena</th><th>pocet</th>
{foreach $dbs as $row}
<tr>
<td>{$row->id}</td><td>{$row->item}</td><td>{$row->price}</td><td>Jak sem COUNT?</td>
</tr>
{/foreach}
</table>
- norbe
- Backer | 405
Co to zkusit takhle?
public function renderDefault()
{
$session = $this->session;
$cart = $session->getSection('cart');
// vážně proměnná s názvem dbs? proč ne třeba products?
$this->template->dbs = $this->database->table('catalogue')->where('id IN', array_keys($cart));
$this->template->productsCounts = $cart;
}
<table>
<th>id</th><th>polozka</th><th>cena</th><th>pocet</th>
{foreach $dbs as $row}
<tr>
<td>{$row->id}</td><td>{$row->item}</td><td>{$row->price}</td><td>{$productsCounts[$row->id]}</td>
</tr>
{/foreach}
</table>
- David Matějka
- Moderator | 6445
kod by mel jit zjednodusit asi takto:
public function renderDefault()
{
$cart = iterator_to_array($this->getSession('cart'));
$this->template->counts = $cart;
$this->template->dbs = $this->database->table('catalogue')->where('id', array_keys($cart));
}
pro pocet si v sablone sahnes pres
{$counts[$row->id]}
EDIT: pozde, ale o chybu mene :)) array_keys neprijme iterator
Editoval matej21 (29. 7. 2013 22:24)
- Petr Havlíček
- Člen | 4
matej21 napsal(a):
kod by mel jit zjednodusit asi takto:
public function renderDefault() { $cart = iterator_to_array($this->getSession('cart')); $this->template->counts = $cart; $this->template->dbs = $this->database->table('catalogue')->where('id', array_keys($cart)); }
pro pocet si v sablone sahnes pres
{$counts[$row->id]}
EDIT: pozde, ale o chybu mene :)) array_keys neprijme iterator
Jak jednoduché a jasné :-) Díky.
Napadá tě jak jednoduše řadit zboží v košíku dle pořadí jak bylo
vloženo? Nyní vypisuje ASC dle ID zboží v SESSION.
- James_Scott
- Člen | 55
Napadá mě buď vytvořit další sloupec sloužící k číslování pořadí, nebo v něm uchovávat timestamp a podle něj pak řadit.
- Draffix
- Člen | 146
Pokud používáš databázi pouze pro zjištění detailu položky podle ID uloženého v session, tak mě žádné řešení nenapadá, protože jsou pouze (nadsázka) dvě místa kam můžeš informaci o řazení/čase uložit – v databázi nebo v session. V databázi, resp. v tabulce s položkami, to není možné, protože zde se nacházejí pouze detailní informace o položce. Do session to také nemůžeš dávat, protože to nakonec vypisuješ pouze z databáze. Věřím, že by se našlo řešení, ale já osobně to řeším opačným způsobem – zjistím si ID položky která byla přidána do košíku, vytáhnu si o ní informace, které pak uložím do session jako dvourozměrné pole – ID položky ⇒ parametry z databáze. Pak už jenom procházím pole v řadě jak jsou postupně uloženy. To je ale IMHO přístup.