Ir para conteúdo
Fórum Script Brasil
  • 0

Alteração no Carrinho de compras


Carlos Rocha

Pergunta

Pessoal.

Bom dia!

Seguinte:

Tenho um carrinho de Compras, basico. Acontece que, na interface para uso dele, será o administrador que irá usá-lo para criar uma lista de produtos que será disponiblizadas para o seu cliente comprar.

Tipo assim: Tem o cadastro de produtos normal. Pore, nem todos os produtos o administrador colocará à dispozição dos seu clientes para que eles possam comprar. Então, estou usando um carrinho de compras para ele poder criar uma lista com os produtos desejados.

Acontece, que ele quer tambem, alterar o preço do produto no momento da colocação dele no carrinho, e, quando ele clika em voltar para escolher outro produto, la se vai embora o novo preço que ele colocou.

Como faço para resolver isso? Alguma ideia ou derepente uma nova forma de fazer essa lista?

Segue o carrinho que estou usando e a classe php.

carrinho.php

<?php

//Verificando se a variavel de sessão foi criada
if (!session_is_registered("MeuCarrinho")){
    session_register("MeuCarrinho");
    $MeuCarrinho = new TCarrinho();
    $_SESSION[MeuCarrinho] = serialize($MeuCarrinho);
    $MeuCarrinho = unserialize($_SESSION[MeuCarrinho]);    
}
    $_SESSION[MeuCarrinho] = serialize($MeuCarrinho);
    $MeuCarrinho = unserialize($_SESSION[MeuCarrinho]);    

if (!empty($op)){
    switch ($op) {
    case "adicionar":
        if (!empty($id_prod)){
            $Query = "select id from produtos where id = $id_prod";
            $R_Query = $MySQL->query($Query);
            if (mysql_num_rows($R_Query)>0){
                $MeuCarrinho->AdicionarItem($id_prod,1);
            }
        }
        break;
    case "excluir":
        $id_fornece=$_GET['id_fornece'];
        $MeuCarrinho->RemoverItem($id_prod);
        break;
    case "atualizar":
        $MeuCarrinho->AtualizarCarrinho($_POST);
        break;
    case "finalizar":
        if ($MeuCarrinho->QuantosItens()>0) {
        echo "<script>document.location='CarrinhoFinal.php?acao=gravar'</script>";
        }
    break;
    }
}
if ($MeuCarrinho->QuantosItens()==0) {
 echo "<table align='center'>
         <tr><td align=center><p><p><h2>Lista Vazia</h2><p><p></td></tr>       
         <tr><td align=center><p><p><a href=produto_lista_cadastrar.php?acao=mostra_fornecedores><h2>Mostar Fornecedores</h2></a><p><p></td></tr>
       </table>";
        }
else {
$QuerySQL = "
             select 
               p.id, p.foto, p.nome, p.preço, p.quantidadecaixa, p.grupo, g.nome, p.fornecedor
             from 
               produtos p inner join grupos g
               " . $MeuCarrinho->QuerySQL_ObtemListaDeItens(). " and p.grupo = g.id_grupo";
$Resultado = $MySQL->query($QuerySQL);
?>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0 COLS=1 WIDTH="100%" BGCOLOR="#0080C0" >
<tr>
<td>
<center><b><font color="#FFFFFF">Lista</font></b></center>
</td>
</tr>
</table>
<form method="POST" action="carrinho.php?op=atualizar">
<table BORDER=0 CELLSPACING=2 CELLPADDING=4 COLS=5 WIDTH="100%">
<tr BGCOLOR="#004080">
<td>
<center><b><font color="#FFFF99">Foto</font></b></center>
</td>
<td>
<center><b><font color="#FFFF99">ITEM</font></b></center>
</td>

<td>
<center><b><font color="#FFFF99">Grupo</font></b></center>
</td>

<td>
<center><b><font color="#FFFF99">QTD na Caixa</font></b></center>
</td>

<td>
<center><b><font color="#FFFF99">PRE&Ccedil;O UNIT&Aacute;RIO</font></b></center>
</td>

<td BGCOLOR="#004080"></td>
</tr>


<?
$quantidadecaixa = 0.00;
while(list($id, $foto, $nome, $preço, $quantidadecaixa, $grupo, $nome_grupo, $fornecedor) = mysql_fetch_row($Resultado)) {
          if($foto==""){ $foto2 = "<img src='figuras/Next.png' alt='Sem foto' border=0 width=35>"; } 
      else {
             if(file_exists("../img/foto_produto/mini/$foto")) 
              {
                 $foto1 = "<img src='../img/foto_produto/mini/$foto'  alt='Foto' border=0 width=35>";
                 list($width,$height) = getimagesize("../img/foto_produto/normal/$foto");
                 $foto2 = "<a href=java script:AbreImagemGrande('produtos_conteudo_foto.php?foto_url=$foto','ImpNot','$width','$height')>$foto1</a>";
              }
            else {
                     $foto2 = "<img src='figuras/Next.png' alt='Sem foto' border=0 width=35>"; 
                 }
      }

    echo "
<tr>
  <td align=center><font size=-1>". $foto2 ."</font></td>
  <td align=left><font size=-1>". $nome ."</font></td>
  <td align=left><font size=-1>". $nome_grupo ."</font></td>
  <td align=center><font size=-1>". $quantidadecaixa ."</font></td>
  <td align=center><b>R$ ". number_format($preço, 2, '.', '')."</b></td>
  <td align=center><b><font face=Tahoma><font size=-2><a href=carrinho.php?op=excluir&id_prod=$id&id_fornece=$fornecedor>Excluir</a></font></font></b></td>
</tr>
    ";
}
?>

<tr>
<td></td>

<td><b><font color="#FF0000"></font></b></td>

<td></td>
</tr>
</table>
<input type="hidden" value="<?=$id_fornece;?>"  name="id_fornece"/>
</form>

<TABLE align=center>
<TR>
    <TD>
        <form method="post" action="produto_lista_cadastrar.php?acao=mostra_produtos&id_fornece=<?=$id_fornece;?>">
            <center><input type="submit" value="<< Voltar aos produtos" name="Atualizar" WIDTH="78" HEIGHT="20" style="background-color: rgb(0,111,55); color: rgb(255,255,0)"><center>
        </form>
    </TD>
    <TD>
        <form method="post" action="carrinho.php?op=finalizar">
            <center><input type="submit" value="Finalizar Lista >>" name="Atualizar" WIDTH="78" HEIGHT="20" style="background-color: rgb(0,111,55); color: rgb(255,255,0)"><center>
        </form>    
    </TD>
</TR>
</TABLE>
<? } ?>
TCarrinho.php
<?php
/*
    Classe TCarrinho
*/
class TCarrinho {
var $item_codigo = array();
var $item_quantidade = array();
    
    /*
        ObtemPosicao
        Este metodo obtem a posicao de um item mediante ao seu codigo, retornando um valor booleano e gravando a posicao na variavel de referencia $posicao, caso o codigo do item esteja no carrinho.
    */
    function ObtemPosicao($codigo,&$posicao){
        //Percorrendo o vetor
        for($i=0;$i<count($this->item_codigo);$i++) {
            if ($this->item_codigo[$i] == $codigo) {
                $posicao = $i;
                return TRUE;
           }
         }

    }/* ObtemPosicao() */
    
    /*
        ObtemPreco
        Este metodo obtem o preço por unidade do produto tendo em mãos o codigo dele.
    */
        function ObtemPreco($codigo){
        $Sql = mysql_query("select preço from produtos where id = $codigo");
        list($preco_uni) = mysql_fetch_row($Sql);
        return $preco_uni;
        //return mysql_result($sql,0,0);
         }/* ObtemPreco() *
        
    
    /*
        AdicinarItem
        Este metodo adiciona um item no carrinho
    */
    function AdicionarItem($codigo,$quantidade) 
    {
        //Inicializando parametro
        $posicao = -1; 
        $achou = $this->ObtemPosicao($codigo,$posicao);
        if (!$achou){
            $this->item_codigo[] = $codigo;
            $this->item_quantidade[] = $quantidade;
        }
    } /* AdicionarItem() */

    /*
        RemoverItem
        Este metodo remove um item do carrinho de compra, passando o codigo do produto
    */
    function RemoverItem($codigo) 
    {
        //Inicializando parametro
        $posicao = -1; 
        $achou = $this->ObtemPosicao($codigo,$posicao);
        if ($achou){
            //Removendo o elemento do vetor
            array_splice($this->item_codigo, $posicao, 1);
            array_splice($this->item_quantidade, $posicao, 1);        
        }
            
    } /* RemoveItem() */

    /*
        QuantosItens
        Este metodo retorna a quantidade de itens incluidas no carrinho de compras
    */
    function QuantosItens() {
        return count($this->item_quantidade);
    } /* QuantosItens() */

    /*
        ExcluirTodosItens
        Este metodo retira todos os itens contidos no carrinho de compras
    */
    function ExcluirTodosItens(){
        $this->item_quantidade = null;
        $this->item_codigo = null;
    } /* ExcluirTodosItens() */

    /*
        QuerySQL_ObtemListaDeItens
        Este metodo gera uma parte do codigo SQL que sera usado para buscar os dados
        do carrinho de compra (id, NOME e PREÇO). O comando SQL final tera como finalidade
        de buscar no banco de dados apenas os dados dos itens incluidos no carrinho.
    */
    function QuerySQL_ObtemListaDeItens(){
        $itens = "where ";
        $STR = "";
        if ($this->QuantosItens()>0) {
            $fixo = " id =";
            for ($i=0;$i<$this->QuantosItens();$i++){
                $STR = $STR . $fixo . " " . $this->item_codigo[$i];
                if ($i+1<$this->QuantosItens()) {
                    $STR = $STR . " or ";
                }
            }
        }
        if (!$STR == "") {
            return $itens . $STR;
        }else{
            //Caso não exista nenhum item no carrinho o codigo final SQL, procurara por um item que não existe na tabela de produtos, neste caso  -1.
            return "where id = -1";
        }
    } /* QuerySQL_ObtemListaDeItens() */

    /*
        ObtemQuantidadeItem
        Este metodo obtem a quantidade de um Item
    */
    function ObtemQuantidadeItem($codigo){
        $posicao = -1;
        $achou = $this->ObtemPosicao($codigo,$posicao);
        if ($achou) {
            return $this->item_quantidade[$posicao];
        }else{
            return "erro ao obter quantidade do item";
        }
        
    } /* ObtemQuantidaItem() */

    /*
        ObtemSubTotalDeUmItem
        Este metodo retorna o subtotal de um item (QUANTIDADE * VALOR UNITARIO)
    */
    function ObtemSubTotalDeUmItem($id,$preço){
        $posicao = -1;
        $achou = $this->ObtemPosicao($id,$posicao);
        if ($achou) {
            return ($this->item_quantidade[$posicao]*$preço);
        }else{
            return "erro ao obter sub total do item";
        }
    } /* ObtemSubTotalDeUmItem() */

    /*
        AtualizarCarrinho
        Este metodo coleta todos as variaveis enviadas pelo FORMULARO (method="POST") 
        e atualiza as quantidades dos itens.
    */
    function AtualizarCarrinho(&$VAR_ENVIADAS_PELO_BROWSER){
        //Percorrendo a lista de itens e atualizando suas quantidades
        for ($i=0;$i<$this->QuantosItens();$i++){
            $this->item_quantidade[$i] = $VAR_ENVIADAS_PELO_BROWSER[$this->item_codigo[$i]];
        }
    } /* AtualizarCarrinho() */

} /* Classe TCarrinho */
?>

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Essa função

