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?

Ik ben benieuwd!

Niels Kieviet
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.
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 :)
mijn 'WinkelWagen' object is gewoon een soort van sessiemanager waar ik heel makkelijk producten en aantallen kan beheren.
Maar ik denk dan, is een winkelwagen object wel nodig? Ik denk als volgt:

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?


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?

Jullie denken echt te lastig :p

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();

$this->_em->persist($item);
?>

Winkelwagen items opvragen:
<?php
$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:

<?php
$shoppingCartTotal = $this->_em->getRepository('BestBuy\Entity\ShoppingcartItem')->getTotalAmount(Zend_Auth::getInstance()->getIdentity());
?>

In de repository class doe je een query:

<?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();
}
?>

Etc..

Waarom zou ik een 'winkelwagen' object extenden aan een order?
Ok duidelijk. Zelf doe ik het als volgt:

<?php

class Order extends Zend_Db_Table_Row_Abstract {

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

Reageren