Celková cena věcí v košíku

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

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

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

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

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

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

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

Všem děkuji za rady vyzkouším to :)
jansfabik, chtěl bych se zeptat co patří místo těch teček ?

Nox
Člen | 378
+
0
-

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í

Editoval Nox (28. 9. 2012 13:11)

David Veselý
Člen | 10
+
0
-

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

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)

jansfabik
Člen | 193
+
0
-

David Veselý: Třeba něco takového: https://gist.github.com/3799742

tatyalien
Člen | 239
+
0
-

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

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

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

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..

Nox
Člen | 378
+
0
-

Uživatelsky nejideálněji IMHO zobrazit oboje s tím, že uživatel na to bude upozorněný hláškou a příslušné položky budou v košíku odlišeny

pawouk
Člen | 172
+
0
-

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

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

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

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?) :-)

pawouk
Člen | 172
+
0
-

jablon napsal(a):
Dotaz: po odhlášení by se měl tedy košík asi vyprázdnit, je to tak ( asi logické :D )?

Ano, to rozhodně.

Editoval pawouk (2. 10. 2012 23:50)