diff --git a/src/Cart.php b/src/Cart.php index 97097a0..7f2445d 100644 --- a/src/Cart.php +++ b/src/Cart.php @@ -180,6 +180,8 @@ class Cart $content = $this->getContent(); if ($rowId !== $cartItem->rowId) { + $itemOldIndex = $content->keys()->search($rowId); + $content->pull($rowId); if ($content->has($cartItem->rowId)) { @@ -193,7 +195,13 @@ class Cart return; } else { - $content->put($cartItem->rowId, $cartItem); + if (isset($itemOldIndex)) { + $content = $content->slice(0, $itemOldIndex) + ->merge([$cartItem->rowId => $cartItem]) + ->merge($content->slice($itemOldIndex)); + } else { + $content->put($cartItem->rowId, $cartItem); + } } $this->events->dispatch('cart.updated', $cartItem); diff --git a/tests/CartTest.php b/tests/CartTest.php index e9acea9..5c7d8e5 100644 --- a/tests/CartTest.php +++ b/tests/CartTest.php @@ -399,6 +399,21 @@ class CartTest extends TestCase $this->assertRowsInCart(1, $cart); } + /** @test */ + public function it_will_keep_items_sequence_if_the_options_changed() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(), 1, ['color' => 'red']); + $cart->add(new BuyableProduct(), 1, ['color' => 'green']); + $cart->add(new BuyableProduct(), 1, ['color' => 'blue']); + + $cart->update($cart->content()->values()[1]->rowId, ['options' => ['color' => 'yellow']]); + + $this->assertRowsInCart(3, $cart); + $this->assertEquals('yellow', $cart->content()->values()[1]->options->color); + } + /** @test */ public function it_can_remove_an_item_from_the_cart() {