Что не так в моем методе утаения товаров из корзины?
При удалении товаров из корзины удаляются все кроме первого добавленного, на первом просто редиректит, даже если у меня в методе просто дамп он выводится везде но не в первом товаре.
Контроллер с добавлением отображением и удалением товаров:
<?php namespace AppHttpControllers; use AppModelsCurrency; use AppModelsProduct; use IlluminateHttpRequest; use IlluminateSupportFacadesAuth; use IlluminateSupportFacadesSession; class CartController extends Controller { public function index(Request $request) { $currencyActive = Currency::find($request->session()->get('currencies')); $currency = Currency::all()->count(); $cart = Session::get('cart', []); $totalPrice = 0; foreach ($cart as $productId => $product) { $totalPrice += $product['price'] * $product['quantity']; } return view('cart.cart', compact('currency', 'cart', 'totalPrice', 'currencyActive')); } public function addToCart(Request $request, $productId) { if (!Auth::check()) { return redirect()->route('login'); } $cart = Session::get('cart', []); if (array_key_exists($productId, $cart)) { $cart[$productId]['quantity'] += $request->input('quantity'); }else { $product = Product::find($productId); $productInfo = [ 'name' => $product->name, 'price' => $product->price, 'img' => $product->img, 'color' => $request->input('color'), 'size' => $request->input('size'), 'quantity' => $request->input('quantity'), ]; $cart[$productId] = $productInfo; } Session::put('cart', $cart); Session::save(); return redirect()->route('cart.index'); } public function remove($productId) { if (!Auth::check()) { return redirect()->route('login'); } $cart = Session::get('cart'); if (array_key_exists($productId, $cart)) { unset($cart[$productId]); Session::put('cart', $cart); } return redirect()->route('cart.index'); } } |
<?php namespace AppHttpControllers; use AppModelsCurrency; use AppModelsProduct; use IlluminateHttpRequest; use IlluminateSupportFacadesAuth; use IlluminateSupportFacadesSession; class CartController extends Controller { public function index(Request $request) { $currencyActive = Currency::find($request->session()->get('currencies')); $currency = Currency::all()->count(); $cart = Session::get('cart', []); $totalPrice = 0; foreach ($cart as $productId => $product) { $totalPrice += $product['price'] * $product['quantity']; } return view('cart.cart', compact('currency', 'cart', 'totalPrice', 'currencyActive')); } public function addToCart(Request $request, $productId) { if (!Auth::check()) { return redirect()->route('login'); } $cart = Session::get('cart', []); if (array_key_exists($productId, $cart)) { $cart[$productId]['quantity'] += $request->input('quantity'); }else { $product = Product::find($productId); $productInfo = [ 'name' => $product->name, 'price' => $product->price, 'img' => $product->img, 'color' => $request->input('color'), 'size' => $request->input('size'), 'quantity' => $request->input('quantity'), ]; $cart[$productId] = $productInfo; } Session::put('cart', $cart); Session::save(); return redirect()->route('cart.index'); } public function remove($productId) { if (!Auth::check()) { return redirect()->route('login'); } $cart = Session::get('cart'); if (array_key_exists($productId, $cart)) { unset($cart[$productId]); Session::put('cart', $cart); } return redirect()->route('cart.index'); } }
Роуты корзины:
Route::prefix('/cart')->group(function () { Route::get('/', [CartController::class, 'index'])->name('cart.index'); Route::post('/add{productId}', [CartController::class, 'addToCart'])->name('add.product.toCart'); Route::delete('/remove{productId}', [CartController::class, 'remove'])->name('product.remove'); }); |
Route::prefix('/cart')->group(function () { Route::get('/', [CartController::class, 'index'])->name('cart.index'); Route::post('/add{productId}', [CartController::class, 'addToCart'])->name('add.product.toCart'); Route::delete('/remove{productId}', [CartController::class, 'remove'])->name('product.remove'); });
Форма отправления запроса на удаление:
<div class="mt-4 flex items-center sm:absolute sm:left-1/2 sm:top-0 sm:mt-0 sm:block"> <h1>Quantity: {{ $product['quantity'] }}</h1> <form action="{{ route('product.remove', $productId) }}" method="post"> @csrf @method('delete') <button type="submit" class="ml-4 text-sm font-medium text-indigo-600 hover:text-indigo-500 sm:ml-0 sm:mt-3"> Remove </button> </form> </div> </div> |
<div class="mt-4 flex items-center sm:absolute sm:left-1/2 sm:top-0 sm:mt-0 sm:block"> <h1>Quantity: {{ $product['quantity'] }}</h1> <form action="{{ route('product.remove', $productId) }}" method="post"> @csrf @method('delete') <button type="submit" class="ml-4 text-sm font-medium text-indigo-600 hover:text-indigo-500 sm:ml-0 sm:mt-3"> Remove </button> </form> </div> </div>
Дополнительно:
ну вы пробовали при удалении вывести содержимое корзины до изменения, вывести что вы собираетесь менять, и вывести что случилось после измений?
Спасибо всем, не работало почему то потому что все эти данные были в пустой форме, не совсем понимаю почему, но предполагаю что запрос просто шел не туда куда надо
Ответы:
Начнем с того что роуты так не пишутся. А хелпер роута работает не так как у вас предполагается.
//router ... Route::post('/add/{productId}', [CartController::class, 'addToCart'])->name('add.product.toCart'); Route::delete('/remove/{productId}', [CartController::class, 'remove'])->name('product.remove'); ... //Controller public function remove($productId) { /* это вообще в мидлваре должно происходить, тут ему делать нечего, впишите роут в ауч группу... if (!Auth::check()) { return redirect()->route('login'); } */ $cart = Session::get('cart'); if (array_key_exists($productId, $cart)) { unset($cart[$productId]); Session::put('cart', $cart); } return redirect()->route('cart.index'); } ... //HTML <form action="{{ route('product.remove', ['productId'=>$productId]) }}" method="post"> // читать как работает хелпер route, посмотреть какой урл он выдает у вас сейчас, плакать, править... |
//router ... Route::post('/add/{productId}', [CartController::class, 'addToCart'])->name('add.product.toCart'); Route::delete('/remove/{productId}', [CartController::class, 'remove'])->name('product.remove'); ... //Controller public function remove($productId) { /* это вообще в мидлваре должно происходить, тут ему делать нечего, впишите роут в ауч группу... if (!Auth::check()) { return redirect()->route('login'); } */ $cart = Session::get('cart'); if (array_key_exists($productId, $cart)) { unset($cart[$productId]); Session::put('cart', $cart); } return redirect()->route('cart.index'); } ... //HTML <form action="{{ route('product.remove', ['productId'=>$productId]) }}" method="post"> // читать как работает хелпер route, посмотреть какой урл он выдает у вас сейчас, плакать, править...
на первом просто редиректит,
Во первых - редирект куда? Во вторых, стоит заглянуть в сгенерированный хтмл и посмотреть какой там реальный урл формы. Так же при отправке посмотреть нетворк и посмотреть что и куда реально отправляется и с какими данными.
- Route::post('/add{productId}' прекрасно работает
-
// читать как работает хелпер route, посмотреть какой урл он выдает у вас сейчас, плакать,
https://laravel.com/docs/10.x/blade#method-field
- iljaGolubev,
https://laravel.com/docs/10.x/blade#method-field
Это тут причем?
Route::post('/add{productId}' прекрасно работает
ЕМНИП хелпер route() будет разделять слешом роут и параметр, так что либо строить урл руками, либо сделать нормальные пути. В любом случае очевидно что урл строится криво.
- ThunderCat,
Я к тому, что ваш ответ имхо не поможет решить проблему.
Это тут причем?
вместо<form ... method="post"> - вполне "законно" указать @method('delete') .
ЕМНИП хелпер route() будет разделять слешом роут и параметр,
ну так легко проверить же.
Route::delete('/test{id}',function(int $id){var_dump($id);})->name('test');
Route::delete('/test{id}',function(int $id){var_dump($id);})->name('test');
# php artisan tinker route('test',['id'=>1]) // = "https://localhost/test1"# php artisan tinker route('test',['id'=>1]) // = "https://localhost/test1"
- iljaGolubev,
вместо - вполне "законно" указать @method('delete') .
И? зачем это мне писать? И где я писал что это ошибка или не верно написано?
ну так легко проверить же.
Во первых - влом, надо какой-то ларовский проект искать из свежих, во вторых - не суть, полюбому надо смотреть какой косяк в урл формы, там проблема 90% в урл, скорее всего криво прописан айдишник.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для того чтобы помочь вам разобраться в проблеме с методом удаления товаров из корзины, нужно сначала изучить ваш код. Возможно, проблема заключается в неправильном использовании методов или неправильной логике.
Прежде всего, убедитесь, что ваш метод удаления товаров из корзины вызывается правильным образом и передает все необходимые параметры. Проверьте, что вы правильно передаете идентификатор товара или другие данные, необходимые для определения, какой товар нужно удалить.
Далее, убедитесь, что ваш метод корректно находит товар в корзине и удаляет его. Проверьте условия, которые определяют, что товар должен быть удален, и удостоверьтесь, что они правильно настроены.
Также стоит убедиться, что после удаления товара из корзины она обновляется корректно. Проверьте, что после удаления товара из корзины массив товаров корректно пересчитывается и обновляется.
Приведу пример кода на языке PHP, который может помочь вам понять, как можно реализовать метод удаления товаров из корзины:
function removeItemFromCart($productId, $cart) { foreach($cart as $index => $item) { if($item['product_id'] == $productId) { unset($cart[$index]); } } return $cart; }
Этот пример кода показывает функцию, которая принимает идентификатор товара и массив корзины, и удаляет товар с заданным идентификатором из корзины. После этого массив корзины обновляется и возвращается из функции.
Если у вас остались вопросы или проблемы с методом удаления товаров из корзины, пожалуйста, предоставьте больше информации или кода, чтобы мы могли помочь вам более точно.