Página 1 de 1

[bug] Duplicação de produtos no carrinho

Enviado: 13 Abr 2019, 10:13
por Gabriel Rodrigo
Olá comunidade.
Estou passando por uma dificuldade com o opencart 3.0.3.1.
Ao colocar produtos no carrinho e finalizar a compra com novo cadastro o opencart está duplicando os registros do carrinho.

Alguém já passou por isso?
Só acontece quando é um novo cadastro de cliente.
URL da loja: https://splok.com.br/

Re: [bug] Duplicação de produtos no carrinho

Enviado: 15 Abr 2019, 12:55
por Manoel Vidal
Olá @Gabriel Rodrigo.

Acessei sua loja, adicionei um produto no carrinho e finalizei o pedido, mas problema não aconteceu.

Re: [bug] Duplicação de produtos no carrinho

Enviado: 03 Set 2020, 14:24
por julianaurquisa
Tenho exatamente o mesmo problema. Só ocorre algumas vezes, acontece mais no celular.
Alguém ajuda?

Re: [bug] Duplicação de produtos no carrinho

Enviado: 04 Set 2020, 08:28
por reds
Ola @julianaurquisa e @Gabriel Rodrigo
@Manoel Vidal
O erro mencionado acontece sim, eu mesmo ja peguei tal questão em um site, o produto em vez de somar no carrinho é duplicado, ou seja aparasse como se fosse um item diferente em uma nova linha.


Esse BUG ocorre vez ou outra e já notado em muitas lojas,

Notamos isso em muitas ocasiões e deduzimos que é algo relacional com o cookie ou cache, seja do navegador ou de como o servidor manipula tais dados.
Notamos também que isso é mais frequente nos navegadores movidos ao motor Chromium.
- A uma persistência em dados não válido, isso também ocorre com o Login em algumas ocasiões notamos que o login fica louco, ou seja ao alternar entre as paginas Home e produto, ele mostra na home deslogado com carrinho 0 e em demais paginas logado com valor no carrinho.
--- Em tese quando presenciei tal erro ao fechar o navegador e abrir novamente tais problemas foram resolvidos.


Acredito que essa questão pode gerar uma grande conversa a fim de um resultado satisfatório a todos.
Quem conseguir uma imagem pode postar para darmos enfeza a questão.


:)

Re: [bug] Duplicação de produtos no carrinho

Enviado: 17 Nov 2020, 13:57
por julianaurquisa
Olá, a minha loja começou a duplicar todos os produtos em todos os pedidos e precisei encontrar solução urgentemente. Faz 1 mês que achei esse link com a solução e vou repostar aqui, pois resolveu e nunca mais tive problemas com duplicidade de itens no pedido: https://forum.opencart.com/viewtopic.php?t=211273

5 ajustes precisam ser feitos:

1) No arquivo system/library/cart/cart.php

Remova essa parte:
Código: Selecionar todos
if ($this->customer->getId()) {
		// We want to change the session ID on all the old items in the customers cart
		$this->db->query("UPDATE " . DB_PREFIX . "cart SET session_id = '" . $this->db->escape($this->session->getId()) . "' WHERE api_id = '0' AND customer_id = '" . (int)$this->customer->getId() . "'");

		// Once the customer is logged in we want to update the customers cart
		$cart_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "cart WHERE api_id = '0' AND customer_id = '0' AND session_id = '" . $this->db->escape($this->session->getId()) . "'");

		foreach ($cart_query->rows as $cart) {
			$this->db->query("DELETE FROM " . DB_PREFIX . "cart WHERE cart_id = '" . (int)$cart['cart_id'] . "'");

			// The advantage of using $this->add is that it will check if the products already exist and increaser the quantity if necessary.
		$this->add($cart['product_id'], $cart['quantity'], json_decode($cart['option']), $cart['recurring_id']);
	}
}

2) Adicione essas funções no final da classe que fazem a mesma coisa acima, mas que são chamadas quando necessárias:
Código: Selecionar todos
public function renew_session_id_old_items ($customer_id) {
	// We want to change the session ID on all the old items in the customers cart
	$sql = "UPDATE " . DB_PREFIX . "cart SET session_id = '" . $this->db->escape($this->session->getId()) . "' WHERE api_id = '0' AND customer_id = '" . (int)$customer_id . "'";
	$this->db->query($sql);
}
	
public function transfer_items_to_new_customer ($customer_id) {
	// Once the customer is logged in we want to merge the current guest items with the customer cart and empty the guest cart
	$sql = "SELECT * FROM " . DB_PREFIX . "cart WHERE api_id = '0' AND customer_id = '0' AND session_id = '" . $this->db->escape($this->session->getId()) . "'";
	$cart_save_query = $this->db->query($sql);
	foreach ($cart_save_query->rows as $cart) {
		$this->add($cart['product_id'], $cart['quantity'], json_decode($cart['option']), $cart['recurring_id']);
		$sql = "DELETE FROM " . DB_PREFIX . "cart WHERE cart_id = '" . (int)$cart['cart_id'] . "'";
		$this->db->query($sql);
	}
}

3) Chame essas funções em register e login controllers:

Nos arquivos:
catalog/controller/checkout/login.php
catalog/controller/account/login.php


Logo após:
Código: Selecionar todos
unset($this->session->data['guest']);

Adicione isso:
Código: Selecionar todos
// change[662] giving old cart items of the customer the current session id
$this->cart->renew_session_id_old_items ($this->customer->getId());
// change[662] assigning the current guest cart items to the customer
$this->cart->transfer_items_to_new_customer ($this->customer->getId());
Nos arquivos:
catalog/controller/checkout/register.php
catalog/controller/account/register.php


Logo após:
Código: Selecionar todos
unset($this->session->data['guest']);

Adicione isso:
Código: Selecionar todos
// change[662] assigning the current guest cart items to the customer
$this->cart->transfer_items_to_new_customer ($this->customer->getId());