Umas das dúvidas recorrente que recebo sobre a minha vídeoaula de carrinho de compras, é relacionado em adicionar opções aos produtos. Exemplo, vender camisas, e a pessoa ter a opção das cores.
Na vídeoaula ensino adicionar os produtos numa session, onde é atribuído um array, sendo o ID a chave desse array, e o valor será a quantidade. Dessa maneira você consegue recuperar o valor do produto do banco.
Mas como adicionar opções de cores na session, sendo que adicionamos apenas o ID do produto e quantidade? Primeiro coisa que pensamos é estendê-lo em vez de apenas atribuir a quantidade, atribuir um array, tendo assim os valores de quantidade e cor:
[php]
$_SESSION[‘carrinho’][ID] = array(‘qtd’ => 1, ‘cor_id’ => 5);
[/php]
Conseguimos adicionar o ID da cor no carrinho, mas tem um problema. Se a pessoa quiser o mesmo produto, com cores diferentes? Como o ID do produto é o que definir no array os valores diferentes, se atribuiu outra cor com o mesmo produto, ele vai sobrescrever. Então precisamos ter um identificador único, onde vamos dizer qual o produto e cor. Podendo ter um produto com várias cores. E que tal utilizamos essas duas informações como índice desse array?
[php]
$_SESSION[‘carrinho’][ID:COR_ID] = 1;[/php]
Pronto, resolvemos o nosso problema, separamos com o valor por dois pontos ( : ), sendo o primeiro o ID e o segundo a ID da cor do produto. Então vamos exemplificar melhor isso. Criaremos uma classe chamado Carrinho.php, e que terá todos o processo relacionado ao carrinho de compras. O código está comentado, para facilitar a compreensão :
Carrinho.php
[php]
<?php
/**
*
* Implementa o carrinho de compras
* @author David CHC
*
*/
final class Carrinho{
/**
*
* Método construtor
* Caso não existe a $_SESSION[‘carrinho’],
* ele criar atribuindo um array vazio
*
*/
public function __construct(){
if(!isset($_SESSION[‘carrinho’])){
$_SESSION[‘carrinho’] = array();
}
}
/**
*
* Adiciona um produto ao carrinho
*
* Veja que criar uma chave, tendo a composição de 2 items:
* o ID do produto e o ID da cor do produto
* Essa maneira não irá sobreescrever quando quiser
* vários produtos com cores diferentes.
*
* Um detalhe, se não tiver cor, ele atribui o valor zero,
* facilitando na hora de verificar se tem cor ou não
*
* @param integer $id é código do produto adicionado
* @param integer $qtd é quantidade
* @param integer $cor_id é a cor do produto
*
*/
public function adicionar($id, $qtd = 1, $cor_id=null){
//verificar se o valor é nulo
if(is_null($cor_id)){
//Se for, monta o indice, sendo o valor para cor como 0
$indice = sprintf(‘%s:%s’, (int)$id, 0);
}else{
//Se existe um valor, atribui ao indice
$indice = sprintf(‘%s:%s’, (int)$id, (int)$cor_id);
}
/**
* Se não existir esse indice no carrinho
* Atribui ao carrinho com a quantidade
*/
if(!isset($_SESSION[‘carrinho’][$indice])){
$_SESSION[‘carrinho’][$indice] = (int)$qtd;
}
}
/**
*
* Altera a quantidade do carrinho
* O indice do array é a junção do ID do produto com o ID da cor
*
* @param string $indice é a chave do array
* @param integer $qtd é quantidade para alterar
*/
public function alterar($indice, $qtd){
//verifica se existe esse indice
if(isset($_SESSION[‘carrinho’][$indice])){
//se o quantidade for maior que zero
if($qtd > 0){
//realiza a alteração
$_SESSION[‘carrinho’][$indice] = (int)$qtd;
}
}
}
/**
*
* Excluir o produto do carrinho
* @param string $indice
*/
public function excluir($indice){
//excluir o produto do carrinho
unset($_SESSION[‘carrinho’][$indice]);
}
/**
*
* Retorna um array com os dados dos produtos no carrinho
* @return array $result
*/
public function listarProdutos(){
//inicia a variável com array
$result = array();
foreach($_SESSION[‘carrinho’] as $indice => $qtd){
//Separa o ID do produto do ID da cor
list($id, $cor_id) = explode(‘:’, $indice);
//Realizar a busca pelo produto, selecionado apenas o nome do produto e preço
$query_product = mysql_query("SELECT produto, preco FROM produtos WHERE id = ‘$id’");
//retorna os itens do tabela produtos
$row_product = mysql_fetch_assoc($query_product);
/**
* Adicionar ao array o nome do produto, preço , quantidade, subtotal e a cor
* È importante reparar que indice desse array será o mesmo
* do carrinho.
*/
$result[$indice][‘produto’] = $row[‘produto’];
$result[$indice][‘preco’] = $row[‘preco’];
$result[$indice][‘qtd’] = $row[‘qtd’];
$result[$indice][‘subtotal’]= $row[‘preco’] * $row[‘qtd’];
$result[$indice][‘cor’] = ”;
//Verifica se existe cor para o produto
if($cor_id > 0) {
//Faz a busca pela cor , seleciona apenas o nome da cor
$query_cor = mysql_query("SELECT cor FROM cores WHERE id = ‘$cor_id’");
//retorna os itens do tabela cores
$row_cor = mysql_fetch_assoc($query_cor);
//Adiciona o nome da cor
$result[$indice][‘cor’] = $row_cor[‘cor’];
}
}
return $result;
}
/**
*
* Retorna o valor total do carrinho
* Aqui apenas listaremos o produtos
* somaremos o subtotal, que é
* o preço vezes a quantidade
* Isso já foi calculado no método listarProdutos
*/
public function valorTotal(){
//listar todos os produtos
$produtos = $this->listarProdutos();
//inicia a variável
$total = 0;
//listar os produtos, para resgatar o subtotal
foreach($produtos as $indice => $row){
//realiza a soma
$total += $row[‘subtotal’];
}
return $total;
}
}
?>
[/php]
Veremos como seria utilizado essa classe, lembrando que não irei mostrar todo os processos desse carrinho do compras, porque tem uma videoaula que explica o mesmo procedimento, estou apenas mostrando como usar a classe. Antes os valores eram enviado por GET , mesmo na hora da alteração, agora será enviado por POST. Vamos ao código :
carrinho.php
[php]
<?php
//Inicia a Session
session_start();
//inclui a conexão
require(‘config/conexao.php’);
//Include a classe Carrinho.php
require(‘classes/Carrinho.php’);
//Instancia o Carrinho
$cart = new Carrinho();
//Verifica se irá adicionar produto ao carrinho
if(isset($_POST[‘acao’]) && $_POST[‘acao’] == ‘add’){
/**
*
* Resgata o ID do produto
* Resgata o ID da cor
* Resgata a Quantidade
*
*/
$id = $_POST[‘id’];
$cor_id = (isset($_POST[‘cor_id’])) ?$_POST[‘cor_id’] : null;
$qtd = $_POST[‘qtd’];
//Adicionar o produto no carrinho
$cart->adicionar($id, $qtd, $cor_id);
}
//Verifica se vai alterar o produto
if(isset($_POST[‘acao’]) && $_POST[‘acao’] == ‘alterar’){
//Percorre o array da quantidade para resgatar
// o indice e valor da quantidade
foreach($_POST[‘qtd’] as $indice => $valor){
$cart->alterar($indice, $valor);
}
}
//Verifica para excluir o produto
if(isset($_GET[‘apagar’])){
$cart->excluir($_GET[‘apagar’]);
}
//retorna todos produtos do carrinho
$produtos = $cart->listarProdutos();
//retorna valor do total do carrinho
$total = $cart->valorTotal();
[/php]
Agora vamos a parte de mostrar os produtos no carrinho, será continuação do arquivo carrinho.php, estou colocando separado para ficar mais fácil de visualizar:
[php]
<table>
<thead>
<tr>
<th>Produto</th>
<th>Quantidade</th>
<th>Preço</th>
<th>SubTotal</th>
<th>Excluir</th>
</tr>
</thead>
<form action="" method="post">
<tfoot>
<tr>
<td colspan="5">
<input type="submit" value="Alterar o Carrinho" />
<input type="hidden" name="acao" value="alterar" />
</td>
</tr>
</tfoot>
<tbody>
<?php foreach($produtos as $indice => $valor) :?>
<tr>
<td><?php echo $row[‘produto’]. ‘ – ‘.$row[‘cor’]?></td>
<td><input type="text" name="qtd[<?php echo $indice?>]" value="<?php echo $valor[‘qtd’]?>" /></td>
<td>R$ <?php echo number_format($valor[‘preco’], 2, ‘,’, ‘.’)?></td>
<td>R$ <?php echo number_format($valor[‘subtotal’], 2, ‘,’, ‘.’)?></td>
<td><a href="carrinho.php?apagar=<?php echo $indice?>">Excluir</a></td>
</tr>
<?php endforeach;?>
</tbody>
</form>
</table>
[/php]
Repare que o principio é o mesmo que foi utilizado na videoaula, apenas adicionamos mais uma informação. Caso você tenha muitas opções ao pedido, você pode realizar o mesmo procedimento, mas em vez de você colocar id da cor, você iria utilizar o array com todas as opções, utilizando o serialize no array, e Codifica dados (criptografar) com base64_encode , podendo reverter:
[php]
<?php
$options = array(‘cor_id’ => 1, ‘tamanho_id’ => 5);
$id = 1;
$indice = $id.’:’.base64_encode(serialize($options));
?>
[/php]
Depois para usar os itens é só reverter:
[php]
<?php
list($id, $options) = explode(‘:’, $indice);
$items = unserialize(base64_decode($options));
?>
[/php]
A partir dai você consegue com facilitada atribuir opções a seus produtos utilizando a session. Espero ter ajudado, e até a próxima
Só não entendi três coisas:
1. Algum motivo especial pra tornar a classe Final? Isso atrapalha um bocado na reutilização de componentes.
2. Por que serializar o array com as opções? Se elas vão ser amazenadas em Session, o PHP já não faz isso automaticamente?
3. Qual a utiliadade do base64_encode/base64_decode nesse exemplo?
Bom tutorial!
Blz Eduardo, então vou tentar expor pq fiz essas decisões:
1 – No caso dessa classe, sua reutilização, por composição ou herança, na minha visão, não se encaixaria. Um caso de reutilização, seria definição de que tipo de armazenamento, e modo de exibição, no caso seria o ideal criar uma interface, ou classe abstrata com essas definições, essas classes filhas tomasse essa decisão. Essa classe seria esse “resultado”. Outro motivo de ser final, como ela seria esse “resultado”, isso me garante evitar gambiarras como já vi, classes de carrinho com definições do banco de dados, definição de conexão , etc, e partir dai utilizar ele para acesso ao banco. Então sendo final, estou dizendo, nesse caso , que ele é o resultado final desse processo.
2,3 – As questões 2 e 3 estão ligadas. Veja que no tutorial, minha sugestão de solução para essas opções é adicionar essas informações fazendo parte do indice desse array junto com Id do produto. Preciso transformar esse array associativo. Então serializar esse array é mais facil de trabalhar, já que vai transformar numa string, e posso retorna sua forma original pra trabalhar como array. E a utilização do base_64, é porque estou utilizando os dois pontos ( : ) para separar o ID do produto das opções, como estou serializando essa array, ele terá tanto esse caractere ( : ), podendo causar algum problema.
vlw, abrs
Acho melhor perguntar por aqui? ou continuo no Post do MXmaster?
Fabio, por perguntar aqui tbm, sem problemas
Olá,
Preciso da seguinte solução:
Tenho um produto que é um caixa de presente com 6 alfajores dentro.
Só que em meu site possuo 5 sabores diferentes de alfajores.
O internauta que quiser comprar esta caixa de presente, terá a sua disposição a opção de personalizar a quantidade de alfajores de cada sabor.
Preciso que,….a listagem de sabores seja integrada,…de forma que, caso o internauta ultrapasse o limite de 6 unidades, receba um aviso…..
Conseguem me ajudar
Diego, vendo que vc usa o opencart, veja se esse módulo te ajuda:
http://www.opencart.com/index.php?route=extension/extension/info&extension_id=3327
Queria saber o seguinte, cada produto tem 1 Cor e tamanho. Como eu faria para dar baixa no Banco, eu teria que abrir 1 codigo para cada produto e lista-lo na hora de exibir o produto Modelo? Eu criaria um Select e através desse select jogaria o ID do produto? seria algo desse tipo?
Vc pode colocar na tabela produtos, a quantidade de produto, e na hora de finalizar o pedido, e vc diminui com quantidade solicitada
Boa tarde David,
Fiz tudo conforme o tutorial, só que estou com um problema:
Eu não tenho que inicializar a sessão, ou seja, session_start();
Quando eu coloco isso e vou deletar, o mesmo não faz nada.
Você pode me ajudar?
No aguardo.
Grato.
Guilherme, vc precisa trabalhar iniciar a session , com session_start, eu não tinha colocado pq o pre-requisito do tutorial a videoaula sobre carrinho de compras. Sobre não está excluindo, retire o is_numeric q eu coloquei. Eu fiz alterações , removendo is_numeric e iniciando com session_start()
Boa noite David,
Então lembro que a uns 3 anos atrás me deu a maior força para solucionar exatamente esta dúvida: Adicionar opções ao carrinho de compras, na época além de cor tinha que o tamanho.
Foi muito bom para o entendimento e hoje vejo que até você já está utilizando CMS´s para facilitar a vida e nesse barco segue eu agora deixei de criar sistemas de e-commerce do zero e utilizo além do OpenCart o Magento que são magníficos, deixando os códigos para softwares que necessitam realmente construções do início.
Conforme passou o tempo adotei frameworks para facilitar e estou utilizado o CI como principal e o Zend como secundário. Seria interessante que pessoas como você que tem uma grande influência além de respeito começar a propagar mais estas vias.
Como sempre termino dizendo: Com o auxílio de suas vídeo aulas me tornei um profissional.
Obrigado.
Blz Junior, realmente, talvez da maneira q mostrei naquela época, era mais complicado do que fiz nesse tutorial :D. A escolher de usar cms ou não, vai ser qual é mais fácil, rápido de criar e manter. Provavelmente vou começar a fazer tutorial sobre cms, e-commerce e framework. Fico realmente feliz e ter poder ajudado um pouco no seu aprendizado. abrs
Esta aplicação se adapta ao Opencart?
Desculpe-me se a pergunta for muito primária, uma vez que não domino php.
Estou com esse problema de tamanho e cor, uma vez que não consigo adicionar uma certa quantidade de P da camisa rosa(por exemplo) e uma certa quantidade de P da camisa azul, de mesma estampa. Não sei se está bem explicado.
Poderia me dar uma luz?
Obrigado
Eduardo, esse tutorial não se aplica ao opencart. No caso do opencart, você consegue informar a quantidade de cada item, exemplo camisas tamanho P. Mas quando vc precisa mescla, tipo, camisas tamanho p, e cor azul, acho q vc não consegue juntas as duas opções e defini quantidade desse produto especifico.
Obrigado!
Você teria alguma solução para minha necessidade? Mesmo que eu tenha que pagar, preciso resolver isso. Ou teria uma indicação de quem possa fazer a programação para mim?
No aguardo.
Eduardo, realmente não conheço uma solução, só realmente teria que mudar algo no opencart mesmo. Mas vc pode pesquisar os módulos no site do opencart , as vezes já tem uma solução
Olá David,
Eu tenho uma página com a lista dos produtos, ex: produtos.php, no link do botão comprar o
<a href="carrinho.php?acao=add&cod=”>Comprar
No script está chamando por post, neste caso como devo fazer esta chamada do arquivo que lista os produtos.
Agradeço a atenção.
Andreia, no caso vc vai substitui o link, por um formulário, passando essas informações. Cada produto terá um formulário, com campo oculto. Veja sua duvida novamente, creio que esse tutorial pode realmente complicar, lá no outro posto, coloquei um exemplo como vc pode fazer:
https://www.davidchc.com.br/video-aula/php/carrinho-de-compras-com-php/#comment-615
Olá David,
muito obrigada pela paciência.
Gente pequena querendo fazer trabalho de gente grande não dá certo…
Andreia, mas tem q tentar fazer, essa é unica maneira q a gente aprende.
Você poderia fazer essa aula em vídeo depois ? brigada
Naiara, ultimamente está muito complicado fazer videoaula, mas conseguindo um tempo, eu faço sim. abrs
David,
Estou tentando pela primeira vez (e na milesima tentativa) implantar um carrinho de compras pagseguro no meu blog. Estou fazendo so com html que e o maximo que a minha capacidade de programadora pode ir. Com muitas tentativas consegui inserir um dropdown com tamanho e cor. O botao esta funcionando, porem cada vez que e clicado ele adiciona o novo produto ao carrinho pagseguro mas so mostra o ultimo produto. Voce poderir ajudar uma pessoa desesperada!!!
Muito obrigada
Bianca
Bianca, no caso vc precisará utilizar uma linguagem de programação, no caso utilizei o PHP, só com HTML fica complicado. Talvez se não for para estudo, e sim para um negocio seu, seria interessante utilizar e-commerce pronto, como o opencart que é bem leve e facil de mexer, e tem já módulos de pagamento. Se quiser algo mais robusto, tem o magento. Se tiver utilizando wordpress, tem wp-ecommerce.
olá, amigo
segui todos os seus passos, mas não consegui recuperar nenhum valor em
$valor) >
<input type="text" name="qtd[]” value=”” />
R$
R$
<a href="carrinho.php?apagar=”>Excluir
seria possível um exemplo mais detalhado?
Meu problema é enviar, além do id_produto e quantidade, uma outra quantidade (informada pelo usuario) para que eu possa calcular um valor final para cada produto
Att
olá, amigo
segui todos os seus passos, mas não consegui recuperar nenhum valor no foreach{ […] }
seria possível um exemplo mais detalhado?
Meu problema é enviar, além do id_produto e quantidade, uma outra quantidade (informada pelo usuario) para que eu possa calcular um valor final para cada produto
Att
Junior, vc chegou assistir a video aula sobre carrinho de compras ? Nesse seu caso, vc pode fazer mais simples:
[php]
$_SESSION[‘carrinho’][$id_produto] = array(‘qtdPadrao’ => 1, ‘qtdUsuario’ => 5);
[/php]
Veja q criei um array multidimensional, onde antes guardava apenas a quantidade, agora guardo o array onde posso colocar a quantidade padrão, e a quantidade definida pelo usuário
Show esse tutorial…ajudou muito, obrigado mesmo. parabéns pelo seu ótimo trabalho.
Vlw jamilton
Obrigado pelo tutorial, muito bom!
Minha duvida é a seguinte, vi que algumas pessoas querem apenas fazer algo simples, continuando com o script do carrinho anterior, mas adicionando essa feature nova.
Estou com a mesma duvida, vi que tu fala pra criar um array multidimensional, mas eu não entendi aonde isso deve ser aplicado, pode ajudar?
Olá Leandro, recomendo dá uma olhada sobre uma videoaula sobre array q fiz, q pode te ajudar a entender melhor esse tutorial
https://www.davidchc.com.br/video-aula/php/entendendo-array-no-php/
Olá,
tenho carrinho de compras funcionando perfeitamente conforme seu primeiro tutorial… agora estou fazendo para colocar opções nos produtos mas estou com problemas.
Tem uma parte do seu código (segue abaixo) que não está fechando.
$valor) >
<input type="text" name="qtd[]” value=”” />
R$
R$
<a href="carrinho.php?apagar=”>Excluir
Erro que aparece:
Parse error: parse error, unexpected ‘<' in C:\wamp\www\latinahaus\carrinho2.php on line 73
Até já tentei algumas formas mas ai gera erro no
Preciso de sua ajuda.
Muito obrigado.
Ronaldo
Código
$valor) >
<input type="text" name="qtd[]” value=”” />
R$
R$
<a href="carrinho.php?apagar=”>Excluir
Olá,
Preciso de sua ajuda… segui o tutorial e não funciona, ou seja, não estou conseguindo… ele está dando erro no foreach($produtos as $indice => $valor) com o final … os itens não entram no carrinho…
Tem uma forma de enviar os arquivos para me ajudar?
Ronaldo, vc chegou iniciar o session_start no arquivo do carrinho?
Sim coloquei… já tenho o carrinho funcionando conforme o outro tutorial, uso com pagseguro e tudo funciona bem, tanto para pagar quanto para o retorno.
O meu problema esta em adicionar opções nos produtos. Tem como mandar o código para você olhar?
Como enviar tudo que está no carrinho para um email ou em uma tabela no BD???
Pedro, tenho um tutorial ensinando a como enviar para o pagseguro as informações, é o mesmo principio
https://www.davidchc.com.br/tutoriais/php-tutoriais/integracao-com-pagseguro/
https://www.davidchc.com.br/tutoriais/php-tutoriais/trabalhando-com-retorno-automatico-do-pagseguro/
Olá David!
Peguei seus scripts e montei o exemplo no meu servidor local, quase tudo funcionou. O que acho estranho é que a qtd que é definida como 1 dentro da class – public function adicionar($id, $qtd = 1, $cor_id= 0){ – aparece sempre zerada como podes ver nesse print_r Array ( [1:1] => Array ( [produto] => img_7776 [preco] => 9 [qtd] => 0 [subtotal] => 0 [cor] => 15×21 ) ). Podes me dar um help? Abs. Parabéns pelo trabalho.
David, grato pela atenção! Consegui resolver. Valeu.
Não deu tempo não pra responder, rs. O importante q vc conseguiu resolver a questão. abrs
Bom dia , teria os fontes para baixar, pois nesse novo modelo, não estão sendo exibidos os produtos adicionados ao carrinho, no código da video aula funciona legal, mas esse com a classe não está aprecendo, o que poderia ser, carrinho fica em branco?
Desculpe, favor esquecer a pergunta, consegui resolver!
Só gostaria de saber se teria como adicionar a opção de tamanho, seria complicado adicionar essa opção?
Dartanhan, vc pode fazer da mesma maneira, adicionando mais um item no como :
[php]
public function adicionar($id, $qtd = 1, $cor_id=null, $tamanho_id=null){
[/php]
David, cnsegu fazer todo o carrinho, muti obrigado mesmo, sua ajuda foi fundamental, só preciso de uma coisa, como eu faria para adicionar ao meu carrinho o valor do frete, uma vez que ele já está todo montado, tentei fazer assim, criei uma função na classe carrinho de calcular frete mas não tive muito sucesso, fiz assim:
public function calcularFrete($cod_servico, $cep_origem, $cep_destino, $peso, $altura, $largura, $comprimento, $valor_declarado){
$correios = “http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?nCdEmpresa=&sDsSenha=&sCepOrigem=”.$cep_origem.”&sCepDestino=”.$cep_destino.”&nVlPeso=”.$peso.”&nCdFormato=1&nVlComprimento=”.$comprimento.”&nVlAltura=”.$altura.”&nVlLargura=”.$largura.”&sCdMaoPropria=n&nVlValorDeclarado=”.$valor_declarado.”&sCdAvisoRecebimento=n&nCdServico=”.$cod_servico.”&nVlDiametro=0&StrRetorno=xml”;
$xml = simplexml_load_file($correios);
if($xml->cServico->Erro == ‘0’){
// return $xml->cServico->Valor;
//inicia a variável com array
$result = array();
foreach($_SESSION[‘carrinho’] as $indice){
$result[$indice][‘frete’] = $xml->cServico->Valor;
}
}else{
return false;
}
}
Tentei seguir a mesma lógica do listarProdutos(), mas não tive sucesso, como posso adicionar e pegar esse valor?
@Dartanhan, eu tenho um exemplo criando uma classe pra frete, q pode te ajudar
https://gist.github.com/davidchc/5326321
Ola David, primeiramente gostaria de lhe dar os parabéns pelo tutorial. Sou novo em php, mas eu tenho que desenvolver uma loja de camisetas e o mais rapido possível. Eu consegui implementar o código da video aula, mas como eu preciso inserir opçoes de tamanho e cor, dei uma olhada nesse tutorial, mas não consegui centender como é que eu vo fazer a implementação…não teria como você me passar o código completo da loja por email? ou me explicar melhor como é que eu adiciono opções de cor?
Gustavo, se precisa desenvolver uma loja virtual rapido, recomendo vc adotar o e-commerce, pq terão todos os recursos, um acho que é interessante é opencart e aqui tem muito material em português sobre opencart brasil,
David, obrigado!!
O opencart é a solução do meu maior problema que é o tempo…
Ola David, você me indicou este tutorial para solucionar o problema de opções para os produtos, gostei muito consegui fazer obrigado!, mas tenho uma dúvida sobre o uso da função Sprintf neste trecho,
if(is_null($cor_id)){
$indice = sprintf(‘%s:%s’, (int)$id, 0);
}else{
$indice = sprintf(‘%s:%s’, (int)$id, (int)$cor_id);
Poderia me explicar mais detalhadamente,pois quero inserir a opção de tamanho e sexo da mesma maneira que a da cor, pois acho mais fácil…
Ei David consegui entender esquece a pergunta anterior,
if(is_null($cor_id)){
$indice = sprintf(‘%s:%s’, (int)$id, 0);
}else{
$indice = sprintf(‘%s:%s’, (int)$id, (int)$cor_id);
No caso, a fução coloca a $cor_id ao lado de $id dentro do $indice, como coloquei o tamanho(tamanho_id)
ficou assim
if(is_null($tamanho_id)){
$indice = sprintf(‘%s:%s:%s’, (int)$id, (int)$cor_id, 0);
}else{
$indice = sprintf(‘%s:%s:%s’, (int)$id, (int)$cor_id, (int)$tamanho_id);
}
Fiz o mesmo com a parte do sexo(sexo_id) e depois so separei os 3 do $id usando explode, e copiei as outras partes, deu certo.
Obrigado!
Ola novamente David, agora que implementei opções ao carrinho estou com dificuldades na integração com o pág seguro, o problema se encontra na hora de selecionar e adcionar os produtos ao pag seguro, nesta passagem :
* Iremos nessa parte selecionar os produtos e adicionar
$ids = implode(‘, ‘,array_keys($_SESSION[‘carrinho’]));
$sql = sprintf(“SELECT * FROM produtos WHERE id IN (%s)”, $ids);
$query = mysql_query($sql);
while ($row = mysql_fetch_assoc($query)){
$id = $row[‘id’];
$produto = $row[‘produto’];
$qtd = $_SESSION[‘carrinho’][$id];
$preco = $row[‘preco’];
$peso = $row[‘peso’];
No caso ele utiliza a sessão carrinho para resgatar os valores, mas no carrinho “com opções” não funciona, até pq é diferente, ja tentei utilizar a instancia $cart, e a variável $valor de exibição, e montar uma sessao para substituir a do carrinho, mas não deu certo.., pode me dar uma luz?? desde ja, obrigado!
Diego , vc já tem todos os produtos chamando o listarProdutos
[php]
<?php
session_start();
//Instancia o Carrinho
$cart = new Carrinho();
$produtos = $cart->listarProdutos();
foreach ($produtos as $key => $row){
list($id, $cor_id) = explode(‘:’, $key);
$produto = $row[‘produto’];
$qtd = $row[‘qtd’];
$preco = $row[‘preco’];
$peso = $row[‘peso’];
$pagseguro->addItem($id, $produto, $qtd, $preco, $peso);
}
[/php]
Ola David, ja estava com essa duvida faz um bom tempo…hoje vim conferir se tinha me respondido, e logo que vi sua resposta, fui ao problema e resolvi em apenas alguns minutos, muito obrigado e até mais!
Desculpa por não ter agradecido antes, obrigado David, graças a você consegui o que queria, e acabei entendendo melhor! Obrigado.
Olá David!
Primeiramente, agradeço pela força de sempre. Graças as suas vídeo aulas aprendi muita coisa.
Estava precisando de um sistema que pudesse me trazer os valores dos atributos dos produtos e encontrei seu exemplo.
Tenho só uma pequena dúvida.
Você setou o $result[$indice][‘qtd’] como $row=[‘qtd’]
Minha dúvida é o seguinte, mesmo que eu tenha o campo ‘qtd’ que é o valor de produtos em estoque no banco de dados, o valor deste ‘qtd’ não seria o que esta passando pelo $_GET ou pelo $_POST ?
Ficaria assim:
$result[$indice][‘qtd’] = $qtd;
Abraço.
Esquece eu viajei aqui. Como usei variáveis diferentes eu acabei me confundindo com ela.
Abrigado David.
David, curto muito seus artigos e seus tutoriais principalmente aprendi muito pegando e fazendo mesmo, boa parte deles.
Ontem usando novamente este artigo me surgiu uma questão que pode ajudar o pessoal também.
Pelo que eu entendi estou enviando o valor da cor apenas uma vez, e caso eu queira troca-lá, como devo fazer?
Retiro o índice para não repetir e incluo novamente com o novo valor?
No caso, seu indice é composto de o ID do Produto e a COR. O q vc pode fazer, quando ter q alterar a COR, vc exclui esse indice, e adiciona esse novo, com ID e nova cor.
David, obrigado pelo tutorial. Eu fiz meu carrinho me baseando na sua video-aula. Agora gostaria de atualizar para esse modelo novo. Só que não consigo entender o que do antigo permanece e o que deve ser alterado ou excluido. Outra duvida: quanto a classe Carrinho.php, vc colocou algumas variaveis, por exemplo nessa passagem: ”public function adicionar($id, $qtd = 1, $cor_id=null)…” As variais $ID e $COR_ID . de onde está vindo o valor dessas variaveis? Abraço mestre! ^^
Ao invés de tentar fazer modificação, tente refazer, assim fica mais facil.
Se lembra na videoaula, q eu usava o ID do Produto pra ser chave de um array na SESSION ? É esse ID pra informar, veja q no proprio codigo coloco um comentário, informando quais são os valores:
@param integer $id é código do produto adicionado
@param integer $qtd é quantidade
@param integer $cor_id é a cor do produto
Assim ficaria a index.php, para adicionar o produto ao carrinho:
http://pastebin.com/3dCiuJMX
Olá David, só uma dúvida que fiquei mas não consegui resolver, portanto vou postar aqui pra quem sabe auxiliar mais gente: como fazer com que o carrinho fique na mesma página, logo abaixo das seleções de produtos?
exemplo:
combobox 01 – produtos
combobox 02 – característica do produto
————–
listagem do carrinho (igual a sua aula)
item 01 – qtde, cor, etc…
item 02 – qtde, cor, etc…
Obrigado, abraços
Eduardo, vc quer tudo fique na página do produto, é isso?
exato! desta forma eu posso selecionar os itens, jogar na lista dos escolhidos (pra fazer mais uma triagem) e poder fazer a comparação, esta na verdade é a complicação. valeu pela ajuda
Isso mesmo, poderia ajudar?
Sim, isso mesmo, veja esta pagina de exemplo: http://www.php2go.com.br/php2go/examples/
Obrigado
Entendi, Isso seria em Ajax Eduardo, vc pode utilizar o jQuery pra enviar pra un arquivo php , q fará add ou remover, ou alterar os dados do carrinho, e ao retornar, vc retorna uma listagem dos itens add, e atribui uma div. Um tutorial falando sobre ajax:
http://wbruno.com.br/ajax/enviar-formulario-para-php-sem-refresh-jquery-ajax/
Boa tarde David, incrível e simples o funcionamento do seu carrinho é excelente é um dos melhores que consegui encontrar para dar norteamento para o meu projeto, porém já tentei muito aqui para fazer o carrinho de compras enviar todos os dados para o API do pag seguro, por acaso você tem um exemplo para me ajudar, não sei mais o que fazer se puder ajudar ficarei grato, desde já agradeço pela compreensão e o apoio.
Salve David! Cara, tenho certeza que vai poder me ajudar…
Estou tentando dar uma quebra de linha/ou ocultar(, 2, ‘,’, ‘.) os 2 números depois da vírgula.
Como podemos fazer isso?
Já tentei colocar um span após , 2, ‘,’, ‘. e não deu certo.
Grato desde já.
Blz Vladimir. Vc não quer mostrar os valores decimais,é isso?
Como ficaria com variações de preços, tipo tem um preço para cada tamanho, pequeno, medio, grande como ficaria o total do produto com essas variações?
Omor, vc precisar criar uma tabela apenas pra preço q relacionaria o produto com as variações de opção
Olá david caso eu adicione um produto X tamanho P cor Verde
e clique em continuar compraro e adiciono novamente
produto X tamanho P cor Verde
ele nao atualiza a quantidade sozinho…
apenas manual?
Willian, sim, no caso só manual, mas vc pode alterar fazendo assim:
[php]
if(!isset($_SESSION[‘carrinho’][$indice])){
$_SESSION[‘carrinho’][$indice] = (int)$qtd;
}else{
$_SESSION[‘carrinho’][$indice] += ;
}
[/php]
Se não tiver o produto, e adicionar, se tiver e soma +1 pra quantidade
Array
(
[cor_id] => Array
(
[0] => 4
[1] => 3
)
)
Notice: Array to string conversion in C:\xampp\htdocs\carrinhoOO\classes\Carrinho.class.php on line 61
Array
(
[0] => Array
(
[0] => 4
[1] => 3
)
)
Notice: Trying to get property of non-object in C:\xampp\htdocs\carrinhoOO\classes\Carrinho.class.php on line 66
if($items[‘cor_id’] > 0){
$query_cor = BD::conn()->prepare(“SELECT * FROM `cores` WHERE id = ?”);
$query_cor->execute(array($items[‘cor_id’])); /* linha 61 */
$fetchCor = $query_cor->fetchObject();
$retorno[$indice][‘cor’] = $fetchCor->cor; /* linha 66 */
}
como faço ele ilimitado david…
cores o cara poder marcar 10 , 20 , 30 o tanto que ele quizer
Fernando, a quantidade cores, e opções pode ser ilimitados.
TABELA opcoes (CORES, TAMANHO)
TABELA opcoes_valores (azul, vermelho, grande, pequeno)
TABELA produto_opcoes => aqui relaciona q opcoes terao os produtos
TABELA produto_opcoes_valores => aqui relacionao os valores da opcoes com produto
Fernando, verifica se referencia no array existe
[php]
if(isset($items[‘cor_id’]) > && is_numeric($items[‘cor_id’]) && $items[‘cor_id’] > 0){
$query_cor = BD::conn()->prepare(“SELECT * FROM `cores` WHERE id = ?”);
$query_cor->execute(array($items[‘cor_id’])); /* linha 61 */
$fetchCor = $query_cor->fetchObject();
$retorno[$indice][‘cor’] = $fetchCor->cor; /* linha 66 */
}
[/php]
Boa tarde David,
Assisti o vídeo que vc fez sobre o carrinho de compras e agora gostaria de implementar a cor no código relacionado com o carrinho de compras.
Eu tenho uma dúvida relacionada com o Banco de Dados, ex:
O campo cor_id é a coluna de uma tabela chamada cores ou uma coluna da própria tabela produtos?
Quais campos preciso adicionar no Banco de Dados.
Outra dúvida é relacionada a página Index.php, como vai ficar?
Desde já, obrigado!
Lucas, nesse caso, se for cor, vc teria o seguinte:
TABELA cores => aqui teria todas cores cadastradas
idCor
nomeCor
TABELA produto_cores => aqui teria o ID da cor e o ID do produto.
idProdutoCor
idCor
idProduto
Esse idProdutoCor, q será relacionado ao carrinho, dessa forma vc consegue pesquisar, qual a cor q pertence ao produto
Boa Tarde blz, tentei de todas maneira copiando o seu script, digitando e nao da certo, poderia disponibilicar o codigo funcionando, e eu somente mudo as tabelas ak para a minha, fico no aguardo, obrigado
Boa tarde, David. Tudo bem?
Estou tendo um problema que não chega a ser relacionado com o post, mas lá vai.
Os produtos da minha loja seguem o padrão do bloco k, onde cada variação de cor x tamanho do produto é tratado como um produto separado, sendo assim preciso que cada variação de cor seja um produto diferente.
Ex.: Manta para sofá 230cm x 250cm laranja = Cod: masof230250lr1
Manta para sofá 230cm x 270cm azul = Cod: masof230270az1
Eu gostaria de saber se há algum módulo que faça com que as opções de cores ou tamanhos direcionem para links diferentes.
Existe uma maneira de resolver isso?
Uso opencart 2.1.0.1. Vlw
Leonardo, pra vc fazer isso com OpenCart, por padrão, infelizmente não tem como. Isso vc consegue se cadastrar cada variação como produto, mas se vc tiver muitos, fica inviável.
David, eu segui o primeiro tutorial, e estou tendo muita dificuldades de adaptar em incluir a opção de cor com este segundo, teria uma solução mais simples apenas para exibir o valor da cor no titulo do produto no carrinho com base no primeiro tutoral ?
Na verdade preciso inlcuir tamanho e cor.
Boa tarde, David.
Não entendi como passar a cor da descrição para o carrinho, como tenho que mandar a variável da cor para o carrinho?
Parabéns , estou usando todas as suas informações!!!
Boa noite, David.
Resolvi o meu problema, agora outro: como faço para recuperar de novo a variável da cor para gravar no banco de dados finalizando o carrinho.
Espero que vc veja, estou no final do meu prazo e gostaria de finalizar usando sua solução que gostei muito!!!
Abraço
Luiz, no caso se pressupõe que esse atributo (cor) seja um campo de um tabela, exemplo:
TABELA cores
id
nome
codigo
TABELA produtos
id
nome
preco
TABELA produtos_cores
produto_id
cor_id
São 3 tabelas, uma dos produtos, um das cores, q uma tabela que vai relacionar a tabela dos produtos com as cores, pq um produto poderia ter mas de uma cor.
Então com isso, você consegue ver essa parte:
[php]
$_SESSION[‘carrinho’][ID:COR_ID] = 1;
[/php]
Usando o codigo, para salvar produto com cor no carrinho
[php]
$carrinho = new Carrinho();
$produto_id = $_POST[‘produto_id’];
$cor_id = $_POST[‘cor_id’];
$carrinho->adicionar($produto_id, 1, $cor_id);
[/php]
Na hora de salvar no banco de dados, vc pode utilizar o método listarProdutos, que vai retornar o nome da cor, na variavel cor. Você pode incrementar, add também o id da cor, se preferir ao salvar no banco de dados.
Na sua tabela pra salvar os produtos do pedido, vc pode salvar com cor do pedido,se não tiver cor, vc pode deixar em branco
David, veja se entendi, desculpe minha ignorância, na pagina finalizar chamo novamente listarPedidos sem as atualizações do carrinho, ok? pego os indeces da função (exemplo: $result[$indice][‘preco’] = $row[‘preco’];) e passo para uma variável, aí faço um insert dentro do foreach, é isso?
Exatamente, vc vai pegar os dados add no carrinho, e irá inserir na tabela dos itens dos pedidos
Ola David!
Em primeiro lugar gostaria de parabeniza-lo pela paciência de responder á todos que recorrem à você, é um dos unicos que faz isso, mas vamos a questão fiz tudo conforme o tutorial, porém não aparece nada no carrinho, já verifiquei a pagina em que posta as informações como produto, cor, quantidade está ok com ela!
Ola David,
Copiei seu codigo completo, mas não aparece nada quando acesso o carrinho, poderia me ajudar?
Grato
aparece alguma mensagem erro ? Você inicializou a session, com session_start na hora de recuperar as informações ?
Não aparece nenhum mensagem de erro, no ccarrinho a session esta assim :
session_start();
if(!isset($_SESSION[‘carrinho’])){
$_SESSION[‘carrinho’] = array();
só aparece o cabeçalho do carrinho, você pode me ajudar?
Silva publica o codigo no https://pastebin.com e depois me enviei.
A pasta do carrinho: https://pastebin.com/WctLfMkf
Me envie tbm a pagina que faz o envio dos dados para o carrinho.
A pagina de envio é : https://pastebin.com/KbkJ1rcg
O arquivo Classe :https://pastebin.com/gnmuwqWj
Silvo, no caso vendo o código, você não tem o $_POST[‘acao’], você está utilizando $_GET, q vc está passando o action. POr isso q não está add. Quando ele vai verificar se tem $_POST[‘acao’], ele não possui. Vc tem 2 possibilidades: ou criar um input:hidden com name=”acao” e o value=”add” ou no carrinho.php, vc alterar a verificação do $_POST[‘acao’] para $_GET[‘acao’]
Obrigado, mas ainda não esta populando com o produto e nem o preço!
Agora depois de adicionar de $cart->adicionar($id_produto, $qtd, $cor_id); Faz assim:
print_r($_SESSION[‘carrinho’]);
exit;
Ele irá printar que está na session no carrinho. Senão tiver mostrando nada, altera para.
print_r($_POST);
exit;
Veja se está passando os dados do POST corretamente pra ver se tá add na classe
Coloquei
print_r($_POST);
exit;
Array ( [acao] => add [id_produto] => 1 [produto] => Calcinha [preco] => 10.00 [cor_id] => 1 [qtd] => 1 [enviar] => Enviar )
Certo. E add a $_SESSION[‘carrinho’]
Como vejo isso?
Da mesma forma q do POST:
print_r($_SESSION[‘carrinho’]);
exit;
Noa aparece nada
Com
print_r($_SESSION[‘carrinho’]);
exit;
não aparece nada!
com
print_r($_POST);
exit;
Array ( [acao] => add [id_produto] => 1 [produto] => Calcinha [preco] => 10.00 [cor_id] => 1 [qtd] => 1 [enviar] => Enviar )
Desculpe-me atrapalha-lo num final de semana, mas isso é no carrinho e não na classe né?
Isso no carrinho, depois do metodo adicionar
Ok, foi o que fiz, mas não popula o carrinho”
Ola David,
Bom dia como vai? Espero que bem!
em nosso papo esqueci de mencionar que quando publiquei o carrinho no servidor de u o seguinte aviso:
Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent (output started at /home/capal654/public_html/comercio/carrinho.php:1) in /home/capal654/public_html/comercio/carrinho.php on line 3
A pergunta é a seguinte tem algum problema? ou só remover esse aviso?
outra coisa, substitui no carrinho:
$valor) :?> por
$row) :?>, aí começou aparecer as cores, mas nada do produto ou preço, desculpe minha insistência e de estar te ocupando o tempo todo!
Silvio, esse erro é devido tem alguma saída antes do session_start, veja se não tem algumas espaço antes do
Sobre o erro, realmente não tinha reparado. $row[‘produto’]. ‘ – ‘.$row[‘cor’], Altere para $valor[‘produto’]. ‘ – ‘.$valor[‘cor’]