Bonjour,
J'essaie de développer un panier sous laravel avec un système d'option. Actuellement tout fonctionne bien, sauf lorsque j'ai des options.
Admetons j'ai un Tshirt taille S à 10€ et j'ajoute le même Tshirt en taille L à 11€, je vais avoir juste la quantité qui change de 1 à 2 au lieu d'avoir 2 lignes dans ma session. Pour le moment j'ai un code qui n'est pas top mais fonctionelle uniquement sans options.
public function add($product, $id, $variant = null)
{
if($variant){
$stored = ['qty' => 0, 'product' => $product->name, 'price' => $product->price, 'variant' => $variant->name, 'variantPrice' => $variant->price];
if($this->products)
{
if(array_key_exists($id, $this->products)){
$stored = $this->products[$id];
}
}
$stored['qty'] ++;
$stored['price'] = ($product->price + $variant->price) * $stored['qty'];
$this->products[$id] = $stored;
$this->totalQty++;
$this->totalPrice += $stored['price'];
}
else{
$stored = ['qty' => 0, 'product' => $product->name, 'price' => $product->price, 'variant' => null, 'variantPrice' => null];
if($this->products)
{
if(array_key_exists($id, $this->products)){
$stored = $this->products[$id];
}
}
$stored['qty'] ++;
$stored['price'] = $product->price;
$this->products[$id] = $stored;
$this->totalQty++;
$this->totalPrice += $stored['price'];
}
}
La session actuelle
App\Cart {#307
+products: array:1 [
1 => array:5 [
"qty" => 2
"product" => "Tshirt"
"price" => 10.00
"variant" => "Taille S"
"variantPrice" => 1
]
]
Le type de session souhaité*
App\Cart {#307
+products: array:1 [
1 => array:5 [
"qty" => 1
"product" => "Tshirt"
"price" => 10.00
"variant" => "Taille S"
"variantPrice" => 0
],
2 => array:5 [
"qty" => 1
"product" => "Tshirt"
"price" => 10.00
"variant" => "Taille L"
"variantPrice" => 1
]
]
Je pense que le soucis viens d'ici
if(array_key_exists($id, $this->products)){
$stored = $this->products[$id];
}
Mais comment déterminer que si il y a une variante, il store sur une autre ligne ?
En effet ton problème vient du fait que tu sauvegardes par id produit, et les deux items ont le même id. Tu devrais créer une clé unique du style $id = sha1($product->id . $variant->name . $variant->price); et $id = $product->id; si pas de variant.
$id = $variant ? sha1($product->id . $variant->name . $variant->price) : $product->id;
J'avais pas vu cette solution là ! Merci pour le coup de main, ça fonctionne plutôt bien