Via ajax post ik data naar een script dat weer wordt ingeladen in dat mandje.
Ik verstuur een array van het product zelf (titel, prijs e.d.) en een array van de productopties (kleur, grootte, materiaal etc). Beide arrays hebben een artikelid, deze vergelijk ik en wanneer ze gelijk zijn voeg ik ze samen.
Wanneer dat is gebeurd ziet mijn sessie er bijvoorbeeld zo uit:
Array
(
[Badmeubel trend dynasty met ronde kom 60 century oak] => Array
(
[artikelid] => 63
[product] => Badmeubel trend dynasty met ronde kom 60 century oak
[price] => 45
[picture] => cms/images/productgallerijen/badmeubel-trend-dynasty-met-ronde-kom-60-century-oak/badmeubel-trend-dynasty-met-ronde-kom-60-century-o.jpg
[quantity] => 1
[alias] => badmeubel-trend-dynasty-met-ronde-kom-60-century-oak
[catalias] => trendline-60cm
[Formaat] => 60 cm
[Kleur] => century oak
[Materiaal] => kunststof
[prodoptie] => 0
)
)
Nu heb ik een stuk code dat checkt of een product is gepost en dat product al bestaat. Zo nee voeg hem toe aan de array, zo ja tel de geposte quantity bij het bestaande product op.
Dat is deze code (dit staat binnen een check of een product wel is gepost en of productopties zijn gepost):
//Stop de productnaam in de variabele $prod
$prod = $thisProduct['product'];
//Als er nog geen sessie bestaat, maak deze dan aan
if (!isset($_SESSION['cart'])) {
//en maak er gelijk een array van
$_SESSION['cart'] = [];
}
//Als de productnaam nog niet voorkomt in de sessie, voeg deze dan toe inclusief de overige array waarden
if (!isset($_SESSION['cart'][$prod])) {
$_SESSION['cart'][$prod] = $thisProduct;
}
//Als deze wel voorkomt voeg hem dan niet toe maar tel de quantity op bij het bestaande product
else {
$_SESSION['cart'][$prod]['quantity'] += $thisProduct['quantity'];
}
Dat werkt prima. Maar stel dat een persoon hetzelfde product twee keer toevoegd, met verschillende opties. Bijvoorbeeld: product a in kleur geel en product a in kleur blauw, dan vervangt hij de opties en telt de quantity bij elkaar op. Uiteindelijk staat er dus maar één product in het mandje.
Ik wil graag dat er een nieuw product wordt toegevoegd, aangezien mijn script checkt op productnaam en de keys in de array ook de productnamen zijn, zal ik hier misschien een nummer achter moeten zetten. Bijvoorbeeld Badmeubel trend dynasty met ronde kom 60 century oak | 1. En die | 1 er later weer uitfilteren zodat dat niet in de productnamen is te zien door een persoon.
Hoe kan ik dat het beste aanpakken?
Ik post nu prodvarray, hierin zit bijvoorbeeld het volgende:
prodvarray: ["\u20ac 55 - ","Formaat: 80 cm","Kleur: grey","Materiaal: graniet","artikelid: 64","prodoptie: 2"]
Dit explode ik tot een bruikbare array en voeg toe aan de sessie aan het juiste product via de volgende code:
(deze code staat samen met bovenstaande code binnen: if($_POST['product'] && $_POST['prodvarray']){ bovenstaande en onderstaande code }
)
$postedprodopts = $_POST['prodvarray'];
$postedoptsdecoded = json_decode($postedprodopts);
// Maak de $prodoptiearray array aan
$prodoptiearray = array();
foreach($postedoptsdecoded as $key1 => $opts){
if(strpos($opts, ':')){
$optsexplod = explode(':', $opts);
// Stop de geexplodeerde waardes in de $prodoptiearray array
$prodoptiearray[$optsexplod[0]] = $optsexplod[1];
//$thisProduct[$optsexplod[0]] = $optsexplod[1];
}
}
if(!empty($_SESSION['cart'])){
foreach($_SESSION['cart'] as $cartproductopts){
// Check of het artikelid in de sessiearray gelijk is aan het artikelid wat wordt meegestuurd met de opties,
// zo ja voeg de optie toe aan de sessie array
if($cartproductopts['artikelid'] == $prodoptiearray['artikelid']){
// Anders als de productnaam wel voorkomt maar de optie nog niet
if($_SESSION['cart'][$cartproductopts['product']]['prodoptie'] !== $prodoptiearray['prodoptie']){
//$_SESSION['cart'][] = $prod.'1';
echo 'het product bestaat al maar de optie nog niet';
//$_SESSION['cart'][$cartproductopts['product']] = $_SESSION['cart'][$cartproductopts['product']];
}else{
}
foreach($prodoptiearray as $key2 => $merged){
$_SESSION['cart'][$cartproductopts['product']][$key2] = $merged;
//$prodoptiearray[$key2] = $_SESSION['cart'][$cartproductopts['product']][$key2];
}
}
}
}
Daarin doe ik het volgende:
// Anders als de productnaam wel voorkomt maar de optie nog niet
if($_SESSION['cart'][$cartproductopts['product']]['prodoptie'] !== $prodoptiearray['prodoptie']){
//$_SESSION['cart'][] = $prod.'1';
echo 'het product bestaat al maar de optie nog niet';
//$_SESSION['cart'][$cartproductopts['product']] = $_SESSION['cart'][$cartproductopts['product']];
}else{
}
Oftewel, check of het product al in de sessie bestaat maar de prodoptie (een cijfer waar de gekozen optie aan is gekoppeld) nog niet. De echo laat zich al zien op het juiste moment, wanneer ik voor het eerst een product toevoeg zie ik de echo, als ik daarna hetzelfde product toevoeg met dezelfde optie niet meer, maar voeg ik hetzelfde product toe met een andere optie (prodoptie) dan zie ik hem weer wel.
Hier loop ik alleen vast.. wat kan ik het beste doen?
Onder al deze code staat een loop die de sessie loopt en giet in een mandoverzicht.