- $ _SESSION est juste un tableau.
- Un tableau est stocké dans $ _SESSION ['cart'].
- Vous semblez écraser ce tableau, avec uniquement l'élément nouvellement ajouté.
À titre d'exemple, ce code:
if (isset($_POST['submit']))
{
$cart= new Cart();
$cart->add($_POST['id'],2);
$item= $cart->getCart();
$_SESSION["cart"]=$cart;
}
peut être changé pour:
if (isset($_POST['submit']))
{
$_SESSION["cart"][$_POST['id']] = 2;
}
Maintenant, il va simplement ajouter au tableau stocké dans $ _SESSION [ 'panier' ] Remarquez qu'il n'utilise pas le chariot du tout.
Essayez:
if (isset($_POST['submit']))
{
$cart= new Cart($_SESSION["cart"]); // this should bring in the previous items
$cart->add($_POST['id'],2); // what is this magic number '2'? Quantity? But where is it from?
$_SESSION["cart"] = $cart->getCart();
}
Edit: plus d'explications.
Le constructeur de la classe panier accepte un paramètre qui stocke en interne:
private $cart;
function __construct($cart="") {
$this->cart = $cart;
}
En toute honnêteté, cela devrait être un peu plus intelligent:
private $cart;
function __construct($cart = array()) {
if (is_array($cart))
{
$this->cart = $cart;
}
else
{
// maybe print some error, informing the developer that he's using the cart class incorrectly
// or better yet, trigger a PHP warning:
trigger_error('Cart class constructor expects an array parameter', E_USER_WARNING);
}
}
Cette garde de changement contre fournir quoi que ce soit, mais un tableau au constructeur. Notez qu'il peut toujours recevoir un tableau que la classe ne comprend pas, par ex. un tableau multidimensionnel. Dans ce cas, la classe de chariot ne détruira pas les données existantes dans le tableau, sauf si un identifiant d'article correspond à l'une des clés du tableau d'origine.
BTW, il semble que vous avez accepté ma réponse pendant que j'ajoutais à l'explication. Vérifiez-le pour une amélioration nécessaire à la classe. –