Перейти к содержанию
megrel

Обновление корзины по клику на кнопки "+" и "-"

Рекомендуемые сообщения

Страница корзины.

Есть кнопки увеличения и уменьшения количества - .minus и .plus

Как записать , чтобы при клике на любую из кнопок корзина обновлялась.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В common.js должна быть эта функция или просто исходник страницы посмотри. Лень искать что ли? Или я не так все понял?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И где в common.js эта функция?

Там есть function addToCart(product_id, quantity)

Но это  разве то?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для старых версий нужно отправлять форму корзины на адрес корзины(откройте консоль и посмотрите). Для новых версий есть:

'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',
			beforeSend: function() {
				$('#cart > button').button('loading');
			},
			complete: function() {
				$('#cart > button').button('reset');
			},			
			success: function(json) {
				// Need to set timeout otherwise it wont update the total
				setTimeout(function () {
					$('#cart > button').html('<span id="cart-total"><i class="fa fa-shopping-cart"></i> ' + json['total'] + '</span>');
				}, 100);

				if (getURLVar('route') == 'checkout/cart' || getURLVar('route') == 'checkout/checkout') {
					location = 'index.php?route=checkout/cart';
				} else {
					$('#cart > ul').load('index.php?route=common/cart/info ul li');
				}
			}
		});
	},
Изменено пользователем afwollis

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день.

В ОС 2.02 пытаюсь использовать этот пример для обновления корзины.

Корзина в product.tpl работает.

При работе этого запроса получаю ответ:

 

<b>Warning</b>: Invalid argument supplied for foreach() in <b>/Users/MacBook/Sites/TEXNOSALES/catalog/controller/checkout/cart.php</b> on line <b>414</b><b>Warning</b>: Cannot modify header information - headers already sent by (output started at /Users/MacBook/Sites/TEXNOSALES/index.php:102) in <b>/Users/MacBook/Sites/TEXNOSALES/system/library/response.php</b> on line <b>12</b>

 

foreach:

        if (!empty($this->request->post['quantity'])) {
            foreach ($this->request->post['quantity'] as $key => $value) {
                $this->cart->update($key, $value);
            }

            unset($this->session->data['shipping_method']);
            unset($this->session->data['shipping_methods']);
            unset($this->session->data['payment_method']);
            unset($this->session->data['payment_methods']);
            unset($this->session->data['reward']);

            $this->response->redirect($this->url->link('checkout/cart'));
        }

 

html запрос работает, но хотелось бы воспользоваться JSON

 

Благодарю.

Изменено пользователем paulittop

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
On 11.07.2017 at 4:31 PM, paulittop said:

Invalid argument supplied for foreach() in <b>/Users/MacBook/Sites/TEXNOSALES/catalog/controller/checkout/cart.php</b> on line <b>414</b>

Так а что с этим то делать

 

Cейчас  пытаюсь, сделать то же самое. Обновление стоимости по нажатиям + и -

Но что то дальше процитированной ошибки не получается продвинуться

 

Кнопка + выглядит вот так

<a onclick="cart.update('<?php echo $product['cart_id']; ?>', '<?php echo $product['quantity']; ?>');" class="counter counter-plus material-design-add186" href='#' data-toggle="tooltip" title="" data-original-title="Больше"></a>

и при нажатии ошибка Invalid argument supplied for foreach()

вот контроллер - функция edit

public function edit() {
		$this->load->language('checkout/cart');

		$json = array();

		// Update
		if (!empty($this->request->post['quantity'])) {
			foreach ($this->request->post['quantity'] as $key => $value) {
				$this->cart->update($key, $value);
			}

			unset($this->session->data['shipping_method']);
			unset($this->session->data['shipping_methods']);
			unset($this->session->data['payment_method']);
			unset($this->session->data['payment_methods']);
			unset($this->session->data['reward']);

			$this->response->redirect($this->url->link('checkout/cart'));
		}

		$this->response->addHeader('Content-Type: application/json');
		$this->response->setOutput(json_encode($json));
	}

Спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день.

Кнопку рекомендую переделать в button.

 

В контроллере нужно осуществить проверку на то, какой тип данных поступает в функцию.

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

 

Или можно так, как в моем ответе здесь.

 

 

Изменено пользователем paulittop
  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, вроде получилось, но частично.

Ошибок нет, но и стоимость не обновляется

куда дальше копать...

 

Spoiler

	public function edit() {
		$this->load->language('checkout/cart');

		$json = array();
//test

//	tets
		// Update
		$mxcartupd = $this->request->post['quantity'];
		if (!empty ($this->request->post['quantity'])) {
			if (is_array($this->request->post['quantity'])) {
				foreach ($this->request->post['quantity'] as $key => $value) {
					$this->cart->update($key, $value);

					unset($this->session->data['shipping_method']);
					unset($this->session->data['shipping_methods']);
					unset($this->session->data['payment_method']);
					unset($this->session->data['payment_methods']);
					unset($this->session->data['reward']);

					$this->response->redirect($this->url->link('checkout/cart'));
				}
				$this->response->addHeader('Content-Type: application/json');
				$this->response->setOutput(json_encode($json));
			} else {
				$this->cart->update($this->request->post['key'], $mxcartupd);


				unset($this->session->data['shipping_method']);
				unset($this->session->data['shipping_methods']);
				unset($this->session->data['payment_method']);
				unset($this->session->data['payment_methods']);
				unset($this->session->data['reward']);
$mxtet=$this->session->data['currency'];
				$json['total'] = sprintf($this->currency->format($this->cart->getTotal(), $this->session->data['currency']));
				$this->response->addHeader('Content-Type: application/json');
				$this->response->setOutput(json_encode($json));
				//$this->response->redirect($this->url->link('checkout/cart'));
			}
		}

	}

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

заменил common.js на дефолтны, заработало. Но только стоимость в header забивает.

Я так понимаю в теме сильно переделан common.js

у меня получилось сделать частичное обновление стоимости на один товар, но есть проблема когда два и общая стоимость. И количество которое $this->request->post['quantity']; как то отловить надо для след изменения кол-ва

 

В общем думаб сейчас как бы это реализовать, оно вроде понятно, но как то заморочисто.

Может попоробовать весь div с корзиной заменить через AJAX. Я правда в этом не силен..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

почти домучал. 

В общем сделал пару функций. Когда они были через document.ready в js файле , то они слетали после первого срабатывания

теперь засунул в код в перегружаемом элементе, но все равно срабатывает ток один раз.

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

 

Spoiler

<button onclick="minussubmit()" type="button" class="counter counter-minus material-design-horizontal39"></button>
<input type="text" name="quantity[<?php echo $product['cart_id']; ?>]" value="<?php echo $product['quantity']; ?>" size="1" class="form-control cart-q" id="cart-q"/>
<button onclick="plussubmit()" type="button"  class="counter counter-plus material-design-add186"></button>
	<script>
		function minussubmit(){
			var input = $(this).parent().find('input[name*="quantity"]');
			if (input.val() > 1) {
				var value = parseInt(input.val()) - 1;
				input.val(value);
			}
			setTimeout(function () {
				$.ajax({
					type: 'post',
					url: 'index.php?route=checkout/cart/edit',
					data: $('#mx-cart').serialize(),
					success: function () {
						$('#content').load('/cart #content');
					}
				});
			}, 100);
		};
		function plussubmit(){
			var input = $(this).siblings('input[name*="quantity"]');
			setTimeout(function () {
			var value = parseInt(input.val()) + 1;

			input.val(value);
			}, 100);
			setTimeout(function () {
				$.ajax({
					type: 'post',
					url: 'index.php?route=checkout/cart/edit',
					data: $('#mx-cart').serialize(),
					success: function () {
						$('#content').load('/cart #content');
					}
				});
			}, 100);
		};
	</script>

 

 

Изменено пользователем maxos

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в js темы был такой код

Spoiler

(function ($) {
    var o = $('input[name*="quantity"]');
    $(document).ready(function () {
        $('.counter-minus').click(function (e) {
            e.preventDefault();
            input = $(this).parent().find('input[name*="quantity"]');
            if (input.val() > 1) {
                value = parseInt(input.val()) - 1;
                input.val(value);
            }
        })
        $('.counter-plus').click(function (e) {
            e.preventDefault();
            input = $(this).parent().find('input[name*="quantity"]');
            value = parseInt(input.val()) + 1;
            input.val(value);
        });
    });
})(jQuery);

и он увеличивал уменьшал значения,

я его и копировал и менял

 в итоге у меня не работает изменение значения

 

 

и он увеличивал уменьшал значения,

я его и копировал и менял

 в итоге у меня не работает изменение значения

Spoiler

			function plussubmit() {
				var input, value;
					input = $(this).parent().find('input[name*="quantity"]');
					value = parseInt(input.val()) + 1;
					input.val(value);

				setTimeout(function () {
					$.ajax({
						type: 'post',
						url: 'index.php?route=checkout/cart/edit',
						data: $('#mx-cart').serialize(),
						success: function () {
							$('#content').load('/cart #content');
						}
					});
				}, 100);
			};

 

 

Изменено пользователем maxos

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

разобрался

проблема была с тем что "this" это window был при вызове из html

помогло это https://stackoverflow.com/questions/12456399/how-to-use-this-reference-of-the-element-calling-the-function

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я реализовал это следующим образом, ни чего в коде не пришлось изменять кроме как изменить блок с кнопками в  catalog/view/theme/default/template/checkout/cart.twig..opencart 3.0.2.0

 

Было

    <td class="text-left"><div class="input-group btn-block" style="max-width: 200px;">
                  <input type="text" name="quantity[{{ product.cart_id }}]" value="{{ product.quantity }}" size="1" class="form-control" />
                  <span class="input-group-btn">
                  <button type="submit" data-toggle="tooltip" title="{{ button_update }}" class="btn btn-primary"><i class="fa fa-refresh"></i></button>
                  <button type="button" data-toggle="tooltip" title="{{ button_remove }}" class="btn btn-danger" onclick="cart.remove('{{ product.cart_id }}');"><i class="fa fa-times-circle"></i></button>
                  </span></div></td>

Cтало

<td>
Количество: <input style="display: none;" type="text" name="quantity[{{ product.cart_id }}]" value="{{ product.quantity }}" size="1" class="form-control" id="{{ product.cart_id }}"/>
<span>{{ product.quantity }}</span>   
<button class="" onClick="document.getElementById('{{ product.cart_id }}').value=parseInt(document.getElementById('{{ product.cart_id }}').value)-1">-</button>
<button class="" onClick="document.getElementById('{{ product.cart_id }}').value=parseInt(document.getElementById('{{ product.cart_id }}').value)+1">+</button> 
</td>

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.