[discussie] Orderproces
Velen van jullie weten dat ik (als werk) vooral webshops realiseer. Nu weet ik zeker dat diversen mensen hier op het forum wel eens een webshop heeft gerealiseerd of dit misschien net als mij dagelijks doet.
Nu ben ik heel benieuwd hoe mensen zo'n proces in omzetten naar Object Georiënteerd programmeren.
Even geleden heeft onze vriend Bram Boos een topic gestart over het realiseren van een winkelwagentje en daarin heb ik mijn visie uitgelegd.
Ik zei daar dat ik zelf geen 'Winkelwagen' object heb, waarop Karl karl reageerde dat hij het juist wel zou doen.
Wat is jullie mening omtrent de denkwijze van een order proces in een webshop?
Ik ben benieuwd!
Niels Kieviet
Gewijzigd op 09/02/2012 14:54:03 door Niels K
Heeft niemand hier een mening over?
Waarom niet gebruiken van een shoppingcart_item entity/model? Dat lijkt me voldoende?
Schrijf eens uit? Ik denk zelf in een Order / Order item model. Shoppingcart model heb ik dus niet.
Ik heb gewoon een shoppingcartitem tabel waar ook een kolom sessionid in zit. Op basis daarvan 'onthoud' ik wat er in de winkelwagen zit. En elke 4 uur draai ik een cronjob die alle winkelwagen items ouder dan 2 dagen weg gooit zodat de tabel niet te groot wordt. En de tabel heeft als engine memory voor performance :)
mijn 'WinkelWagen' object is gewoon een soort van sessiemanager waar ik heel makkelijk producten en aantallen kan beheren.
Een (potentiële) klant komt op een webshop. Ik doe het dan als volgt:
- Ik maak een nieuw klant object aan wat ik in de sessie gooi.
- Ik maak een nieuw order object aan, en append de klant aan de order.
Wanneer er een artikel in het winkelwagentje wordt gezet append ik een item aan het order object.
Zijn jullie het daar mee eens? Vinden jullie dat een mooie denkwijze?
Quote:
Nee bij mij is order en order_product de daadwerkelijke bestelling.
Dat vind ik ansich een mooie beredenering. Maar append jij dan een winkelwagen object aan een order?
Gewijzigd op 09/02/2012 14:53:30 door Niels K
Met Doctrine zou je bijvoorbeeld voor het winkelwagen deel 2 entities hebben. ShoppingcartItem en Product. Dit zijn dus gewoon op de achtergrond database tabellen en de entities zijn je models. Er is een oneToOne relatie van ShoppingcartItem naar Product.
Je kunt dan producten aan de winkelwagen toevoegen:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$product = $this->_em->getRepository('BestBuy\Entity\Product')->findOneByName('aardbei');
$item = new BestBuy\Entity\ShoppingcartItem();
$item->product = $product;
$item->user = Zend_Auth::getInstance()->getIdentity();
$this->_em->persist($item);
?>
$product = $this->_em->getRepository('BestBuy\Entity\Product')->findOneByName('aardbei');
$item = new BestBuy\Entity\ShoppingcartItem();
$item->product = $product;
$item->user = Zend_Auth::getInstance()->getIdentity();
$this->_em->persist($item);
?>
Winkelwagen items opvragen:
Code (php)
1
2
3
2
3
<?php
$shoppingcartItems = $this->_em->getRepository('BestBuy\Entity\ShoppingcartItem')->findByUser(Zend_Auth::getInstance()->getIdentity());
?>
$shoppingcartItems = $this->_em->getRepository('BestBuy\Entity\ShoppingcartItem')->findByUser(Zend_Auth::getInstance()->getIdentity());
?>
In je entities gooi je dus logic voor validatie etc. In de ShoppingcartItem repository zet je functies als:
Code (php)
1
2
3
2
3
<?php
$shoppingCartTotal = $this->_em->getRepository('BestBuy\Entity\ShoppingcartItem')->getTotalAmount(Zend_Auth::getInstance()->getIdentity());
?>
$shoppingCartTotal = $this->_em->getRepository('BestBuy\Entity\ShoppingcartItem')->getTotalAmount(Zend_Auth::getInstance()->getIdentity());
?>
In de repository class doe je een query:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
public function getTotalAmount(BestBuy\Entity\User $user) {
$query = $this->_em->createQueryBuilder()
->select('SUM(si.amount * p.price)')
->from('BestBuy\Entity\ShoppingcartItem','si')
->join('si.product', 'p')
->where('si.user = :user')
->setParameter('user', $user)
->getQuery();
return $query->getOneOrNullResult();
}
?>
public function getTotalAmount(BestBuy\Entity\User $user) {
$query = $this->_em->createQueryBuilder()
->select('SUM(si.amount * p.price)')
->from('BestBuy\Entity\ShoppingcartItem','si')
->join('si.product', 'p')
->where('si.user = :user')
->setParameter('user', $user)
->getQuery();
return $query->getOneOrNullResult();
}
?>
Etc..
Waarom zou ik een 'winkelwagen' object extenden aan een order?
Gewijzigd op 09/02/2012 15:09:13 door kees Schepers
Code (php)
Een OrderItem genereer ik dan op basis van een product:
Code (php)
In de order class heb ik wat functies voor het berekenen van verzendkosten etc.
Heeft er iemand een andere visie? Zoja, waarom?
Nog even een toevoeging:
Vroeger deed ik het (altijd) zo:
Code (php)
Nu in dit zo zie, denk ik dat een shoppingcart object eigenlijk wel netjes is. Je kan daar heel gemakkelijk een winkelwagen opslaan zonder dat er een order is voltooid.
Wanneer een klant het order proces binnengaat kan je een order object aanmaken en de items uit de winkelwagen aan de order toevoegen.
Gewijzigd op 09/02/2012 15:45:08 door Niels K
Ik ben het wat dat betreft eens met je. Maar eigenlijk is het object Shoppingcart gewoon een Zend_Db_Table object van de tabel Shoppingcart :)
Gewijzigd op 09/02/2012 16:05:58 door Niels K
Waarom niet over een winkelwagen? Ik wil in mijn winkelwagen ook wel graag zien hoeveel ik ga spenderen in totaal :p
Ah, je hebt gelijk. Niet bij nagedacht. Ik vraag dat altijd aan het Order object :-) Ik zal eens kijken of ik iets moois kan fabriceren en wat kan posten.