sábado, maio 26, 2007

Carrinho de Compras com PHP orientado a objetos

Olá a todos! Desta vez vamos criar um carrinho de compras em PHP orientado a objetos. Escolhi OO pois deixa o código mais claro e mais fácil de dar manutenção. Além disso, para aqueles que ainda não conhecem a orientação a objetos, sugiro fortemente que busquem aprender. Podem começar então por esse tutorial.

Esta não é um versão completamente funcional, mas já é uma base para o carrinho de compras de verdade.



< ?php

class Produto {

var $codigo;
var $descricao;
var $preco;
var $quantidade;

function Produto($codigo,$descricao,$preco,$quantidade) {
$this->codigo = $codigo;
$this->descricao = $descricao;
$this->preco = $preco;
$this->quantidade = $estoque;
}

function getCodigo() {
return this->codigo;
}

function getQuantidade() {
return this->getQuantidade;
}

function setQuantidade($quantidade) {
this->quantidade = $quantidade;
}

function getValor() {
return this->preco * this->quantidade;
}


}


class CarrinhoDeCompras() {

var $carrinho;

//Coloca o novo Carrinho de Compras na sessão
function CarrinhoDeCompras() {
session_start();
$_SESSION["carrinho"] = new Array();
}

//Atualiza os dados da sessão
function atualizaDados() {
$_SESSION["carrinho"] = $this->carrinho;
}

//Pega os dados da sessão
function getCarrinho() {
$this->carrinho = $_SESSION["carrinho"];
}

//Adiciona um item no carrinho de compras
function adicionaItem($produto) {
//Pega os dados atualizados da sessão
$this->getCarrinho();

$codigo = $produto->getCodigo();
//Seo produto ainda não está no carrinho adicione
if ($this->arrinho[codigo] != null) {
$this->carrinho[codigo] = $produto;
}
//Caso contrário, apenas incremente a quantidade do produto já existente
else {
$quantidade = $produto->getQuantidade() +
$carrinho[$codigo]->getQuantidade();
$this->carrinho[$codigo]->setQuantidade($quantidade);
}

//Atualiza os dados da sessão
$this->atualizaDados();
}


//Remove um item do carrinho de compras
function removeItem($produto) {
$this->getCarrinho();

$codigo = $produto->getCodigo();
unset($this->carrinho[codigo]);

$this->atualizaDados();
}

//Pega o valor total das compras do usuário
function getTotal() {
$this->getCarrinho();
$total = 0;

foreach($this->carrinho as $produto) {
$total += $produto->getValor();
}

return $total;
}

}

? >


É isso pessoal. Para aqueles que gostaram, sugiro a adição de novas funcionalidades como controle do estoque dos produtos que saem, novas classes que gerenciem formas de pagamento, etc. Quando tiverem com a loja virtual funcionando me avisem para eu visitar =D.

Até a próxima!

18 comentários:

Rodrigo Flores Perez disse...

Encontrei teu blog hoje na net e achei interessantíssimo.
Estou começando a estudar php e não tinha conhecimento de OO pra PHP.
Estarei acompanhando assiduamente seu blog.

Abraços.

Unknown disse...

Já ajudou bastante! Agradecida!

Anônimo disse...

Nossa! quanto erro!

Bruno Nunes disse...

Para o amigo que encontrou muitos erros vale à pena mostrá-los e sugerir melhorias. Assim todos aprendemos e crescemos.

Anônimo disse...

O correto seria:

< ?php

class Produto {

var $codigo;
var $descricao;
var $preco;
var $quantidade;

function Produto($codigo,$descricao,$preco,$quantidade) {
$this->codigo = $codigo;
$this->descricao = $descricao;
$this->preco = $preco;
$this->quantidade = $quantidade;
}

function getCodigo() {
return $this->codigo;
}

function getQuantidade() {
return $this->quantidade;
}

function setQuantidade($quantidade) {
$this->quantidade = $quantidade;
}

function getValor() {
return $this->preco * $this->quantidade;
}


}


class CarrinhoDeCompras {

var $carrinho;

//Coloca o novo Carrinho de Compras na sessão
function CarrinhoDeCompras() {
session_start();
$_SESSION['carrinho'] = Array();

}

//Atualiza os dados da sessão
function atualizaDados() {
$_SESSION["carrinho"] = $this->carrinho;
serialize($_SESSION["carrinho"]);
}

//Pega os dados da sessão
function getCarrinho() {
$this->carrinho = unserialize($_SESSION["carrinho"]);
}

//Adiciona um item no carrinho de compras
function adicionaItem($produto) {
//Pega os dados atualizados da sessão
$this->getCarrinho();

$codigo = $produto->getCodigo();
//Seo produto ainda não está no carrinho adicione
if (!isset($this->carrinho[$codigo])) {
$this->carrinho[$codigo] = $produto;
}
//Caso contrário, apenas incremente a quantidade do produto já existente
else {

$quantidade = $produto->getQuantidade() +
$carrinho[$codigo]->getQuantidade();
$this->carrinho[$codigo]->setQuantidade($quantidade);
}

//Atualiza os dados da sessão
$this->atualizaDados();
}


//Remove um item do carrinho de compras
function removeItem($produto) {
$this->getCarrinho();

$codigo = $produto->getCodigo();
unset($this->carrinho[codigo]);

$this->atualizaDados();
}

//Pega o valor total das compras do usuário
function getTotal() {
$this->getCarrinho();
$total = 0;

foreach($this->carrinho as $produto) {
$total += $produto->getValor();
}

return $total;
}

}

? >

Bruno Nunes disse...

Obrigado por postar o seu código, mas confesso que não entendi os erros apontados.
Pelo que eu vi você apenas adicionou as funções serialize e unserialize (ísso não é obrigatório, já que eu poderia jogar as variáveis na sessão sem serializá-las), e mudou a comparação de isset para !null que aparentemente dá no mesmo (E como eu removo o item do carrinho com unset, faz mais sentido usar isset para testar).
É possível que eu tenha esquecido um $ ou um ;, mas os erros apontados por você são discutíveis, amigo.
Abraços.

Anônimo disse...

Alguma ajuda de como utilizar esta classe (exemplo simples),

Obrigado

Nielson Rolim disse...

Também achei alguns enganos, mas nada muito grave.
A lógica das classes está certa.
Só que você esqueceu do $ em algumas variaveis, como por exemplo:

$this->carrinho[codigo]

ao invés de:

$this->carrinho[$codigo]


ou


return this->codigo;

ao invés de:

return $this->codigo;

Disse engano, por em outras partes do código está certo. Parece confusão de quem tá acostumado a programar em Java, to certo?

O único erro foi na declaração do array:

errado:
$_SESSION["carrinho"] = new Array();

certo:
$_SESSION["carrinho"] = Array();

Fora isso o código está ótimo. Me ajudou bastante. Valeu!

Anônimo disse...

Fala Bruno Nunes, acho que você deveria seguir os comentários e corrigir os erros possíveis no código, pelo que vejo, ainda continuam... o código está ótimo, mas precisa somente corrigir os erros de sintaxe.

Abraços!

Rafael Fernandes disse...

Está dando erro quando deleto um produto.
Fatal error: Call to a member function getCodigo() on a non-object in C:\Servidor PHP\www\class_ecommerce.php on line 74

else if( $acao == "del" ){
$cod_produto = $_GET["cod"];
$carrinho->removeItem($cod_produto);
}

Anônimo disse...

Rafael, você mexeu no código?

Porque não estou achando essa parte que você escreveu ai...

Abraços,
me add no msn: lucas@kachola.com

Anônimo disse...

Aprendi muito

osniantonio disse...

Obs.: Não adiciona produtos ao carrinho...

id = $id;
$this->codigo = $codigo;
$this->nome = $nome;
$this->preco = $preco;
$this->quantidade = $quantidade;
$this->quantidadecaixa = $quantidadecaixa;
}
function getId()
{
return $this->id;
}
function getCodigo()
{
return $this->codigo;
}
function getQuantidade()
{
return $this->quantidade;
}
function setQuantidade($quantidade)
{
$this->quantidade = $quantidade;
}
function getQuantidadeCaixa()
{
return $this->quantidadecaixa;
}
function getPreco()
{
return $this->preco * $this->quantidade;
}
}
?>

