Что не так в моем методе утаения товаров из корзины?

Ссылка скопирована
1 ответ

При удалении товаров из корзины удаляются все кроме первого добавленного, на первом просто редиректит, даже если у меня в методе просто дамп он выводится везде но не в первом товаре.
Контроллер с добавлением отображением и удалением товаров:

<?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);})-&gt;name('test');

    Route::delete('/test{id}',function(int $id){var_dump($id);})-&gt;name('test');

    # php artisan tinker route('test',['id'=&gt;1]) // = "https://localhost/test1"

    # php artisan tinker route('test',['id'=&gt;1]) // = "https://localhost/test1"

  • iljaGolubev,

    вместо - вполне "законно" указать @method('delete') .

    И? зачем это мне писать? И где я писал что это ошибка или не верно написано?

    ну так легко проверить же.

    Во первых - влом, надо какой-то ларовский проект искать из свежих, во вторых - не суть, полюбому надо смотреть какой косяк в урл формы, там проблема 90% в урл, скорее всего криво прописан айдишник.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Кирилл JS Ответ

Для того чтобы помочь вам разобраться в проблеме с методом удаления товаров из корзины, нужно сначала изучить ваш код. Возможно, проблема заключается в неправильном использовании методов или неправильной логике.

Прежде всего, убедитесь, что ваш метод удаления товаров из корзины вызывается правильным образом и передает все необходимые параметры. Проверьте, что вы правильно передаете идентификатор товара или другие данные, необходимые для определения, какой товар нужно удалить.

Далее, убедитесь, что ваш метод корректно находит товар в корзине и удаляет его. Проверьте условия, которые определяют, что товар должен быть удален, и удостоверьтесь, что они правильно настроены.

Также стоит убедиться, что после удаления товара из корзины она обновляется корректно. Проверьте, что после удаления товара из корзины массив товаров корректно пересчитывается и обновляется.

Приведу пример кода на языке PHP, который может помочь вам понять, как можно реализовать метод удаления товаров из корзины:

function removeItemFromCart($productId, $cart) {
    foreach($cart as $index =&gt; $item) {
        if($item['product_id'] == $productId) {
            unset($cart[$index]);
        }
    }
    return $cart;
}

function removeItemFromCart($productId, $cart) { foreach($cart as $index =&gt; $item) { if($item['product_id'] == $productId) { unset($cart[$index]); } } return $cart; }

Этот пример кода показывает функцию, которая принимает идентификатор товара и массив корзины, и удаляет товар с заданным идентификатором из корзины. После этого массив корзины обновляется и возвращается из функции.

Если у вас остались вопросы или проблемы с методом удаления товаров из корзины, пожалуйста, предоставьте больше информации или кода, чтобы мы могли помочь вам более точно.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно