blackseabreathe
@blackseabreathe
brackets

Как правильно отправить Ajax запрос на обновление количества товара на странице корзина opencart 3?

Пытаюсь сделать обновление кол-ва товара на странице корзина через Ajax. В интернете куча информации по теме, но каждая из них оказалась не результативная.

У каждого товара в корзине есть поле quantity У меня оно выглядит так

<input type="text" name="quantity[{{ product.cart_id }}]" value="{{ product.quantity }}" size="1" min="1" class="tac ch_quantity" oninput="updateCart('{{ product.quantity }}', '{{ product.cart_id }}', $(this).val());" />


Все из коробки, за исключением
size="1" и oninput="updateCart('{{ product.quantity }}', '{{ product.cart_id }}', $(this).val());"


То есть при изменении поля кол-ва я передаю в ф-ию updateCart кол-во, cart_id и введенное значение юзером

Далее скрипт
function updateCart(quantity, cart_id, val) {
setTimeout(function(){ // ждем 100 миллисекунд
//alert('quantity = '+ quantity +', cart_id = ' + cart_id + ', val = ' + val);
if (quantity != 0 && quantity != 'undefined') { // если кол-во не равно 0, то делаем ajax запрос
$.ajax({
url: 'index.php?route=checkout/cart/edit', // на этот урл
type: 'post', //пост
//data: 'cart_id['+cart_id+']='+val, //пробовал сначала этот вариант data
data: 'key=' + cart_id + '&quantity=' + (typeof(val) != 'undefined' ? val : 1), // потом этот как из коробки в common.js
dataType: 'json', //json
success: function(json) {
 //да, тут кастомизированная корзина, тоесть все тоже самое что из коробки только заместо ul, li, table сделал div-"ы" (суть не меняется от этого)
$('#cart .ch_allProductsWrapper').load('index.php?route=common/cart/info .ch_allProductsWrapper .ch_products'); // обновляем корзину в шапке
if($('#checkout-cart').length>0){
$('#checkout-cart .ch_allProductsWrapper').load('index.php?route=common/cart/info .ch_allProductsWrapper .ch_products'); // обновляем на странице корзина
}
},
error: function(xhr, ajaxOptions, thrownError) {
$.jGrowl(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
}
});
}
}, 100);
}


Что в итоге получается?

Допустим изначально (до изменения кол-ва) все товары имеют кол-во со значением "1", далее я изменяю, например, на "12" и происходит следующее.

Корзины в шапке и в теле страницы обновляются, но значения кол-ва товара снова меняется на "1", не пойму в чем дело, то есть что в Ajax запросе не так, наверное в параметре "data" что-то не так написал, уже убил времени много на это дело. Поэтому решил попросить помощи здесь.

Из коробки в common.js кусок кода обновления корзины

'update': function(key, quantity) {
$.ajax({
url: 'index.php?route=checkout/cart/edit',
type: 'post',
data: 'key=' + key + '&quantity=' + (typeof(quantity) != 'undefined' ? quantity : 1),
dataType: 'json',
success: function(json) {
// Need to set timeout otherwise it wont update the total
setTimeout(function () {
$('header .headerTotal').html('<span id="cart-total">' + json['total'] + '</span>');
}, 100);

if (getURLVar('route') == 'checkout/cart' || getURLVar('route') == 'checkout/checkout') {
location = 'index.php?route=checkout/cart';
} else {
$('#cart .ch_allProductsWrapper').load('index.php?route=common/cart/info .ch_allProductsWrapper .ch_products');
if($('#checkout-cart').length>0){
$('#checkout-cart .ch_allProductsWrapper').load('index.php?route=common/cart/info .ch_allProductsWrapper .ch_products');
}
}
},
error: function(xhr, ajaxOptions, thrownError) {
$.jGrowl(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
}
});
},


Как я понял, key значит значение cart_id из БД, но непонятно как оно оттуда достается
  • Вопрос задан
  • 1348 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Nikola_Piterskiy
Как я понимаю, страница там все таки обновляется контролером и так как значения
value="{{ product.quantity }}"
не обновляются на новые после update

Сам сейчас мучаюсь с этой проблемой, но у меня шаблон на материалайзе и там по своему
это все работает.
Если что в телегу обращайтесь помогу, как добью этот вопрос.
Ответ написан
@VVCh
Дело в том, что...
откройте контроллер
cpmmon/cart
И вы увидите ЧТО-ТО
$data['text_items'] = sprintf($this->language->get('text_items'), $this->cart->countProducts() +

Это и есть количество Товаров (т.е.товарных сущностей) а не сумму товаров

Т.е. вы купили 12 французских булочек
Но в корзине - 1 французская булочка в количестве 12 штук
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы