Celková cena věcí v košíku
- David Veselý
- Člen | 10
Nette Framework 2.0.5
PHP 5.4
Zdravím,
Chtěl bych se zeptat jak nejlépe uložit produkty do košíku a
poté u vybraných produktů sečíst cenu.
Zkusil jsem obsah košíku ukládat do MySql.
Myslel jsem, že když napíšu
$kosik->produkt->sum('cena')
tak mi to sečte ceny v košíku, ale hodí to chybu Call to undefined method Nette\Database\Table\ActiveRow::sum().
- Twista
- Člen | 48
Pokud budes mit produkty v db, pak muzes pouzit neco jako
$conn->table('kosik')->select('SUM(cena) AS cena');
ale podle me je zbytecne to resit pres db, postaci pouziti session :)
edit: psano z hlavy,
jinak musis to volan nad Nette\Database\Table\Selection ne nad ActiveRow :)
Editoval Twista (28. 9. 2012 0:07)
- pidiclovek
- Člen | 91
Popravdě si nedovedu představit rozumný případ, kdy bych to měl dávat do databáze. Je to omezující a nepraktické – jak bys to udělal pro zatím nepřihlášené uživatele? Použij session ;)
- Jan Mikeš
- Člen | 771
Ja pouzivam toto:
foreach($this->order->items as $itemId => $count){
$item = $this->products[$itemId];
$this->totalPrice += $item->UnitPrice * $count;
$this->count += $count;
}
Neni potreba vymyslet nejake slozitosti.
Jeste doplnim typehinty pro lizsi pochopeni
/** @var Nette\Http\SessionSection */
public $order;
/** @var array */
private $products;
/** @var int */
private $count;
Editoval Lexi (28. 9. 2012 1:21)
- jansfabik
- Člen | 193
Můžeš si na to založit model Cart
, který ale nebudeš
ukládat do databáze, ale do session (implementuješ metody
__sleep()
a __wakeup()
pro serializaci).
class Cart extends Object
{
public function __sleep() { ... }
public function __wakeup() { ... }
public function setConnection(Connection $connection) { ... }
public function addProduct($product, $amount) { ... }
public function removeProduct($id) { ... }
public function getTotalPrice() { ... }
}
// vytvoření košíku
if (!isset($session->cart)) {
$session->cart = new Cart;
}
// vytáhnutí ze session
$cart = $session->cart;
$cart->setConnection($connection);
// přidání produktu
$cart->addProduct($id, 2);
// odebrání produktu
$cart->removeProduct($id);
// získání celkové ceny
$sum = $cart->getTotalPrice();
- Rike
- Člen | 19
Dle mého názoru má být v tabulce „položky objednávky“ vždy
uvedena cena, za kterou se finálně produkt kupuje (protože po koupi a ještě
před vyfakturováním se může zboží zdražit, ale zákazníkovi to musíte
prodat za cenu, za jakou to objednal!) a pak už není problém si držet
v tabulce „objednávky“ jejich součet. Stejně by se to mělo při
každém kroku předpočítávat, protože může dojít k vyřazení produktu
z nabídky během nákupu apod.
Onen součet v tabulce „objednávky“ je pak i úsporou při další práci
s objednávkama, protože pak v jejich výpisu nemusíte pracovat neustále se
sčítáním položek nad miliony řádků.
Editoval Rike (28. 9. 2012 10:15)
- David Veselý
- Člen | 10
Všem děkuji za rady vyzkouším to :)
jansfabik, chtěl bych se zeptat co patří místo těch teček ?
- David Veselý
- Člen | 10
Nox napsal(a):
Tam patří kód těch metod :)
@**Rike**: jenže košík není objednávka. Souhlasím, že se má vše finálně uložit (nejen celková cena, ale i jednotlivé ceny, meziceny a jiné údaje), ale to až po objednání
A jakou metodu mám použít pro sečtení cen v košíku ?
- Rike
- Člen | 19
Nox napsal(a):
Tam patří kód těch metod :)
@**Rike**: jenže košík není objednávka. Souhlasím, že se má vše finálně uložit (nejen celková cena, ale i jednotlivé ceny, meziceny a jiné údaje), ale to až po objednání
Já zakládám objednávku jako otevřenou přidáním prvního produktu do košíku. Díky tomu jsem schopen reagovat i na situaci, kdy se neanonymní objednavatel odporoučí a za dva dny se vrátí ji dodělat. Mimochodem, v určitém sektoru je to běžné, dealeři strkají do košíku kontinuálně po několik dnů, aby hromadnou objednávkou ušetřili na dopravě.
Editoval Rike (28. 9. 2012 15:15)
- tatyalien
- Člen | 239
Já používám u nepřihlášeného uživatele ukládání do sessionu a po
přihlášení přeuložení do DB. Takže pokud se odhlásí a přihlásí se
z jiného pc, má furt aktuální košík.
V košíku držím jen productové číslo,kusy a případně poznámu
k productu. Ceny si vytáhnu až na součty, výpis košíku…
- David Veselý
- Člen | 10
jansfabik napsal(a):
David Veselý: Třeba něco takového: https://gist.github.com/3799742
Díky, poslal by jsi mi ještě prosím příklad presenteru ? (popř.
i klidně template)
Děkuji
- Tabetha
- Člen | 140
u nás v projekte sú riešené tieto veci cez DB…tabuľka len na hlavičky objednávok/košíkov a dalšia len na produkty vložené v objednávkach …potom je urobené prepojenie, že pri vložení do košíka sa automaticky prepočítajú ceny atd … je to jednoduché na úpravy aj prehladnosť potom …
- Tomáš Jablonický
- Člen | 115
tatyalien napsal(a):
Já používám u nepřihlášeného uživatele ukládání do sessionu a po přihlášení přeuložení do DB. Takže pokud se odhlásí a přihlásí se z jiného pc, má furt aktuální košík.
V košíku držím jen productové číslo,kusy a případně poznámu k productu. Ceny si vytáhnu až na součty, výpis košíku…
A jak řešíš to, že si nepřihlášený uživatel nahází věci do košíku a pak se přihlásí… co má přednost? Podle mě by měl mít přednost košík z session a košík v db by se v tomto případě měl vynulovat … je to tak? Taky píšu shop a zajímá mě toto řešení.
Jinak k dotazu. V session by se měli ukládat jenom ID produktů a počet. V košíku se pak prostě objeví aktuální ceny a samozřejmě košík není objednávka. Osobně bych si na to napsal nějaké „API“ a rozhodoval bych se v Modelu kam to uložit. Presenter by už pak měl vyuížvat jenom API tedy například metodu pro přidání do košíku addToCart($productId, $count);, a celkovou cenu z košíku by jsi dostal getTotalPrice(); atd. … Model si pak sám určí odkud to vezme..
- pawouk
- Člen | 172
Souhlasím s Nox. Nedávno jsem si něco kupoval na alza.cz rychle jsem potřeboval hdd, přidal jsem ho do košíku a pak chtěl udělat objednávku, když jsem si vzpoměl že nějsem přihlášený, tak jsem se přihlásil a dal odeslat objednávku. Celkem mě zaskočilo že mám v košíku věci za 20.000. Spojil se totiž košík který jsem vytvářel minule s moji momentální objednávkou. Na druhou stranu (rekace na jablon) by se košík určitě neměl mazat. Například ve firmě používáme jedno jméno/heslo na firemní věci v jednom eshopu. Seznam věcí je celkem dlouhý a kdyby ho někdo omylem vymazal tím, že nejdřív vloží zboží a pak se přihlásí je nesmysl. Naopak mě by se líbilo mít možnost více košíků.
- Tomáš Jablonický
- Člen | 115
pawouk napsal(a):
Souhlasím s Nox. Nedávno jsem si něco kupoval na alza.cz rychle jsem potřeboval hdd, přidal jsem ho do košíku a pak chtěl udělat objednávku, když jsem si vzpoměl že nějsem přihlášený, tak jsem se přihlásil a dal odeslat objednávku. Celkem mě zaskočilo že mám v košíku věci za 20.000. Spojil se totiž košík který jsem vytvářel minule s moji momentální objednávkou. Na druhou stranu (rekace na jablon) by se košík určitě neměl mazat. Například ve firmě používáme jedno jméno/heslo na firemní věci v jednom eshopu. Seznam věcí je celkem dlouhý a kdyby ho někdo omylem vymazal tím, že nejdřív vloží zboží a pak se přihlásí je nesmysl. Naopak mě by se líbilo mít možnost více košíků.
Já teď v také píšu košík – zatím funguje přes sessions ale jak píšeš asi bude lepší košík ze sessions spojit po přihlášení s košíkem v db …
Dotaz: po odhlášení by se měl tedy košík asi vyprázdnit, je to tak ( asi logické :D )?
- tatyalien
- Člen | 239
Neřeším moc rozdělování, udělal jsem to takto:
uživatel je nepřihlášený a nahází si věci do košíku a přihlásí
se… tak se jeho obsah zkopíruje do DB. Pokud zadanou položku v košíku už
měl, zvětší se počet kusů. Nic víc nic míň :-D (nechtěl jsem se babrat
s více košíkama, ale asi v případě hodně objednávek by to bylo
uživatelsky lepší… při spojení košíku uživatele nějak informovat, že
si je může spojit / rozhodit… možná u konce objednávky jen mít možnost
co všechno objednat)
Editoval tatyalien (1. 10. 2012 14:29)
- Draffix
- Člen | 146
jablon napsal(a):
Já teď v také píšu košík – zatím funguje přes sessions ale jak píšeš asi bude lepší košík ze sessions spojit po přihlášení s košíkem v db …Dotaz: po odhlášení by se měl tedy košík asi vyprázdnit, je to tak ( asi logické :D )?
Tak nastává situace úplně od začátku – jsi nepřihlášený a můžeš vkládat zboží do košíku které se pak po přihlášení překopíruje do db, takže ano vyprázdnit (nebo by jsi tam chtěl mít zase to zboží které si tam měl předtím než si se přihlásil?) :-)