Door
Niels K
op 03-02-2012 19:25
gewijzigd op 09-02-2012 14:54
2.556 views
Beste PHPers,
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?
Nee bij mij is order en order_product de daadwerkelijke bestelling.
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 :)
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:
<?php
$product = $this->_em->getRepository('BestBuy\Entity\Product')->findOneByName('aardbei');
$item = new BestBuy\Entity\ShoppingcartItem();
$item->product = $product;
$item->user = Zend_Auth::getInstance()->getIdentity();
// Toevoegen item
public function addItem(OrderItem $orderItem) {}
}
?>
Een OrderItem genereer ik dan op basis van een product:
<?php
class OrderItem extends Zend_Db_Table_Row_Abstract {
// Genereren op basis van een product
public function createFromProduct(Product $product) {}
}
?>
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:
<?php
class Shoppingcart {
protected $_cart = array();
public function addItem() {}
public function deleteItem() {}
public function getItems() {}
public function getTotal() {}
public function save() {
// Opslaan in database
}
}
?>
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.
Ja dat snap ik. Wat ik me wel nog even afvraag is. Jij hebt op je ShoppingCart class de methode getTotalAmount. Die hoort toch in het Order object thuis? Een totaal bedrag is toch over een Order niet over een Winkelwagen?