Nákupní košík: Jak data společně z DB a SESSION do latte?

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

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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.