IMPLEMENTAÇÃO DE “CARRINHO DE COMPRAS” SIMPLES
exibirPublicacoes.php
Nesta página, onde são exibidos os livros do site, colocaremos um link (ou imagem-link) para o controlador de carrinho de compras, controlerCarrinho.php que controlará os passos principais do nosso carrinho de compras.
<td>
<?php echo "<a href='controlers/controlerCarrinho.php? opcao = 1 & id = " .
. $pub->getId()."'>Adicionar no carrinho</a>" ?></td>
Repare que enviaremos a opção = 1 para o controlador (que é para adicionar no carrinho) e o ID da publicação, a qual se deseja colocar no carrinho. Cada publicação exibida na página terá seu link para o carrinho, contendo seu ID.
controlerCarrinho.php
No controlador, na opção 1, teremos os seguintes passos:
1.Capturaremos o id enviado;
2.Criaremos o objeto PublicacaoDAO, e através dele, acionaremos o método getPublicacao() que captura a publicação na tabela correspondente ao ID enviado.
3.Habilitaremos a sessão
4.Verificaremos se existe o vetor “carrinho” criado na sessão. Se tiver, basta recuperar, se não, criaremos um vetor novo.
5.Colocaremos o objeto Publicacao capturado no vetor e adicionaremos o carrinho na sessão.
6.Encaminharemos para a página exibirCarrinho.php, que exibirá os dados do carrinho de compras.
$opcao = (int)$_REQUEST['opcao'];
if($opcao == 1) // adicionar no carrinho {
$id = (int)$_REQUEST['id'];
$publicacaoDao = new PublicacaoDao();
$publicacao = $publicacaoDao->getPublicacao($id);
session_start();
if (!isset($_SESSION['carrinho'])) $carrinho = array();
else
$carrinho = $_SESSION['carrinho'];
$carrinho[] = $publicacao;
$_SESSION['carrinho'] = $carrinho;
header("Location: ../exibirCarrinho.php");
}
exibirCarrinho.php
Nesta página, construa uma tabela para mostrar os itens do carrinho de compras.
Para isso, será feito:
1. Capturar o vetor de carrinho de compras da sessão;
2. Percorrer o vetor (foreach) para pegar cada item, lembrando que este é um objeto publicação;
3. Cada nova linha da tabela terá os dados do objeto Publicação acessado no vetor;
4. Pode ser feito um contador para, se desejar, mostrar a ordem de inserção dos itens na tabela.
session_start();
$carrinho = $_SESSION['carrinho'];
$cont = 1;
$soma = 0;
foreach($carrinho as $item) {
?>
<tr align="center">
<td><?php echo $cont ?></td>
<td><?php echo $item->getId(); ?></td>
<td><?php echo $item->getTitulo(); ?></td>
<td><?php echo $item->getEditora(); ?></td>
<td><?php echo "R$ ".$item->getPreco(); ?></td>
<td><a href="controler/controlerCarrinho.php?opcao=2&index=<?php echo $cont-1 ?>">
Remover Item </a></td>
</tr>
<?php
$soma += $item->getPreco();
$cont++;
}
É importante, numa implementação de carrinho de compras, mostrar o somatório dos preços dos itens, motivo pela qual foi criada a variável
$soma para isso.
<tr align="right">
<td colspan="5"><font face="Verdana" size="4" color="red">
<b>Valor Total = R$<?php echo $soma?></b></font>
</td></tr>
Além disso, colocaremos uma imagem de um botão ou link para o usuário desejar voltar à página de exibição das publicações (exibirPublicacoes.php) para “Continuar comprando”, ou seja, para o usuário selecionar mais alguma publicação para o carrinho.
<a href="exibirPublicacoes.php">
<img src="imagens/botao_continuar_comprando.png">
</a>
REMOVER ITEM DO CARRINHO
controlerCarrinho.php
No controlador, na opção 2 (remover do carrinho), capturemos o índice enviado do item do vetor a ser removido, buscamos o array do carrinho na sessão e, pela função unset(), passamos o elemento do vetor com o índice para ser removido, que é o objetivo desta função.
Colocaremos o carrinho novamente na sessão e encaminharemos para a página exibirCarrinho.php, mostrando o carrinho atualizado.
if($opcao == 2) // remover do carrinho {
$index= (int)$_REQUEST['index'];
session_start();
$carrinho = $_SESSION['carrinho'];
unset($carrinho[$index]);
$_SESSION['carrinho'] = $carrinho;
header("Location: ../exibirCarrinho.php");
}
Problema com a função unset()
Existe um problema com a função unset(). Ela de fato tira o elemento do vetor, mas não REPOSICIONA os elementos nos índices do vetor. Por exemplo:
0 1 2 3 4
$vet 50 30 8 70 23
Se deseja tirar o elemento 8 basta fazer unset($vet[2]). Porém o vetor ficará assim:
0 1 3 4
$vet 50 30 70 23
Ou seja, o índice não existe mais no vetor. Isso será um problema, pois caso desejarmos excluir o próximo item = 3 do carrinho (posição 2 do vetor), não funcionará.
Para resolvermos essa questão, deveríamos reposicionar os elementos do vetor, o que pode ser resolvido com a função sort() que ordena os elementos do vetor. Logo, basta após a retirada do elemento chamar esta função.
0 1 3 4
$vet 50 30 70 23
Sort($vet);
0 1 2 3
$vet 23 30 50 70
Porém, há uma questão no vetor de carrinho de compra: se usarmos, ele estará ordenando também os elementos (itens) do carrinho, o que não desejamos caso a intenção seja manter a ordem de inclusão dos elementos. Certo?
ERRADO!
Lembre-se que o carrinho é um vetor de objetos Publicação e, a função sort() não tem como “entrar” em cada objeto e ordenar por algum atributo (id ou nome ou autor, etc) e ainda escolher o atributo “sozinho”.
Ou seja, essa mágica sort() não faz!
Logo, ela acaba ordenando o vetor pelos índices, ou seja, faz o que de fato nós queríamos nessa situação: REPOSICIONAR os elementos no vetor!
Mudando controlerCarrinho.php
Logo, a opção 2 do controlador de carrinho ficará assim:
if($opcao == 2) // remover do carrinho {
$index= (int)$_REQUEST['index'];
session_start();
$carrinho = $_SESSION['carrinho'];
unset($carrinho[$index]);
sort($carrinho);
$_SESSION['carrinho'] = $carrinho;
header("Location: ../exibirCarrinho.php");
}
Tratamento de erro para o carrinho vazio
Numa implementação de carrinho de compras, o site deverá informar ao usuário se o carrinho estiver vazio, caso ele acesse o mesmo pela página exibirPublicacoes.php (será o único acesso disponível para tal), ou continuará mostrando o carrinho e seus itens normalmente, caso já tenha sido colocado algum livro nele.
Para isso, iremos incluir a opção = 3 no controlador de carrinho:
controlerCarrinho.php
Essa opção 3 verificará se o carrinho já foi ou não setado.
Em caso afirmativo, ele retorna para a página exibirCarrinho.php que mostrará o mesmo.
E caso negativo, ou seja, não há carrinho de compras ou se o mesmo está vazio, retornará para a página exibirCarrinho.php com um parâmetro que indicará à página para mostrar uma mensagem que ele está vazio ‘status = 1’.
if($opcao == 3) {
session_start();
if ((!isset($_SESSION['carrinho']) || sizeof($_SESSION['carrinho'])==0) header("Location:../exibirCarrinho.php?status=1");
else
header("Location:../exibirCarrinho.php");
}
exibirCarrinho.php
Precisamos modificar a página que exibe o carrinho para tratar se ele está ou não vazio, baseado no valor do parâmetro ‘status’. Logo, iremos trocar a tabela de itens do carrinho pela mensagem, caso ele esteja vazio.
Então, teremos uma condicional a ser feita para exibir ou não a tabela ou a mensagem.
Além disso, iremos colocar um link para caso o usuário deseja ir às publicações para incluí-las no carrinho (técnica comum de todo e-commerce
>> “induzir às compras!”)
<?php
if (isset($_REQUEST['status'])) {
echo "<p><font face='Verdana' size='3' color='red'>Nenhum item foi incluído do carrinho de compras</font>";
echo "<p><a href='controlers/controlerPublicacao.php?opcao=2'>
Visualizar publicacoes</a>";
} else {
?>
<table> // sua tabela completa de exibição dos itens do carrinho </table>
// botões de “Continuar Comprando” e “Finalizar Compra”
<?php }
?>
controlerCarrinho.php
Já que a opção = 3 já verifica se o carrinho está vazio, seria prudente que a remoção do item no carrinho (opção = 2) não encaminhasse diretamente para a página exibirCarrinho.php, mas sim passe pelo crivo da opção = 3, pois caso se retire o último elemento, mostre a mensagem.
Logo, modifique a opção = 2.
if($opcao == 2) // remover do carrinho {
$index= (int)$_REQUEST['index'];
session_start();
$carrinho = $_SESSION['carrinho'];
unset($carrinho[$index]);
sort($carrinho);
$_SESSION['carrinho'] = $carrinho;
header("Location: controlerCarrinho.php?opcao=3");
}
Opção “VER CARRINHO”
É importante numa aplicação de E-Commerce deixar disponível uma opção no site para o usuário “Ver o Carrinho de Compras”
sempre que desejado. No momento da nossa aplicação, o usuário só consegue ver o carrinho se:
- acessar direto pela URL
- fazendo a compra de um item
Para resolver essa questão, vamos adicionar um botão na página exibirPublicacoes.php para a opção 3 do controler de carrinho, o qual verifica se há o carrinho e reencaminha para a exibirCarrinho.php.
exibirPublicacoes.php
Antes da exibição das tabelas contendo cada publicação, iremos colocar uma <div> contendo o link-imagem para visualizar o carrinho: