Carrinho De Compras
#1
Posted 01 July 2014 - 11:52 AM
Obrigada
#2
Posted 01 July 2014 - 03:06 PM
https://github.com/damnpoet/yiicart
#3
Posted 01 July 2014 - 08:05 PM
Wanderson, on 01 July 2014 - 03:06 PM, said:
https://github.com/damnpoet/yiicart
Wanderson eu achei muito interessante este projeto... so que vc já fez o teste com ele? vc ja aplicou em algum projeto? Tem a tradução para portugues?
Valew
#4
Posted 01 July 2014 - 08:15 PM
AnaTavares, on 01 July 2014 - 11:52 AM, said:
Obrigada
Ana eu utilizei sessão como segue abaixo:
CarrinhoController.php
public function actionIndex() { if(isset($_POST['add'])){ $produto = Produto::model()->findByPk($_POST['add']['id']); $quantidade = $_POST['add']['qtde']; if($produto->estoque <= 0): Yii::app()->user->setFlash('error','Desculpe, mas não possuimos estoque do item '.$produto->nome.''); $quantidade = $produto->estoque; else: if($quantidade > $produto->estoque): Yii::app()->user->setFlash('error','Desculpe, mas só é possível comprar até '.$produto->estoque.' unidades do item '.$produto->nome.''); $quantidade = $produto->estoque; Cesta::adicionar($_POST['add']['id'],$quantidade); else: if($produto->estoque == 0): Yii::app()->user->setFlash('error','Desculpe, mas não possuimos estoque do item '.$produto->nome.''); else: Cesta::adicionar($_POST['add']['id'],$quantidade); endif; endif; endif; } if(Yii::app()->request->isAjaxRequest){ if(isset($_POST['excluir'])){ Cesta::excluir($_POST['excluir']); } if(isset($_POST['carrinho'])){ foreach ($_POST['carrinho'] as $id => $qtde){ $produto = Produto::model()->findByPk($id); $quantidade = $qtde; if($quantidade > $produto->estoque): $quantidade = $produto->estoque; Cesta::alterar($id, $quantidade); else: Cesta::alterar($id, $quantidade); endif; } Cesta::frete($_POST['txtcep'],$_POST['TipoFrete']); } $this->renderPartial('_carrinho', array('carrinho'=>Cesta::listarCarrinho()), false, false); }else{ $this->render('index', array('carrinho'=>Cesta::listarCarrinho())); } } public function actionCalcularfrete(){ $cep = $_POST['txtcep']; $validaCEP = "http://cep.republicavirtual.com.br/web_cep.php?cep=".$cep."&formato=xml"; $xml = @simplexml_load_file($validaCEP); if($xml->resultado == 0){ echo "<span class='hint label label-warning'> Cep não encontrado, verifique o CEP digitado. </span>"; }else{ $kilo = Cesta::calcularKilo(); $valorDeclarado = Cesta::valorTotal(); $fretePAC = Cesta::calculaFrete('41106','17506-040',$cep,$kilo); $freteSEDEX = Cesta::calculaFrete('40010','17506-040',$cep,$kilo); echo CHtml::radioButtonList('TipoFrete','',array('PAC'=>'PAC - Prazo estimado de '.$fretePAC->PrazoEntrega.' dias úteis - <span class="price">R$ '.$fretePAC->Valor.'</span>', 'SEDEX'=>'SEDEX - Prazo estimado de '.$freteSEDEX->PrazoEntrega.' dias úteis - <span class="price">R$ '.$freteSEDEX->Valor.'</span>'), array('separator'=>false))."<div class='clearfix'></div>"; } }
Components/Cesta.php
class Cesta { public function __construct() { if(!isset($_SESSION['cestadecompra'])){ $_SESSION['cestadecompra'] = array(); } } public function adicionar($id, $qtde = 1){ $produto = Produto::model()->findByPk($id); session_start(); $id = (int)$id; $qtde = (int)$qtde; $qtde = (empty($qtde) || $qtde == 0) ? 1 : $qtde; if(isset($_SESSION['cestadecompra']['produto'][$id])){ $_SESSION['cestadecompra']['produto'][$id] += 1; if($_SESSION['cestadecompra']['produto'][$id] > $produto->estoque): $_SESSION['cestadecompra']['produto'][$id] = $produto->estoque; endif; }else{ $_SESSION['cestadecompra']['produto'][$id] = $qtde; } } public function verificaCarrinho(){ session_start(); if(isset($_SESSION['cestadecompra'])){ if(sizeof($_SESSION['cestadecompra'])>0){ return true; }else{ return false; } }else{ return false; } } public function alterar($id, $qtde){ $produto = Produto::model()->findByPk($id); session_start(); $id = (int)$id; $qtde = (int)$qtde; $qtde = (empty($qtde) || $qtde == 0) ? 1 : $qtde; if(isset($_SESSION['cestadecompra']['produto'][$id])){ $_SESSION['cestadecompra']['produto'][$id] = $qtde; if($_SESSION['cestadecompra']['produto'][$id] > $produto->estoque): $_SESSION['cestadecompra']['produto'][$id] = $produto->estoque; endif; } } public function excluir($id){ session_start(); unset($_SESSION['cestadecompra']['produto'][$id]); } public function listarProdutos(){ session_start(); $result = array(); if(sizeof($_SESSION['cestadecompra']['produto']) >0 ){ foreach($_SESSION['cestadecompra']['produto'] as $id => $qtde){ $prod = Produto::model()->findByPk($id); $result[$id]['id'] = $prod->id; $result[$id]['parent'] = $prod->categorias->parent; $result[$id]['idcategoria'] = $prod->idcategoria; $result[$id]['nomecategoria'] = $prod->categorias->nome; $result[$id]['foto'] = $prod->fotoprodutos[0]->arquivo; $result[$id]['nome'] = $prod->nome; $result[$id]['preco'] = $prod->precovenda; $result[$id]['peso'] = $prod->peso * $qtde; $result[$id]['qtde'] = $qtde; $result[$id]['codigo'] = str_pad($prod->codigo, 10, "0", STR_PAD_LEFT); $result[$id]['subtotal'] = $prod->precovenda * $qtde; } } return $result; } public function listarCarrinhoWidget(){ $geral = array(); $geral['carrinho'] = self::listarProdutos(); $geral['total'] = self::valorTotal(); return $geral; } public function listarCarrinho(){ $frete = self::frete(); $valorFrete = $frete['valorFrete']; $valorFrete = str_replace(',','.',str_replace('.','',$valorFrete)); $geral = array(); $geral['carrinho'] = self::listarProdutos(); $geral['total'] = self::valorTotal(); $geral['totalGeral'] = self::valorTotal() + $valorFrete; $geral['frete'] = self::frete(); return $geral; } public function frete($cep = '', $tipo = ''){ session_start(); $cepRow = array(); if(!(empty($cep) && empty($tipo))){ $_SESSION['frete']['tipo'] = $tipo; $_SESSION['frete']['cep'] = $cep; $kilo = self::calcularKilo(); $valorDeclarado = number_format(self::valorTotal(),2,",","."); $fretePAC = Cesta::calculaFrete('41106','17506-040',$cep,$kilo, $valorDeclarado); $freteSEDEX = Cesta::calculaFrete('40010','17506-040',$cep,$kilo, $valorDeclarado); $cepRow['conteudo'] = CHtml::radioButtonList('TipoFrete','',array('PAC'=>'PAC - Prazo estimado de '.$fretePAC->PrazoEntrega.' dias úteis - <span class="price">R$ '.$fretePAC->Valor.'</span>', 'SEDEX'=>'SEDEX - Prazo estimado de '.$freteSEDEX->PrazoEntrega.' dias úteis - <span class="price">R$ '.$freteSEDEX->Valor.'</span>'), array('separator'=>false))."<div class='clearfix'></div>"; $cepRow['conteudo'] .= '<input type="hidden" name="valorPAC" value="'.$fretePAC->Valor.'" />'; $cepRow['conteudo'] .= '<input type="hidden" name="valorSEDEX" value="'.$freteSEDEX->Valor.'" />'; $cepRow['cep'] = $cep; $cepRow['tipo'] = $tipo; return $cepRow; }elseif($_SESSION['frete']['tipo'] != '' && $_SESSION['frete']['cep'] != ''){ $kilo = self::calcularKilo(); $valorDeclarado = number_format(self::valorTotal(),2,",","."); $fretePAC = Cesta::calculaFrete('41106','17506-040',$_SESSION['frete']['cep'],$kilo, $valorDeclarado); $freteSEDEX = Cesta::calculaFrete('40010','17506-040',$_SESSION['frete']['cep'],$kilo, $valorDeclarado); $cepRow['conteudo'] = CHtml::radioButtonList('TipoFrete',$_SESSION['frete']['tipo'],array('PAC'=>'PAC - Prazo estimado de '.$fretePAC->PrazoEntrega.' dias úteis - <span class="price">R$ '.$fretePAC->Valor.'</span>', 'SEDEX'=>'SEDEX - Prazo estimado de '.$freteSEDEX->PrazoEntrega.' dias úteis - <span class="price">R$ '.$freteSEDEX->Valor.'</span>'), array('separator'=>false))."<div class='clearfix'></div>"; if($_SESSION['frete']['tipo'] == 'PAC'){ $cepRow['valorFrete'] = $fretePAC->Valor; }else{ $cepRow['valorFrete'] = $freteSEDEX->Valor; } $cepRow['cep'] = $_SESSION['frete']['cep']; $cepRow['tipo'] = $_SESSION['frete']['tipo']; return $cepRow; } } public function valorTotal(){ $produto = self::listarProdutos(); $total = 0; foreach ($produto as $id => $row){ $total += $row['subtotal']; } return $total; } public function calcularKilo(){ $peso = self::listarProdutos(); $total = 0; foreach ($peso as $id => $row){ $total += $row['peso']; } return $total/1000; } public function calculaFrete($servico, $CEPorigem, $CEPdestino, $peso, $valor='1.00', $altura='4', $largura='12', $comprimento='16'){ //////////////////////////////////////////////// // Código dos Serviços dos Correios // 41106 PAC // 40010 SEDEX // 40045 SEDEX a Cobrar // 40215 SEDEX 10 //////////////////////////////////////////////// // URL do WebService $correios = "http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?nCdEmpresa=&sDsSenha=&sCepOrigem=".$CEPorigem."&sCepDestino=".$CEPdestino."&nVlPeso=".$peso."&nCdFormato=1&nVlComprimento=".$comprimento."&nVlAltura=".$altura."&nVlLargura=".$largura."&sCdMaoPropria=n&nVlValorDeclarado=".$valor."&sCdAvisoRecebimento=n&nCdServico=".$servico."&nVlDiametro=0&StrRetorno=xml"; // Carrega o XML de Retorno $xml = @simplexml_load_file($correios); // Verifica se não há erros if($xml->cServico->Erro == '0'){ return $xml->cServico; }else{ return false; } } }
#5
Posted 02 July 2014 - 08:31 AM
#6
Posted 06 July 2014 - 11:18 AM
Obrigada e agradeço a resposta desde já...
#7
Posted 08 July 2014 - 06:32 PM
AnaTavares, on 06 July 2014 - 11:18 AM, said:
Obrigada e agradeço a resposta desde já...
Ola Ana, como vc pode ver esta são as acoes do usuário, quando ele clica em comprar é submetido o id do produto e a quantidade selecionada. Está é a funcão do Add que por sua vez chama o método cesta::adicionar(), quando ele acessa o carrinho de compra ele tem a opçao de excluir o produto do carrinho, quando ele clica no botao excluir ele chama o metodo cesta::excluir, sobre o metodo lista ele retorna o array para que eu possa montar a tabela com os produtos do carrinho.
Esta é apenas uma ideia caso queira melhorar pode melhorar...sucesso!!!
#9
Posted 10 July 2014 - 08:34 AM
AnaTavares, on 09 July 2014 - 10:23 AM, said:
Segue o render do Carrinho, talvez ajude!!!
<?php if(sizeof($carrinho['carrinho']) == 0 ): ?> <br /><br /> <h4 class="titulo-carrinho">Não há produtos em seu carrinho.</h4> <p>Para inserir produtos no seu carrinho, navegue pelos departamentos ou utilize a busca do site. Ao encontrar os itens desejados, clique no botão Comprar.</p> <br /><a href="/" class="btn floatLeft"><i class="icon-chevron-left"></i> Voltar para a loja</a> <?php else: ?> <?php echo CHtml::beginForm('','post',array('class'=>'form-inline')); ?> <div class="btncarrinho"> <a href="/" class="btn floatLeft"><i class="icon-chevron-left"></i> Comprar mais produto</a> <a href="/carrinho/finalizarcompra" class="btn floatRightbtn btn-primary"><i class="icon-ok icon-white"></i> Finalizar Compra</a> <?php echo CHtml::ajaxLink( '<i class="icon-refresh"></i> Atualizar Valores', array('carrinho/index'), array('type' => 'POST', 'update'=>'#carrinho-compras' ), array('href' => Yii::app()->createUrl('carrinho/index'), 'class' => 'btn floatRightbtn' ) ); ?> </div> <div class="clearfix"></div> <table border="0" class="table table-striped table-condensed"> <thead> <tr> <th class="text-left" width="500">Produtos</th> <th>Excluir</th> <th>Quantidade</th> <th>Preço Unitário</th> <th width="100">Preço Total</th> </tr> </thead> <tfoot> <tr> <th colspan="4" class="line-height44">Subtotal:</th> <td>R$ <?php echo number_format($carrinho['total'],2,",", "."); ?></td> </tr> <tr> <td>Estimativa de Frete Informe seu CEP para calcular o valor do frete. <td colspan="3"> <label for="txtcep">CEP.:</label> <?php $this->widget('CMaskedTextField',array( 'name'=>'txtcep', 'value'=>$carrinho['frete']['cep'], 'mask'=>'99999-999', 'htmlOptions'=>array('class'=>'input-medium'), )); ?> <script> $("#txtcep").mask("99999-999"); </script> <a href="javascript:;" id="btncalcular" class="btn">Calcular</a> <?php Yii::app()->clientScript->registerScript('calcularfrete', " $('#btncalcular').live('click',function(e){ e.preventDefault(); $.ajax({ type:'POST', cache:false, url:'/carrinho/calcularfrete', data:{txtcep:$('#txtcep').val()}, success:function(data){ $('#resultadofrete').html(data); } }) }); "); ?> <div id="resultadofrete" class="controls-frete"> <?php echo $carrinho['frete']['conteudo']; ?> </div> </td> <td><?php echo ($carrinho['frete']['valorFrete'] == '') ? 'R$ 0,00' : 'R$ '.$carrinho['frete']['valorFrete']; ?></</td> </tr> <tr class="carrinho-total"> <th colspan="4" class="line-height44">Total:</th> <td>R$ <?php echo number_format($carrinho['totalGeral'],2,",", "."); ?></td> </tr> </tfoot> <tbody> <?php foreach($carrinho['carrinho'] as $cat): ?> <tr> <th width="500"> <?php if(empty($cat['foto'])): ?> <img src="/fotos/thumbs/produto-sem-foto.jpg" width="48" height="44" alt="Nome" /> <?php else: ?> <img src="/fotos/thumbs/<?php echo $cat['foto']; ?>" width="48" height="44" alt="Nome" /> <?php endif ?> <p> <?php if($cat['parent'] == 0): ?> <a href="<?php echo Yii::app()->createUrl('produtos/view',array('idloja'=>funcao::IdCategoriaPai($cat['idcategoria']),'loja'=>funcao::NomeCategoriaPai($cat['idcategoria']),'idprod'=>$cat['id'],'produto'=>funcao::slug($cat['nome']))) ?>"> <?php else: ?> <a href="<?php echo Yii::app()->createUrl('produtos/view',array('idloja'=>funcao::IdCategoriaPai($cat['idcategoria']),'loja'=>funcao::NomeCategoriaPai($cat['idcategoria']),'idcat'=>$cat['idcategoria'],'categoria'=>funcao::slug($cat['nomecategoria']),'idprod'=>$cat['id'],'produto'=>funcao::slug($cat['nome']))) ?>"> <?php endif; ?> <?php echo $cat['nome']; ?></a> <br /><span>Cod.: <?php echo $cat['codigo']; ?></span> </p> </th> <td> <?php echo CHtml::ajaxLink( '<i class="icon-remove"></i>', array('carrinho/index'), array('type' => 'POST', 'update'=>'#carrinho-compras', 'data' => array('excluir'=>$cat['id']) ), array('href' => Yii::app()->createUrl('carrinho/index'), 'class' => 'excluir-item', 'title' => 'Excluir' ) ); ?> </td> <td><input type="text" size="3" id="txtqtdecar" class="input-mini-mini" name="carrinho[<?php echo $cat['id']; ?>]" value="<?php echo $cat['qtde']; ?>" /></td> <td>R$ <?php echo number_format($cat['preco'],2,",", "."); ?></td> <td>R$ <?php echo number_format($cat['subtotal'],2,",", "."); ?></td> </tr> <?php endforeach; ?> </tbody> </table> <span class="aviso hint label label-important"> Para alterar a quantidade do(s) item(ns) acima, clique sobre a unidade e digite a quantidade desejada. Depois clique no botão <strong>"Atualizar valores"</strong>.<br /> O quantidade máxima de cada produto sempre vai ser o limite atual do nosso estoque. </span> <div class="btncarrinho"> <a href="/" class="btn floatLeft"><i class="icon-chevron-left"></i> Comprar mais produto</a> <a href="/carrinho/finalizarcompra" class="btn floatRightbtn btn-primary"><i class="icon-ok icon-white"></i> Finalizar Compra</a> <?php echo CHtml::ajaxLink( '<i class="icon-refresh"></i> Atualizar Valores', array('carrinho/index'), array('type' => 'POST', 'update'=>'#carrinho-compras' ), array('href' => Yii::app()->createUrl('carrinho/index'), 'class' => 'btn floatRightbtn' ) ); ?> </div> <?php echo CHtml::endForm(); ?> <?php endif; ?>
Sucesso!!!
#10
Posted 10 July 2014 - 03:20 PM
--
http://newerton.com.br/
https://linkedin.com/in/newerton
https://github.com/newerton/
--
Por favor, para saber que você ficou satisfeito com a resposta, clicar no botão de

#11
Posted 11 July 2014 - 10:40 AM
se conseguir resolver de uma forma diferente depois eu deixo aqui a minha solução