osniantonio disse...

carrinho;
serialize($_SESSION["carrinho"]);
}
//Pega os dados da sessão
function getCarrinho()
{
if (!isset($_SESSION))
{
SESSION_START();
}
//$this->carrinho = unserialize($_SESSION["carrinho"]);
$this->carrinho = $_SESSION["carrinho"];
}
//Adiciona um item no carrinho de compras
function adicionaItem($produto)
{
//Pega os dados atualizados da sessão
$this->getCarrinho();
$id = $produto->getId();
//Seo produto ainda não está no carrinho adicione
if (!isset($this->carrinho[$id]))
{
echo "ainda nao está no carrinho
";
$this->carrinho[$id] = $produto;
}
//Caso contrário, apenas incremente a quantidade do produto já existente
else
{
echo "Já está no carrinho
";
$quantidade = $produto->getQuantidade() + $carrinho[$id]->getQuantidade();
$this->carrinho[$id]->setQuantidade($quantidade);
}
//Atualiza os dados da sessão
$this->atualizaDados();
}
//Remove um item do carrinho de compras
function removeItem($produto)
{
$this->getCarrinho();
$id = $produto->getId();
unset($this->carrinho[$id]);
$this->atualizaDados();
}
//Pega o valor total das compras do usuário
function getTotal()
{
$this->getCarrinho();
$total = 0;
foreach($this->carrinho as $produto)
{
$total += $produto->getPreco();
}
return $total;
}

//Pega o número de ítens no carrinho de compras
function getNumeroTotal()
{
$this->getCarrinho();
$total = 0;
foreach($this->carrinho as $produto)
{
$total += 1;
}
return $total;
}
}
?>

osniantonio disse...

getGlobalPOSTorGET($idproduto);

// Id da Categoria
$idcategoria = "idcategoria";
$idcategoria = $objSe->getGlobalPOSTorGET($idcategoria);

// Id da SubCategoria1
$idsubcategoria1 = "idsubcategoria1";
$idsubcategoria1 = $objSe->getGlobalPOSTorGET($idsubcategoria1);

// Quantidade
$quantidade = "xunidades";
$quantidade = $objSe->getGlobalPOSTorGET($quantidade);

// Resgantando do banco informações adicionais do Produto
$codigo = "";
$nome = "";
$preco = "";
$quantidadecaixa = "";
$query = "select * from produto where id=$idproduto";
echo $query."
";
$resultado = $obj->executaQuery($query);
while ( $linha = mysql_fetch_array($resultado) )
{
$codigo = $linha['codigo'];
$nome = $linha['nome'];
$preco = $linha['preco'];
$quantidadecaixa = $linha['quantidade'];
}

// Setar dados do produto
$objProduto->setProduto($idproduto,$codigo,$nome,$preco,$quantidade,$quantidadecaixa);

// Adiciona o Produto ao Carrinho de Compras
$objCarrinhoDeCompras->adicionaItem($objProduto);

// Preço Total no Carrinho de Compras
echo "Quantidade->".$quantidade."
TOTAL->".$objCarrinhoDeCompras->getTotal()."
";

// Total no Carrinho de Compras
echo $objCarrinhoDeCompras->getNumeroTotal();
?>

José Luiz disse...

QUEM NUNCA ERROU QUE ATIRE A PRIMEIRA PEDRA!!!

Bruno, apesar de todos esses erros você está de parabéns pela coragem de postar suas idéias! Continue assim e logo será um profissional na área! Abraço!

Drucila Gramani disse...

Eu preciso muito de um código completo de carrinho de compras em phpOO, onde posso conseguir um?

deusadru@gmail.com

Drucila Gramani disse...

Eu preciso muuuuuuito de um código completo em phpOO funcionando o carrinho de compras, estou a procura e está muitoooo difícil, se alguém pode me ajudar eu agradeceria muito.

deusadru@gmail.com