Я создаю страницу корзины Используемый пакет - Crinsane/LaravelShoppingcart
Чтобы добавить количество, я использую вызовы Ajax,
Для одного продукта я могу обновить количество и уменьшить его, все идеально. Эта проблема
возникает, когда я пытаюсь добавить еще один товар в корзину и пытаюсь обновить его количество.
Я думаю, что проблема связана с моим способом захвата rowID. Поскольку я использую foreach и вызываю его класс, я получаю только первый я бы.
Я не уверен, как мне получить идентификатор по-другому. Я не вставляю весь код корзины, так как это было бы длиннее
Вот мой код,
Blade:
@foreach (Cart::Content() as $cartcontent)
<footer class = "content">
<input type = "hidden" class = "rowID" name = "" value = "{{$cartcontent->rowId}}">
<span class = "qt-minus">-</span>
<span class = "qt">{{$cartcontent->qty}} </span>
<span class = "qt-plus">+</span>
<h2 class = "full-price">
{{$cartcontent->model->presentPrice() * $cartcontent->qty}}
</h2>
<h2 class = "price">
{{$cartcontent->model->presentPrice()}}
</h2>
</footer>
<br>@endforeach
В исходном коде html приведенный выше идентификатор строки отличается
js
$(document).ready(function(){
function cartLogic(){
// var rowID = $('#rowID').val();
var rowID = $('.rowID').val();
var quantity = $('.qt').text();
console.info(rowID);
console.info(quantity);
$.ajax({
url: 'cart/'+ rowID,
// url: 'cart/'+ $('#rowID').val(),
type: 'PATCH',
data: { "_token": "{{ csrf_token() }}",
quantity : quantity,
_method: "PATCH"},
success: function(res) {
console.info(res);
// window.location.reload();
}
});
}
$(".qt-plus").click(function(){
$(this).parent().children(".qt").html(parseInt($(this).parent().children(".qt").html()) + 1);
// console.info('working');
cartLogic();
});
Controller
public function update(Request $request, $id)
{
// return $request->all();
// dd(Cart::content());
$quantity = $request->quantity;
Cart::update($id, $quantity); // Will update the quantity
}
Route
Route::patch('cart/{id}', 'CartController@update')->name('cart.update');
Когда я просматриваю console.info(rowID); Я получаю только первый идентификатор продукта. Что нужно сделать, чтобы получить соответствующий ID
Любая помощь должна быть высоко оценена
Спасибо за ответ @misorude. В настоящее время я переписываю код.
(И вы, вероятно, захотите получить текстовое содержимое из элементов .qt по отдельности. .text() ведет себя иначе, чем .val(), и сочетает в себе текстовое содержимое всех элементов — но, вероятно, это не то, что вам нужно здесь.)






Вот что вы можете сделать на стороне клиента:
function cartLogic(rowID){
$.ajax({
url: 'cart/'+ rowID,
type: 'PATCH',
data: {
"_token": "{{ csrf_token() }}",
_method: "PATCH"
},
success: function(res) {
console.info(res);
}
});
}
$(".qt-plus").click(function() {
$(this).parent().children(".qt").html(parseInt($(this).parent().children(".qt").html()) + 1);
// Here you get ID of a cart record
var rowID = $(this).parent().find('.rowID').val();
cartLogic(rowID);
});
Обратите внимание, что я удалил quantity из ajax-запроса. Если вам это нужно - вы можете добавить его вторым параметром в cartLogic. Но будьте осторожны, что кто-то может изменить js-скрипт и передать значение 10000000000 как количество или -42. Что вы тогда будете делать?) Итак, безопаснее передать на сервер только id записи корзины и увеличить количество на 1 на сервере.
На стороне сервера вы должны обновить свою запись с помощью запроса, например:
UPDATE `table_name` SET quantity = quantity + 1 WHERE rowID = id
Большое спасибо, приведенное выше решение решило проблему. Я боролся за последние 8 часов, чтобы решить эту проблему. :)
.val()используется в режиме чтения, получает значение только из первого элемента - как явно указано в документации. Если вам нужны значения всех элементов, вам нужно петля всех элементов и получить значение для каждого из них в отдельности.