Ik ben een webwinkel aan het maken in OOP.
Ik doe nu alle producten die worden uitgekozen opslaan in een sessie, alsof ze in een soort winkelkar zitten.
Maar als ik de sessie cookies van mijn browser wis, dan is natuurlijk de winkelkar leeg.
En daarbij krijg je dit soort codes:
<?php
session_start();
class Cart {
private $_products;
public function __construct() {
$this->_products = $_SESSION['cart'];
$this->_products['cart'] = array();
}
public function addItem($id, $name, $price, $amt) {
// Vooral dit soort regels vind ik lelijk
$this->_products['cart'][] = array($id, $name, $price, $amt);
}
}
?>
Zo krijg ik de neiging om steeds met multidemensionale-sessie-array's te gaan werken.
Is dit oke zo? Of zouden jullie het helemaal anders doen, bijvoorbeeld met een database tabel waarin je tijdelijk de gekozen producten in opslaat van elke bezoeker, met een tijdelijk ID dat je in een sessie opslaat.
Ik heb hier nu (nog) niet voor gekozen omdat ik dacht dat te veel query's niet goed waren, maar volgens mij maakt het veel minder uit dan ik denk.
Als het puur om de artikelen van de winkelwagen gaat dan zou ik die niet in de database opslaan tenzij je de klanten later (een dag, week of maand of zo) nog de gelegenheid wilt geven om hun hun winkelwagen weer te raadplegen en verder aan te vullen. Bij grote websites als conrad kan ik me voorstellen dat mensen een lijstje willen maken en deze aanvullen totdat het voldoende is om geen verzendkosten meer te betalen.
Maar anders.. nope.
dan in OOP (hoe ver wil je gaan) zou ik een Session class nemen die de zorgen van het opslaan en lezen met sessions voor zijn rekening gaat nemen. Met serialize http://php.net/manual/en/function.serialize.php kun je objecten ook opslaan in sessions. Ik gebruik echter zelf gewoon een getter en setter en buiten mijn class roep ik dan gewoon $session->setValue('products', $productsArray);
Vraag me af of er mensen zijn die serialize gebruiken met sessies?
Je ziet dat mensen die graag eerst prijzen vergelijken, technische specificaties uitspitten, reviews lezen, enzovoort vaak over een periode van meerdere dagen terugkeren voordat ze tot een definitieve aanschaf overgaan. Daarom kan het geen kwaad winkelwagentjes tot zo'n 90 dagen in leven te houden.
Je zou serialize kunnen gebruiken, maar dan heb je nog steeds minimaal één query nodig om de inhoud van het winkelwagentje aan te passen aan actuele prijzen en actuele voorraden.
Ward, vaak stop ik pas iets in mijn winkelwagentje nadat ik weet waar ik het wil kopen. Is dat apart?
Nee hoor, dat is heel normaal :)
Maar je ziet ook dat kopers bijvoorbeeld iets in het winkelwagentje doen om te achterhalen wat de bijkomende verzendkosten zijn. Lekker makkelijk hè, hoeven ze dat niet zelf op te zoeken... Zoveel mensen, zoveel wensen.
[hint]Bij die blauwe bolle krijg je vaak korting als je, met account, iets in het winkelwagentje doet en de bestelling niet afrondt. Met extra korting probeert hij je een paar dagen later per e-mail alsnog over de streep te trekken.[/hint]