[OOP] Goede aanpak?
Niels Kieviet op 30/03/2011 18:46:28:
Winkelwagen als object? Wil je dat wel?
(...)
(...)
Waarom niet? Je kunt best een winkelwagen hebben, de meest elementaire vorm ervan is dat het een soort van stack is. Dan heb je wel weer iets nodig die die stack afhandelt (iterator).
Bij een database is het inderdaad wel gebruikelijk om een tabel order en een tabel order regel te hebben. De tabel order houd alle orders bij, order regel de items van deze orders.
Quote:
Nee, dat wil ik eigenlijk niet maar je moet wat...
Je kan het nu toch dan snel aanpassen?
Hieronder een 'klein' opzetje gegeven.. Meer tijd heb ik niet, alles berust op hersenspinsel dus er kunnen fouten in zitten :) Succes..
Order item, klant, adres moet je zelf even maken.. (verzinnen)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
<?php
/**
* @author Niels Kieviet <[email protected]>
*/
class GsOrder
{
/**
* (evt) opgetreden foutmeldingen
*/
protected $errors = array( );
/**
* Array met order items
*/
protected $items = array( );
/**
* Factuuradres
*/
protected $factuuradres;
/**
* Afleveradres
*/
protected $afleveradres;
/**
* Overige (database) velden, even geen zin om die hier te noteren, dat kan je zelf wel (
* bij mij doet Zend_Db dat :)
*/
/**
* Je kan hier nog meer definieren zoals:
*
* - Betaalmethode
* - Verzendmethode
* - Order kortingen
* - Factuur
*
* noem maar op
*/
/**
* Constructor
*/
public function __construct( )
{
// herberekenen van order
$this->recalculate( );
}
/**
* Order zetten vanuit klant?
*/
public function setFromCustomer( $customer )
{
$this->setFromArray( $customer->get() ); // Of ->getArray / toArray ofzo.
// Factuur, aflever adres zetten?
$this->setFactuuradres( $customer->getFactuuradres( ) );
$this->setAfleveradres( $customer->getAfleveradres( ) );
}
public function addItem( Orderitem $orderitem )
{
if( !isset( $this->items[$orderitem->articlenr] ) ) {
$this->items[$orderitem->articlenr] = $orderitem;
}
else {
// Ophogen aantal? Of wil je een nieuwe regel?
$this->items[$orderitem->articlenr]->addCount( 1 ); // Of countPlus, verzin iets :)
}
}
public function getItem( $articlenr ) // Aan de hand van articlenr
{
return $this->items[$articlenr];
}
/**
* Ook nog methodes als getItems, clearItems en noem maar op
*/
/**
* Methode voor het zetten van variableen vanuit een array
*/
public function setFromArray( $data )
{
foreach( $data as $key => $value ) {
if( property_exists( $this, $key ) && !is_object( $this->$key ) ) {
$this->$key = $value;
}
}
}
/**
* Herbereken van de order
*
* - totalen
* - aantallen (items)
* - kortingen
*
* noem maar op
*/
public function recalculate( )
{
// Succes!
}
/**
* Methode voor het opslaan van de order
*/
public function save( )
{
// succes ;)
}
/**
* Totaal shizzle
*/
public function getTotalAmount( )
{
$total = 0;
foreach( $this->getItems as $item ) {
$total += $item->getAmount( );
}
return $total;
}
// Enzo kan je nog wel wat methoden verzinnen
}
?>
/**
* @author Niels Kieviet <[email protected]>
*/
class GsOrder
{
/**
* (evt) opgetreden foutmeldingen
*/
protected $errors = array( );
/**
* Array met order items
*/
protected $items = array( );
/**
* Factuuradres
*/
protected $factuuradres;
/**
* Afleveradres
*/
protected $afleveradres;
/**
* Overige (database) velden, even geen zin om die hier te noteren, dat kan je zelf wel (
* bij mij doet Zend_Db dat :)
*/
/**
* Je kan hier nog meer definieren zoals:
*
* - Betaalmethode
* - Verzendmethode
* - Order kortingen
* - Factuur
*
* noem maar op
*/
/**
* Constructor
*/
public function __construct( )
{
// herberekenen van order
$this->recalculate( );
}
/**
* Order zetten vanuit klant?
*/
public function setFromCustomer( $customer )
{
$this->setFromArray( $customer->get() ); // Of ->getArray / toArray ofzo.
// Factuur, aflever adres zetten?
$this->setFactuuradres( $customer->getFactuuradres( ) );
$this->setAfleveradres( $customer->getAfleveradres( ) );
}
public function addItem( Orderitem $orderitem )
{
if( !isset( $this->items[$orderitem->articlenr] ) ) {
$this->items[$orderitem->articlenr] = $orderitem;
}
else {
// Ophogen aantal? Of wil je een nieuwe regel?
$this->items[$orderitem->articlenr]->addCount( 1 ); // Of countPlus, verzin iets :)
}
}
public function getItem( $articlenr ) // Aan de hand van articlenr
{
return $this->items[$articlenr];
}
/**
* Ook nog methodes als getItems, clearItems en noem maar op
*/
/**
* Methode voor het zetten van variableen vanuit een array
*/
public function setFromArray( $data )
{
foreach( $data as $key => $value ) {
if( property_exists( $this, $key ) && !is_object( $this->$key ) ) {
$this->$key = $value;
}
}
}
/**
* Herbereken van de order
*
* - totalen
* - aantallen (items)
* - kortingen
*
* noem maar op
*/
public function recalculate( )
{
// Succes!
}
/**
* Methode voor het opslaan van de order
*/
public function save( )
{
// succes ;)
}
/**
* Totaal shizzle
*/
public function getTotalAmount( )
{
$total = 0;
foreach( $this->getItems as $item ) {
$total += $item->getAmount( );
}
return $total;
}
// Enzo kan je nog wel wat methoden verzinnen
}
?>
@Karl
Nu gewoon, omdat dit eigenlijk gewoon je order is.. ? Je kan in je controller je order naar de view gooien en in de view gewoon de order items ophalen? Anders is dat toch dubbel?
Gewijzigd op 30/03/2011 21:14:04 door Niels K
Dankje Niels, maar.... hoe doe jij het met de query's enzo? Gewoon in de class zelf of een aparte class of hoe..?
Niels Kieviet op 30/03/2011 21:10:44:
(...)
@Karl
Nu gewoon, omdat dit eigenlijk gewoon je order is.. ? Je kan in je controller je order naar de view gooien en in de view gewoon de order items ophalen? Anders is dat toch dubbel?
@Karl
Nu gewoon, omdat dit eigenlijk gewoon je order is.. ? Je kan in je controller je order naar de view gooien en in de view gewoon de order items ophalen? Anders is dat toch dubbel?
Ik zou daar pas in een later stadium aan toe komen. Mijn winkelwagentje is zoals het fysiek is een ding waarin ik mijn objecten (items / artikelen) kan opslaan.
Als er afgerekend moet worden, dan pas kom je bij een kassa uit o.i.d. Het voorbeeld wat jij hebt gemaakt vind ik eigenlijk niet zo mooi. Ik heb het idee dat je een aantal dingen in elkaar hebt geschoven, die ik persoonlijk uit elkaar zou houden (maar ik ga er niet dieper op in, want daar heb ik geen tijd / zin / fut voor, daarom reageer ik ook steeds met korte dingen).
Bram Boos op 30/03/2011 21:35:25:
Dankje Niels, maar.... hoe doe jij het met de query's enzo? Gewoon in de class zelf of een aparte class of hoe..?
Het netste is natuurlijk dat je gewoon ergens (moet je zelf maar verzinnen) een object in kan douwen. Echt je object. Hopla weg. En dat je het later weer kan opvragen. Hopla daar is het weer. Daarvoor kan je een object database gebruiken, maar die worden niet echt ondersteund, dus dan pak je een orm zoals doctrine die van je mysql database een virtuele object georiënteerde database maakt.
En waarom pas in een later stadium?
Wat ik gewoon doe is het volgende: (kort en summier)
In de BaseController maak ik alvast een 'row' aan voor Order en gooi ik hem in de sessie. Zie onderstaand voorbeeld.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
class BaseController extends Zend_Controller_Action
{
public function preDispatch( )
{
if(!$this->session->geladen) {
$this->session->order = new Table_Order()->createRow(); // Create row heeft met Zend Framework DB Table te maken.
$this->session->geladen = true;
}
}
// Waarden naar de view schrijven
public function postDispatch( )
{
$this->view->order = $this->session->order;
}
}
?>
class BaseController extends Zend_Controller_Action
{
public function preDispatch( )
{
if(!$this->session->geladen) {
$this->session->order = new Table_Order()->createRow(); // Create row heeft met Zend Framework DB Table te maken.
$this->session->geladen = true;
}
}
// Waarden naar de view schrijven
public function postDispatch( )
{
$this->view->order = $this->session->order;
}
}
?>
En in de view doe ik gewoon
Wat is daar fout aan dan?
Niels Kieviet op 01/04/2011 18:58:37:
Waarom vind je mijn voorbeeld niet mooi? Dat zijn toch dingen die specifiek met een order te maken hebben?(...)
In principe moet jij het factuur- en afleveradres al opslaan in je object (in ieder geval dat doe je). Daarnaast sla je ook nog eens een aantal op in het product, dat vind ik ook niet goed. Verder is het zo dat je niet aan een product verschillende eigenschappen kan hangen. Dan zou het bij jou weer een andere instantie moeten worden.
Zoals ik al uitlegde zou ik het veel meer gelijkend doe aan de echte wereld. Het winkelwagentje weet ook niets van de klant af, het weet alleen welke producten het heeft. Maar de aantallen e.d. dat weet het ook niet, want het slaat alleen de producten op. Bij de kassa wordt pas de aantallen en de prijs uitgerekend.
Karl Karl op 03/04/2011 10:53:00:
In principe moet jij het factuur- en afleveradres al opslaan in je object (in ieder geval dat doe je). Daarnaast sla je ook nog eens een aantal op in het product, dat vind ik ook niet goed. Verder is het zo dat je niet aan een product verschillende eigenschappen kan hangen. Dan zou het bij jou weer een andere instantie moeten worden.
Zoals ik al uitlegde zou ik het veel meer gelijkend doe aan de echte wereld. Het winkelwagentje weet ook niets van de klant af, het weet alleen welke producten het heeft. Maar de aantallen e.d. dat weet het ook niet, want het slaat alleen de producten op. Bij de kassa wordt pas de aantallen en de prijs uitgerekend.
Niels Kieviet op 01/04/2011 18:58:37:
Waarom vind je mijn voorbeeld niet mooi? Dat zijn toch dingen die specifiek met een order te maken hebben?(...)
In principe moet jij het factuur- en afleveradres al opslaan in je object (in ieder geval dat doe je). Daarnaast sla je ook nog eens een aantal op in het product, dat vind ik ook niet goed. Verder is het zo dat je niet aan een product verschillende eigenschappen kan hangen. Dan zou het bij jou weer een andere instantie moeten worden.
Zoals ik al uitlegde zou ik het veel meer gelijkend doe aan de echte wereld. Het winkelwagentje weet ook niets van de klant af, het weet alleen welke producten het heeft. Maar de aantallen e.d. dat weet het ook niet, want het slaat alleen de producten op. Bij de kassa wordt pas de aantallen en de prijs uitgerekend.
Handige webshop dan, als ik pas bij het afrekenen zie hoe duur het is en kan bepalen hoeveel producten ik wil hebben. En dan wil je afrekenen, weet je niet bij welke klant het winkelwagentje hoort. Ook niet erg handig.
Ik zou het zelf opdelen in product en orderregel. Een orderregel geeft het product en aantal aan. Een winkelwagentje heeft meerdere oderregels en een klant van wie het winkelwagentje is.