Carrinho de compras com Zend Framework
Autor: Maurício Vinicius de O. Santos | Publicado: 2009-06-23T07:31:00-07:00

E ai pessoal,Desculpem minha ausência, tenho me ocupado muito com alguns projetos que tenho feito por fora.Tenho mexido bastante com o Zend Framework e só tenho uma coisa a dizer: Estou tendo bem menos dor de cabeça do que quando programava com PHP puro. Isso sem falar da organização do projeto em MVC, os benefícios do Zend_Layout, etc.Em um dos projetos, tive que construir um carrinho de compras utilizando Session.Eu li um livro sobre Zend Framework, que ensina a criar um carrinho de compras com o Zend_Registry.O problema do Zend_Registry é que ele não utiliza sessões, mas sim variáveis globais.Eu não me basiei nesse livro, então caso saiba de qual livro estou me referindo, esqueça o carrinho que você aprendeu lá caso queira fazer um carrinho baseado em Session.Para a criação de Sessions no Zend, nós utilizamos a classe Zend_Session_Namespace();Como essa é uma classe singleton, caso já tenha sido criada uma instância da mesma, apenas é retornado a instância já criada. Você pode tentar criá-la várias vezes, mas ela apenas retornará a instância que já foi criada, até que ela seja liberada da memória.Ou seja, o Zend simplesmente ignora a criação do novo objeto vazio e continua a session com os mesmos valores já gravados.Eu ajustei uma classe que peguei em um forum sobre ZF. Ela "manuseia" uma session e achei que valeria a pena incluí-la no meu projeto.Como tive muito problemas ao postar o código nesse blog, eu printei as telas.Pois o blog não estava permitindo que eu colocasse os conteudosSegue abaixo a classe. Você pode ajustá-la conforme suas necessidades. Para nosso carrinho, creio que seja o suficiente da forma como a deixei.CLASSE "CONTROLADORA" DAS NOSSAS SESSIONSEu já dei o name do meu namespace de carrinho, mas você pode colocar no construtor da classe um parâmetro que seria o nome do seu namespace. Caso você não de um nome para o namespace, ele adota o valor Default.Ficaria assim: Zend_Session_Namespace('Default');ACTION DE INCLUSÃO DE ITEM NO CARRINHOLISTANDO OS ITENS NO CARRINHOPara listar os itens no carrinho é simples, basta fazer um foreach da variavel carrinho, que atribuimos o valor no nosso controller: "$this->view->carrinho = $carrinho;"$carrinho = $this->carrinho;$chave = @array_keys($carrinho);for($ i = 0; $i < count ($chave);$ i ++){$indice = $chave[$i];  //CRIANDO O OBJETO DA NOSSA CLASSE DE PERSISTENCIA COM A BASE DE DADOS, DA TABELA PRODUTOS.$produtos = new Produtos();$where = "idproduto = ".$carrinho[$indice]['idproduto'];//PUXANDO OS DADOS DO PRODUTO$produto = $produtos->fetchRow($where);}Eu estou criando um objeto da nossa classe de persistencia (model), para poder visualizar o nome do produto, qtde em estoque, entre outras coisas.Você pode usar seu próprio modelo.Caso queira apenas mostrar o código do produto e quantidade escolhida pelo usuário, você poderia implementar o código abaixo:$carrinho = $this->carrinho;$chave = @array_keys($carrinho);for($ i = 0;$ i< sizeof ($chave); $ i ++){//GUARDANDO O INDICE DO ARRAY$indice = $chave[$i];//MOSTRANDO OS DADOS INCLUIDOS NO CARRINHOecho $carrinho[$indice]['idproduto']." - ".$carrinho[$indice]['qtde'];}ATUALIZANDO E EXCLUINDO ITENS DO CARRINHOPara atualizar ou excluir itens de um carrinho, eu coloquei um checkbox em nosso carrinho de compras, contendo o indice do mesmo ($indice), então eu aplico um submit do formulário contendo os itens incluidos.O formulário nos enviará para uma action chamada udcarrinhoAction().Segue abaixo minha action udcarrinho:Caso vocês queiram apagar todos os itens do carrinho, basta usar o método emptySess da nossa classe.Caso tenham dúvidas em como montar o formulário do carrinho, entrem em contato comigo. Farei de tudo para ajudar.The Best regards for you guys!! ;)