JAMES WEB
Aprenda como se faz.
Digite alguma coisa aqui
Carrinho de Compras – Parte 1 (criando um carrinho de compras)
O carrinho de compras é um elemento fundamental em qualquer plataforma de e-commerce, funcionando como o espaço virtual onde os clientes selecionam e armazenam os produtos de seu interesse. Essa funcionalidade é vital para uma experiência de compra fluida e controlada, permitindo que os usuários revisem suas escolhas e ajustem quantidades antes de prosseguir.
Um carrinho bem desenhado otimiza a conversão de visitas em vendas, facilitando a decisão de compra e garantindo que o processo de finalização seja eficiente e sem atritos.

Arquivos para download:
Inserindo arquivos de suporte Carrinho de Compras.
Uma nova versão da tabela denominada tb_carts será fundamental para o armazenamento das informações pertinentes ao carrinho. Caso a tabela exista, ela será substituída por uma estrutura atualizada, incorporando os seguintes campos:
- vlfreight: Destinado ao registro do valor correspondente ao frete.
- nrdays: Designado para o cálculo e armazenamento do prazo de entrega estimado em dias.

A criação desta estrutura de dados será efetuada através da execução do script SQL fornecido para a tabela tb_carts. Recomenda-se a utilização da interface phpMyAdmin, acessando a aba SQL para a submissão do referido script.
A manutenção e a atualização dos dados do carrinho de compras serão gerenciadas por meio da stored procedure sp_carts_save. Este procedimento armazenará as alterações realizadas no carrinho. A execução do script SQL correspondente a esta procedure deverá ser realizada na aba SQL do phpMyAdmin.
A visualização da interface do carrinho de compras para o usuário final será definida pelo template cart.html. Este arquivo deverá ser armazenado no diretório views do projeto.
Implamente a linha use \Hcode\Model\Cart; no arquivo site.php (linha 5), que é um atalho inteligente para que você não precise digitar o caminho completo de uma classe Cart toda vez que for usá-la.
Para possibilitar o acesso à interface do carrinho de compras através da plataforma web, será imprescindível a definição de uma rota específica. No arquivo site.php, do diretório xampp > hdocs > ecommerce, adicione o trecho de código conforme o exemplo a seguir:
PHP: site.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php use \Hcode\Page; use \Hcode\Model\Product; use \Hcode\Model\Category; Use \Hcode\Model\Cart; //Rota Carrinho de Compras $app->get( "/cart" , function (){ $cart = Cart::getFromSession(); $page = new Page(); $page->setTpl( "cart" ); }); // Restante do código php ?> |
Analisando este trecho linha por linha:
- L8 – $app->get(“/cart”, function(){: Esta linha utiliza um objeto $app para definir uma rota HTTP GET. O primeiro argumento, “/cart”, especifica o caminho da URL “/ecommerce/cart/” que os usuários digitarão em seus navegadores para acessar o carrinho de compras. O segundo argumento é uma função anônima que será executada quando um usuário acessar essa URL através do método GET.
- L9 – $cart = Cart::getFromSession() – Essa linha de código está pegando as informações de um carrinho de compras que foram salvas na sessão do usuário e as colocando em uma variável chamada $cart, processado na classe cart no arquivo cart.php.
- L10 – $page = new Page();: Dentro da função anônima, esta linha instancia um novo objeto da classe Page. A classe Page é responsável por gerenciar a renderização das páginas HTML da aplicação. Ela contém métodos para carregar templates, definir dados a serem exibidos e, finalmente, exibir a página ao usuário.
- L11 – $page->setTpl(“cart”);: Nesta linha, o método setTpl() do objeto $page é chamado, passando a string “cart” como argumento. Este método está instruindo o objeto $page a utilizar o template de nome “cart“. Em nosso contexto, este template corresponde ao arquivo cart.html que foi salvo na pasta views. O método setTpl() localiza e prepara este arquivo para ser renderizado e enviado como resposta ao navegador do usuário.
Constata-se que a página inicial (home) da plataforma dispõe de duas áreas distintas que podem servir como ponto de entrada para o carrinho de compras. Uma dessas áreas está integrada ao arquivo header.html, responsável pela seção de cabeçalho do site.
Para assegurar a correta navegação até a interface do carrinho, torna-se necessário acessar o código do arquivo header.html e modificar o link atualmente identificado como “Meu Carrinho” e ainda “Carrinho”. A alteração deverá seguir o seguinte padrão, garantindo a vinculação com a rota previamente definida. Loacalize as linhas no arquivo header.html e altere conforme o exemplo:
<li><a href=”/ecommerce/cart/”><i class=”fa fa-shopping-cart”></i>Meu Carrinho</a></li>
<li><a href=”/ecommerce/cart/”>Carrinho</a></li>

A implementação cuidadosa destes passos garantirá a integração eficaz da funcionalidade do carrinho de compras.
Classe Carrinho de Compras
Vamos criar a classe que irá criar os métodos relacionados com o carrinho de compras quando for acionado dentro de uma sessão. Para isto crie o arquivo Cart.php no diretório xampp > htdocs > ecommerce > vendor > hcodebr > php-classes > src > model conforme o exemplo a seguir
PHP: Cart.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php //cart.php Classe que administra carrinho de compras namespace Hcode\Model; use \Hcode\DB\Sql; use \Hcode\Model; use \Hcode\Mailer; use Hcode\Model\Database; Use \Hcode\Model\User; class Cart extends Model { const SESSION = "Cart" ; } ?> |
- insira no inicio do arquivo o namesapace Hcode\Model assim como os uses necessários que iremos utilizar no arquivos.
- L16 – Cada cliente deve ter seu próprio carrinho. Para identificá-lo temos de guardar os dados específicos dentro de uma sessão. Por isso crie uma constante chamada SESSION com o valor “Cart”, com demonstrado acima.
- Crie os métodos básicos dentro da classe Cart que extende de Model:
Function getFromSession()
Este método cria um carrinho vazio. Se já houver um carrinho na sessão , ele o carrega. Caso contrário, através de diversas possibilidades cria um novo carrinho. Observe na linha 9 do arquivo site.php acima, onde o método é invocado.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | public static function getFromSession() { $cart = new Cart(); // Cria uma nova instância de Cart // 1. Tenta carregar o carrinho da sessão (se houver idcart salvo) if (isset($_SESSION[self::SESSION]) && isset($_SESSION[self::SESSION][ 'idcart' ]) && (int)$_SESSION[self::SESSION][ 'idcart' ] > 0) { $cart->get((int)$_SESSION[self::SESSION][ 'idcart' ]); if ((int)$cart->getidcart() > 0) { // Se o carrinho foi encontrado no DB return $cart; // Retorna o carrinho existente } else { // Se o carrinho da sessão não foi encontrado no DB, limpa a sessão para este carrinho unset($_SESSION[self::SESSION]); // Não precisa de $cart = new Cart() aqui, pois o fluxo abaixo criará um novo } } // 2. Se não retornou ainda, significa que precisamos criar/encontrar um carrinho pelo session_id ou criar um novo // Tenta carregar o carrinho usando o ID da sessão atual $cart->getFromSessionID(); // 3. Inicializa $data aqui, FORA do IF, para que ela sempre exista. $data = []; // Inicializa $data como um array vazio // Se ainda não encontrou um carrinho válido pelo session_id (ou seja, é um carrinho novo) if (!((int)$cart->getidcart() > 0)) { // Se é um carrinho novo, preenche $data com os dados iniciais $data[ 'dessessionid' ] = session_id(); // Associa o usuário logado, se houver if (User::checkLogin( false )) { $user = User::getFromSession(); if ($user && $user->getiduser() > 0) { $data[ 'iduser' ] = $user->getiduser(); } } // Aplica os dados e salva o NOVO carrinho $cart->setData($data); $cart->save(); } else { // Se um carrinho foi encontrado pelo session_id, // apenas atualiza seus dados na sessão para garantir // que as informações mais recentes estejam lá. // Não precisa chamar setData($data) novamente aqui, // pois os dados já estão no objeto $cart após getFromSessionID(). } // 4. Salva o carrinho (novo ou existente) na sessão $cart->setTosession(); return $cart; // Retorna o objeto Cart final } |
Explicação do Código das linhas 29 a 34 que são executadas no arquivo user.php.
- if (User::checkLogin(false)):
- User::checkLogin(false) é como perguntar à porta: “Ei, a pessoa que quer entrar já digitou a senha correta antes?”.
- O false entre parênteses é um detalhe técnico que, nesse caso, diz à porta para “não tentar forçar o login se não estiver logado”. Ou seja, ele apenas verifica se já está logado, não se precisa fazer o login.
- O if (…) significa “SE a porta responder que sim (ou seja, a pessoa já está logada)… então faça o seguinte.”
- $user = User::getFromSession();:
- Se a pessoa já está logada (a porta disse que sim), esta linha é como dizer: “Perfeito! Agora me diga quem é essa pessoa que está lá dentro. Pegue os dados dela que guardamos temporariamente (na ‘sessão’)”.
- As informações dessa pessoa são salvas em uma variável chamada $user.
- if ($user && $user->getiduser() > 0):
- Aqui há uma segunda pergunta: “SE temos os dados da pessoa ($user) E, além disso, essa pessoa tem um número de identificação válido (o iduser dela é maior que zero)…”. Esta é uma verificação dupla para garantir que as informações do usuário são reais e úteis. Às vezes, por erros, podemos ter um $user vazio ou com um ID inválido.
- $data[‘iduser’] = $user->getiduser();:
Se todas as condições anteriores forem atendidas (a pessoa está logada, seus dados foram obtidos e seu ID é válido), então esta linha diz: “Agora, guarde o número de identificação dessa pessoa (getiduser()) em uma caixa de informações que chamamos $data, especificamente no espaço para o ‘iduser'”
Função get(int $idcar)
Acionada pelo método getFromSession(), busca o carrinho com o ID fornecido e preenche o objeto atual com os dados encontrados.
1 2 3 4 5 6 7 8 9 10 | public function get(int $idcart) { $sql = new Sql(); $results = $sql->select( "SELECT * FROM tb_carts WHERE idcart = :idcart" , [ ':idcart' =>$idcart ]); if (count($results) > 0) { $ this ->setData($results[0]); } } |
- L3 – Conectamos ao banco de dados;
- L4 – Através de uma consulta selecionamos o carrinho de compras equivalente a variável enviada ($idcart), que é setada na variável ($results);
- L7/9 – O valor de $results na posição zero e inserido no próprio objeto ($this) usando o método setData, se o valor não for vazio, isto é, existir algum resultado, validado pela condição (counts($results) > 0).
Function getFromSessionID()
Este método (acionado no método getFromSession)tenta carregar o carrinho de compras através do valor do dessessionid da tabela tb_carts e preenche o objeto atual com os dados encontrados.
1 2 3 4 5 6 7 8 9 10 11 | Function getFromSessionID() { $sql = new Sql(); $results = $sql->select( "SELECT * FROM tb_carts WHERE dessessionid = :dessessionid" , [ ':dessessionid' =>session_id() ]); if (count($results) > 0) { $ this ->setData($results[0]); } } |
- L3 – Conectamos ao banco de dados;
- L4/7 – Através de uma consulta setamos na variável $results o valor de idcart equivalente ao valor da sessão atual session_id e ainda é setado o valor $data.
- L8/10 – O valor de $results na posição zero e inserido no próprio objeto ($this) usando o método setData, se o valor não for vazio, isto é, existir algum resultado, validado pela condição (counts($results) > 0).
Function checkLogin() – User.php
Este código verifica se um usuário já fez login. Se sim, ele recupera as informações desse usuário e, se sua identificação for válida, as armazena para serem usadas posteriormente na página ou aplicação. É uma forma segura de saber quem está usando o site naquele momento. O arquivo deve ser criado no arquivo User.php.
Função save
Conecta ao banco, executa a procedure sp_carts_sp com os parâmetros fornecidos e armazena o primeiro resultado no objeto atual usando o método setData().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public function save() { $sql = new Sql(); $results = $sql->select( "CALL sp_carts_save(:idcart, :dessessionid, :iduser, :deszipcode, :vlfreight, :nrdays)" , [ ':idcart' =>$ this ->getidcart(), ':dessessionid' =>$ this ->getdessessionid(), ':iduser' =>$ this ->getiduser(), ':deszipcode' =>$ this ->getdeszipcode(), ':vlfreight' =>$ this ->getvlfreight(), ':nrdays' =>$ this ->getnrdays() ]); $ this ->setData($results[0]); } |
- L4 -Conecte ao banco de dados ($sql = new Sql());
- L5/13 – Chamamos a procedure sp_carts_sp armazemando os valores nos parâmetros correspondentes;
- Alocamos através de setData o resultado (um array) da procedure dentro do próprio objeto com a variável $this na posição zero.
Criando um carrinho de compras na prática.
Ao acessar o carrinho de compras em uma das três possibilidades na página principal de nosso site, se tudo der certo, será criado um carrinho de compras na tabela tb_carts, esteja o visitante logado ou não. Acesse o xammp control painel, inicie os serviços Apache e MySql e abra o admonistrativo do phpMyAdmin e verifique o registro adicionado na tabela tb_carts no banco de dados db_ecommerce.
