Práce se sessins, přístup k nim
- wicked
- Člen | 290
Zdravím,
řeším přidání položky do košíku pomocí sessions …
Přidání a uložení v sessions mě funguje, ale už nevím, jak k nim přistupovat v šablone při výpisu.
Presenter pridaní do sessions
// Nacteme info o fotce
$foto = $this->eshop->findAll()->where("id", $id)->fetch();
foreach ($foto->related("soubory.eshop_id") as $img) {
$imgc = $img->cesta;
}
// Nastavime hodnoty sessions
$session = $this->getSession('fotkyKosik');
$session->polozkyKosikFotky[] = array(
"fotka" => $id,
"cesta" => $imgc,
"nazev" => $foto->nazev,
"rozmer" => $values->size,
"ks" => $values->ks,
"cena" => $foto->cena
);
Base render:
// Nastaveni kosiku
$section = $this->session->getSection('fotkyKosik');
$this->template->kosik = $section;
A v šabloně je projdu foreach
{foreach $kosik as $k => $polozky}{dump $polozky}{/foreach}
Ale nějak mě už nejde vypsání podrobnosti o fotkach v sessions, respektivě když provedu
{foreach $kosik as $k => $polozky}{dump $polozky->nazev}{/foreach}
Tak dostanu
Trying to get property of non-object
Co přehlížím? Samozdřejmně jsem dokumentaci četl, ale už prostě nevím …
Děkuji za ranní nakopnutí
- David Kudera
- Člen | 455
Ukládáš si to tam jako pole, ale přistupuješ k tomu jako k objektu. Zkus to upravit takhle:
{dump $polozky[nazev]}
OT: Název proměnné polozky je trochu divný ne? Jde přece jen o jednu položku ;-)
- wicked
- Člen | 290
David Kudera napsal(a):
Ukládáš si to tam jako pole, ale přistupuješ k tomu jako k objektu. Zkus to upravit takhle:
{dump $polozky[nazev]}
OT: Název proměnné polozky je trochu divný ne? Jde přece jen o jednu položku ;-)
Děkuji za radu, ale když to upravím, dostanu zase
Undefined index: nazev
OT: jj mám to zatím pojmenované, protoze potrebuji vyresit tu funkčnost …
- wicked
- Člen | 290
Už jsem na to přišel …
Jelikož v presenteru mam
$session = $this->getSession('fotkyKosik');
$session->polozkyKosikFotky[] = array(
"fotka" => $id,
"cesta" => $imgc,
"nazev" => $foto->nazev,
"rozmer" => $values->size,
"ks" => $values->ks,
"cena" => $foto->cena
);
V renderu jsem přidal
$section = $this->session->getSection('fotkyKosik')->polozkyKosikFotky;
$this->template->kosik = $section;
a potom už funguje ten $polozky[nazev]
- wicked
- Člen | 290
Chci se zeptat, jak je možné provést update daného záznamu v sessions?
Sessions pracuji viz výše, ale funguje něco jako
$this->sessions->update()->where()
Jde mi o to, ze mam v sessions ulozeny pocet polozek, ale pomoci handleUp a handleDown chci s kusama hejbat …
Děkuji za radu
- wicked
- Člen | 290
Když provedu
// Zvyseni poctu ks
public function handleUp($id) {
$session = $this->getSession('fotkyKosik');
$pocet = $session->polozkyKosikFotky;
dump($pocet);
}
Výsledek je
array (1)
0 => array (6)
fotka => "2"
cesta => "/upload/2014-09-12-09-38-54.png" (31)
nazev => "Pokus prvního nahrání :-)" (28)
rozmer => "10x10" (5)
ks => "1"
cena => "125" (3)
Ale kdyz udělám jak
$pocet = $session->polozkyKosikFotky->ks; tak nemám žádný objekt a
když¨
$pocet = $session->polozkyKosikFotky[ks]; tak nemzna index ks …
Edit: takze to musim prochazet foreach?
Editoval wicked (16. 9. 2014 18:05)
- wicked
- Člen | 290
// Zvyseni poctu ks
public function handleUp($id) {
$session = $this->getSession('fotkyKosik');
$pocet = $session->polozkyKosikFotky['0']['ks'];
dump($pocet);
}
ted už dostanu to číslo které je spravně, ale jde mi o to, že kdyz budu mít více položek, jak tedy zjistím, zda je to 0, 1 nebo 99?
- David Matějka
- Moderator | 6445
mozna, ze se opakuju, ale
tak pri vkladani do session pouzij jako klic ID
- wicked
- Člen | 290
matej21 napsal(a):
@wicked tak pri vkladani do session pouzij jako klic ID
Asi mě budeš muset víc nakopnout :-( Z dokumentace vůbec nejsem moudřejší …
myslíš upravit toto?
$session = $this->getSession('fotkyKosik');
$session->polozkyKosikFotky[] = array(
"fotka" => $id,
"cesta" => $imgc,
"nazev" => $foto->nazev,
"rozmer" => $values->size,
"ks" => $values->ks,
"cena" => $foto->cena
);
takto?
$session = $this->getSession('fotkyKosik');
$session->polozkyKosikFotky[$id] = array(
"fotka" => $id,
"cesta" => $imgc,
"nazev" => $foto->nazev,
"rozmer" => $values->size,
"ks" => $values->ks,
"cena" => $foto->cena
);
A potom
// Zvyseni poctu ks
public function handleUp($id) {
$session = $this->getSession('fotkyKosik');
$pocet = $session->polozkyKosikFotky[$id]['ks'];
dump($pocet);
}
Děkuji za trpělivost
Psal dřív než zkusil, ok funguje :-)
Editoval wicked (16. 9. 2014 18:20)
- wicked
- Člen | 290
Ještě prosím poslední dotaz … na smazaní položky dle dokumentace slouží unset
ale když mám
// smazani polozky
public function handleDelete($id) {
$session = $this->getSession('fotkyKosik');
$zaznam = $session->polozkyKosikFotky;
unset($zaznam[$id]);
$this->redirect('this');
}
Nic to neprovede …
pro smazani komplet sekce pouzivam remove() to je ok, ale pro takto jeden zaznam?
- David Matějka
- Moderator | 6445
zkus primo
unset($session->polozkyKosikFotky[$id]);
tim $zaznam = ...
si to pole nakopiroval, tudiz to neovlivnilo
pole v session
- wicked
- Člen | 290
Ještě blbá otázka …
Data vypisuji takto
<tbody>
<tr n:foreach="$kosik->polozkyKosikFotky as $k => $polozky">
<td>{$iterator->counter}.</td>
<td><a n:href="Stranka:foto, $polozky[fotka]">{$polozky[nazev]}</a></td>
<td align="center">{$polozky[ks]}</td>
<td align="center">{$polozky[cena]},-Kč</td>
<td align="center">{$cena_celkem = $polozky[cena]*$polozky[ks]},-Kč</td>
<td align="center" title="Zvýšit počet KS"><a n:href="up!, $polozky[fotka]" title="Zvýšit počet KS"><i class="fa fa-plus"></i></a></td>
<td align="center" title="Snížiz počet KS"><a n:href="down!, $polozky[fotka]" title="Snížiz počet KS"><i class="fa fa-minus"></i></a></td>
<td align="center" title="Odebrat fotku"><a n:href="delete!, $polozky[fotka]" title="Odebrat fotku"><i class="fa fa-close"></i></a></td>
</tr>
</tbody>
Ale jak udělám celkovou cenu? Přímo v šabloně? Potřebuji sečíst všechny ceny v sessions a vypsat je …
Děkuji
EDIT: Předpokladám že pomocí foreach … ale nějak mě uniká celková implementace …
Editoval wicked (17. 9. 2014 21:31)
- Lkopo
- Člen | 65
Neviem, či latte podporuje si vytváranie premenných, ale ak nie tak asi cez filter. V šablóne by si mal:
{$kosik->polozkyKosikFotky|total_price}
a filter by mohol vyzerať nejak takto:
$latte->addFilter('total_price', function (array $a) {
foreach($a as $v) { $t += $v['cena']*$v['ks']; } return $t;
});
Čerpal som odtiaľ: https://latte.nette.org/en/#…
UPDATE
Tak sa dajú aj v Latte deklarovať, len neviem, či je možné pripisovať predchádzajúce hodnoty. Skús ešte v foreach cykle
{var $spolu += $polozky[cena]*$polozky[ks]}
A niekde inde potom
{$spolu}
Nemám to teraz ako otestovať, takže ti bohužiaľ neporadím, či toto je možné.
Zasa s filterom to môžeš využiť kdekoľvek inde a nemusíš si stále vypisovať premenné.
Note: je to rada od začiatočníka s Nette, možno je lepší spôsob, tak si kľudne počkaj aj na iných :)
Editoval Lkopo (17. 9. 2014 22:50)
- wicked
- Člen | 290
abc napsal(a):
Já jsem tedy taky začátečník, ale toto se přeci dá vyřešit jednoduše v rámci toho cyklu..
{var celkem = 0} <tr n:foreach="$kosik->polozkyKosikFotky as $k => $polozky"> {var celkem += ($polozky[cena]*$polozky[ks])} </tr> {celkem} //tady mas celkovou sumu
Děkuji :-)