Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa Tarde, estou criando uma loja virtual, e a questão é voltado para o carrinho de compras, ate agora ta tudo certo, funcionando normal, porém tem produtos que tem vários tamanho, exemplo eu tenho um tênis, e eu posso escolhe se quero tamanho 41 ou 42, blz ate ai ele registra certinho no banco, porém, se por a caso eu também queira compra o do tamanho 41, e dps volto la e compro o 42, invés de cria 2 produto no carrinho ele acaba atualizando o mesmo, pegando o ultimo tamanho q escolhi e na quantidade aumentando pra 2, vou manda o código aki, pq o ideal seria aparece 2 produto no carrinho, pq são 2 tamanho diferente, e isso ta quebrando a cabeça:
Código:
if($_GET['acao'] == 'adds'){
$qtds = $_POST['qtds'];
$cart_tamanho = $_POST['cart_tamanho'];
if(!isset($_SESSION['carrinho'][$id]) && $_SESSION['carrinho'][$id] < $Verifica_qtd_row2){
$_SESSION['carrinho'][$id] = $qtds;
$_SESSION['cart_tamanho'][$id] = $cart_tamanho;
}elseif($_SESSION['carrinho'][$id] < $Verifica_qtd_row2){
$_SESSION['carrinho'][$id] += $qtds;
$_SESSION['cart_tamanho'][$id] = $cart_tamanho;
}else{
$_SESSION['carrinho'][$id] = 1;
$_SESSION['cart_tamanho'][$id] = $cart_tamanho;
}
}Eu recomendo criar um array de itens no carrinho de acordo com o tipo de produto, porque se você tiver o $id repetido porque ele é o $id do tipo de produto e não do produto em si, você sempre sofrerá com essas substituições e além disso facilitará demais a "mão de obra" para incluir, alterar ou excluir item do carrinho.
dutopfave,
Como você tem variações de um mesmo produto, o ID do produto sempre será igual.
Nesse caso, você precisará fazer dupla verificação.
Verificar se o ID já consta no carrinho, se constar e o tamanho for igual, aumenta UM na quantidade.
Se constar e o tamanho for diferente, adiciona o produto.
Se não constar, simplesmente adiciona.
Detalhe é que pra isso, você não pode usar o ID do produto como posição do array no carrinho.
1. Ou você usa índices sequenciais e atribui em cada índice as características do produto;
2. Ou se a única variação que você tiver, for tamanho, pra facilitar você pode usar "id-tam", como índice do array.
Segue exemplo para primeira opção:
<?php
$produtoId = 10;
$produtoTam = 41;
$existe = false;
foreach ($_SESSION['carrinho'] as $key => $carrinho) {
// SE JA EXISTIR NO CARRINHO
if ($carrinho['id'] === $produtoId) {
// SE O TAMANHO FOR IGUAL, ADICIONA UM NA QUANTIDADE
if ($carrinho['tamanho'] === $produtoTam) {
$_SESSION['carrinho'][$key]['quantidade'] += 1;
$existe = true;
break;
}
// SE O TAMANHO FOR DIFERENTE, INSERE UMA NOVA POSICAO NO ARRAY
else {
$_SESSION['carrinho'][] = ['id' => $produtoId, 'tamanho' => $produtoTam, 'quantidade' => 1];
$existe = true;
}
}
}
// DEPOIS DE PERCORRER TODO O CARRINHO, SE NAO EXISTIR
if (!$existe) {
$_SESSION['carrinho'][] = ['id' => $produtoId, 'tamanho' => $produtoTam, 'quantidade' => 1];
}
?>
Segue exemplo para segunda opção:
<?php
$produtoId = 10;
$produtoTam = 41;
// SE EXISTIR NO CARRINHO
if (!empty($_SESSION['carrinho']["$produtoId-$produtoTam"])) {
$_SESSION['carrinho']["$produtoId-$produtoTam"] += 1;
} $_SESSION['carrinho']["$produtoId-$produtoTam"] = 1;
}
?>
No caso acima, pra você pegar os produtos e os respectivos tamanhos, bastaria fazer um foreach e dar um explode('-', $array). Na posição 0 você teria o ID, na posição 1 você teria o tamanho.
Na minha opinião pessoal, a segunda alternativa só é mais viável, se você tiver somente essa variação no seu sistema. Do contrário, o ideal seria usar a primeira solução, visto que você poderá fazer quantas comparações quiser!
Um abraço!>
Em 06/02/2020 at 11:34, ociceromartins disse:
dutopfave,
Como você tem variações de um mesmo produto, o ID do produto sempre será igual.
Nesse caso, você precisará fazer dupla verificação.
Verificar se o ID já consta no carrinho, se constar e o tamanho for igual, aumenta UM na quantidade.
Se constar e o tamanho for diferente, adiciona o produto.
Se não constar, simplesmente adiciona.
Detalhe é que pra isso, você não pode usar o ID do produto como posição do array no carrinho.
1. Ou você usa índices sequenciais e atribui em cada índice as características do produto;
2. Ou se a única variação que você tiver, for tamanho, pra facilitar você pode usar "id-tam", como índice do array.
Segue exemplo para primeira opção:
<?php
$produtoId = 10;
$produtoTam = 41;
$existe = false;
foreach ($_SESSION['carrinho'] as $key => $carrinho) {
// SE JA EXISTIR NO CARRINHO
if ($carrinho['id'] === $produtoId) {
// SE O TAMANHO FOR IGUAL, ADICIONA UM NA QUANTIDADE
if ($carrinho['tamanho'] === $produtoTam) {
$_SESSION['carrinho'][$key]['quantidade'] += 1;
$existe = true;
break;
}
// SE O TAMANHO FOR DIFERENTE, INSERE UMA NOVA POSICAO NO ARRAY
else {
$_SESSION['carrinho'][] = ['id' => $produtoId, 'tamanho' => $produtoTam, 'quantidade' => 1];
$existe = true;
}
}
}
// DEPOIS DE PERCORRER TODO O CARRINHO, SE NAO EXISTIR
if (!$existe) {
$_SESSION['carrinho'][] = ['id' => $produtoId, 'tamanho' => $produtoTam, 'quantidade' => 1];
}
?>
Segue exemplo para segunda opção:
<?php
$produtoId = 10;
$produtoTam = 41;
// SE EXISTIR NO CARRINHO
if (!empty($_SESSION['carrinho']["$produtoId-$produtoTam"])) {
$_SESSION['carrinho']["$produtoId-$produtoTam"] += 1;
} $_SESSION['carrinho']["$produtoId-$produtoTam"] = 1;
}
?>
No caso acima, pra você pegar os produtos e os respectivos tamanhos, bastaria fazer um foreach e dar um explode('-', $array). Na posição 0 você teria o ID, na posição 1 você teria o tamanho.
Na minha opinião pessoal, a segunda alternativa só é mais viável, se você tiver somente essa variação no seu sistema. Do contrário, o ideal seria usar a primeira solução, visto que você poderá fazer quantas comparações quiser!
Um abraço!
Pode ocorrer de um erro caso seja tamanhos inteiros.
Então no lugar de usar um sinal de - coloque #
Pelo o que entendi a variável $id é o id do produto.
Para diferenciar por tamanho pode ser feito outro índice para o tamanho do tênis
$_SESSION['carrinho'][$id][$tamanho] = $produto;