Versio

[discussie] Orderproces

Overzicht Reageren

Niels Kieviet
Beheerder

Niels Kieviet

03/02/2012 19:25:42
Quote Anchor link
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
Gewijzigd op 09/02/2012 14:54:03 door Niels Kieviet
 
PHP hulp

PHP hulp

24/05/2012 09:46:45
Gesponsorde koppelingen:
 
Niels Kieviet
Beheerder

Niels Kieviet

09/02/2012 14:30:58
Quote Anchor link
Heeft niemand hier een mening over?
 
Kees Schepers
Moderator

kees Schepers

09/02/2012 14:33:15
Quote Anchor link
Waarom niet gebruiken van een shoppingcart_item entity/model? Dat lijkt me voldoende?
 
Niels Kieviet
Beheerder

Niels Kieviet

09/02/2012 14:37:09
Quote Anchor link
Schrijf eens uit? Ik denk zelf in een Order / Order item model. Shoppingcart model heb ik dus niet.
 
Kees Schepers
Moderator

kees Schepers

09/02/2012 14:41:46
Quote Anchor link
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 :)
 
Jaron T

Jaron T

09/02/2012 14:43:03
Quote Anchor link
mijn 'WinkelWagen' object is gewoon een soort van sessiemanager waar ik heel makkelijk producten en aantallen kan beheren.
 
Niels Kieviet
Beheerder

Niels Kieviet

09/02/2012 14:52:03
Quote Anchor link
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?

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 Kieviet
 
Kees Schepers
Moderator

kees Schepers

09/02/2012 15:08:24
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>


Winkelwagen items opvragen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$shoppingCartTotal
= $this->_em->getRepository('BestBuy\Entity\ShoppingcartItem')->getTotalAmount(Zend_Auth::getInstance()->getIdentity());
?>


In de repository class doe je een query:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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();
}

?>


Etc..

Waarom zou ik een 'winkelwagen' object extenden aan een order?
Gewijzigd op 09/02/2012 15:09:13 door kees Schepers
 
Niels Kieviet
Beheerder

Niels Kieviet

09/02/2012 15:38:00
Quote Anchor link
Ok duidelijk. Zelf doe ik het als volgt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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.
Gewijzigd op 09/02/2012 15:45:08 door Niels Kieviet
 
Kees Schepers
Moderator

kees Schepers

09/02/2012 16:01:16
Quote Anchor link
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 :)
 
Niels Kieviet
Beheerder

Niels Kieviet

09/02/2012 16:03:07
Quote Anchor link
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?
Gewijzigd op 09/02/2012 16:05:58 door Niels Kieviet
 
Kees Schepers
Moderator

kees Schepers

09/02/2012 16:09:19
Quote Anchor link
Waarom niet over een winkelwagen? Ik wil in mijn winkelwagen ook wel graag zien hoeveel ik ga spenderen in totaal :p
 
Niels Kieviet
Beheerder

Niels Kieviet

09/02/2012 16:10:36
Quote Anchor link
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.
 



Overzicht Reageren

Get Adobe Flash player