/*
        AtualizarCarrinho
        Este metodo coleta todos as variaveis enviadas pelo FORMULARO (method="POST") 
        e atualiza as quantidades dos itens.
    */
    function AtualizarCarrinho(&$VAR_ENVIADAS_PELO_BROWSER){
        //Percorrendo a lista de itens e atualizando suas quantidades
        for ($i=0;$i<$this->QuantosItens();$i++){
            $this->item_quantidade[$i] = $VAR_ENVIADAS_PELO_BROWSER[$this->item_codigo[$i]];
        }
    } /* AtualizarCarrinho() */
/*
        QuantosItens
        Este metodo retorna a quantidade de itens incluidas no carrinho de compras
    */
    function QuantosItens() {
        return count($this->item_quantidade);
    } /* QuantosItens() */
coleta todos as variaveis enviadas pelo FORMULARO e atualiza as quantidades dos itens Acontece que, quando pego o campo de precoalter do formulario, que recebe o preço do produto que esta cadastrado no banco e altero ele manualmente. Quando cliko no botão atualizar ele volta o preço que era e não atualiza.
Esse botão submit:
<input type="submit" value="Atualizar" name="Atualizar" WIDTH="78" HEIGHT="20" style="background-color: rgb(0,111,55); color: rgb(255,255,0)">
dispara os campos do form

alguém pode me ajudar?

Link para o comentário
Compartilhar em outros sites

  • 0

Achei uma saida mas preciso da ajuda de vocês.

Nesse código cada produto adicionado ao carrinho, é claro que a quantidade inicial que é colocada é de uma unidada e depois você tem a opçao de aumentar a quantidade e aumentar igualmente o valor a pagar com esse aumento. Certo?

Pois é, preciso arranjar uma forma de esse valor começar de 0.

Estou fazendo assim:

<td align='right'><font size=-1>". $preço ."</font></td>
  <td align='center'>% <input type=TEXT name=". $id ." size=2 value=". $MeuCarrinho->ObtemQuantidadeItem($id) ."></td>
  <td align='center'><b>R$ <input type='text' name='preco_alter' 
            value=". number_format($MeuCarrinho->ObtemPrecoAlteradoDeUmItem($id,$preço), 2, '.', '') ."></b>
  </td>

///////////

function ObtemQuantidadeItem($codigo){
        $posicao = -1;
        $achou = $this->ObtemPosicao($codigo,$posicao);
        if ($achou) {
            return $this->item_quantidade[$posicao];
        }else{
            return "erro ao obter quantidade do item";
        }
        
    } 
////////
function ObtemPosicao($codigo,&$posicao){
        //Percorrendo o vetor
        for($i=0;$i<count($this->item_codigo);$i++) {
            if ($this->item_codigo[$i] == $codigo) {
                $posicao = $i;
                return TRUE;
           }
         }

    }
Tem como fazer o campo
% <input type=TEXT name=". $id ." size=2 value=". $MeuCarrinho->ObtemQuantidadeItem($id) .">

Começar de 0 em vez de 1? Pois aproveitei a função para atualizar outro campo.

Link para o comentário
Compartilhar em outros sites

  • 0

Pessoal.

Estou fazendo um projeto de carrinho de compras com arquivos copiados daqui mesmo.

O problema é que, nesses carrinhos, o usuario não pode alterar o preço produto.

Vou explicar;

a ideia é criar uma lista com os produtos que estão cadastrados no banco, porem, é o administrador quem vai criar essa lista que depois de pronta, os produtos que estão na lista, ficarao à diposição dos clientes para compra.

Mas, o diferencial aqui, é o motivo que esta me tirando o sono. Carrinho com alteração de preço. Aqui, o administrador tem que ter a opção de alterar o preço do produto e gravar a lista.

Não estou conseguindo.

Alguma ajuda?

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,2k
×
×
  • Criar Novo...