Você está na página 1de 83

Sistemas de e-commerce em PHP

(Apostila utilizada nos cursos Alfamdia de PHP em 2007 disponibilizada agora gratuitamente)

Sistema de e-commerce em PHP

Todos os direitos reservados para Alfamdia Prow LTDA.

AVISO DE RESPONSABILIDADE As informaes contidas neste material de treinamento so distribudas NO ESTADO EM QUE SE ENCONTRAM, sem qualquer garantia, expressa ou implcita. Embora todas as precaues tenham sido tomadas na preparao deste material, a Processor Alfamdia LTDA. no tm qualquer responsabilidade sobre qualquer pessoa ou entidade com respeito responsabilidade, perda ou danos causados, ou alegadamente causados, direta ou indiretamente, pelas instrues contidas neste material ou pelo software de computador e produtos de hardware aqui descritos.

04/2007 Verso 1.1 Alfamdia Prow LTDA Porto Alegre, RS (51) 3073-2100 http://www.alfamidia.com.br

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Sistemas de e-commerce em PHP

UNIDADE 1 UNIDADE 2 UNIDADE 2 UNIDADE 3 UNIDADE 4 UNIDADE 5 UNIDADE 6 UNIDADE 7 UNIDADE 8 UNIDADE 9 UNIDADE 10 UNIDADE 11 UNIDADE 12 UNIDADE 13 UNIDADE 14 UNIDADE 15 UNIDADE 16

ORGANIZAO DO CURSO .......................................................................................... 4 INTRODUO ................................................................................................................... 5 A CLASSE TEMPLATE POWER.................................................................................... 7 INTRODUO AO E-COMMERCE ............................................................................ 13 ESTRUTURA DA LOJA VIRTUAL .............................................................................. 14 A PGINA INICIAL ....................................................................................................... 22 ARQUIVOS, CLASSES E MTODOS PARA A LOJA ............................................... 24 O ARQUIVO PHP INICIAL ........................................................................................... 26 ELABORAO DO ARQUIVO CSS: ........................................................................... 29 A LISTAGEM DE PRODUTOS ..................................................................................... 32 O FORMULRIO DE CONTATO ................................................................................ 36 A IMPLEMENTAO DO CARRINHO DE COMPRAS .......................................... 40 O SCRIPT DO CARRINHO DE COMPRAS ................................................................ 44 FINALIZAO DA COMPRA ...................................................................................... 50 A ADMINISTRAO DA LOJA ................................................................................... 57 VALIDANDO A SESSO................................................................................................ 62 EFETUANDO LOGOUT, FINALIZANDO A SESSO............................................... 81

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Unidade 1 Organizao do curso

1.1 Sobre o Curso


O Curso Sistemas de E-commerce em PHP oferece aos alunos um apanhado geral sobre tcnicas e conceitos envolvidos no desenvolvimento de um Sistema de E-commerce. Ao final do curso os alunos sero capazes de desenvolver um Sistema completo de Ecommerce utilizando a linguagem PHP.

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Unidade 2 Introduo
A elaborao de sistemas para web sites pode ser totalmente independente do desenvolvimento do prprio web site. Se o seu cliente j possui um web site e deseja somente agregar novas ferramentas ou atratividades, esse o caminho ideal para a obteno de um timo resultado com rapidez e agilidade. A implantao de uma loja virtual, por mais simples que seja, d uma boa impresso aos visitantes do web site, visto que para ser implementada deve ter passado por um processo de elaborao bastante criterioso, a fim de no deixar margem a possveis erros e reclamaes dos usurios. Dessa forma, um sistema como esse poder, alm de ampliar o alcance da loja e dos produtos da mesma no mercado, dar ao visitante e os clientes uma aparncia de controle e boa estrutura fsica e administrativa da empresa. O desenvolvimento desse um sistema desse porte deve ser muito bem elaborado desde o inicio e, por esse motivo, indispensvel a implementao de alguns passos. Esses passos podem ser: Anlise do problema. Modelagem dos dados e verificao da integridade das tabelas. Diagrama de funcionamento. Desenvolvimento do site map. Reutilizao de arquivos (includes, funes e classes). Criao dos layouts (telas). Criao das pginas de processamento (PHP). Testes e ajustes.

Este sistema que estaremos desenvolvendo ainda contar com a utilizao de uma programao bem organizada e, de uma certa forma, portvel, baseada em orientao a objetos, uma vez que o PHP nos possibilita esse uso. Utilizaremos a classe TemplatePower para tal fim. Antes de comearmos a desenvolver as etapas para a criao de uma loja virtual, veremos como utilizar a classe TemplatePower.

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Unidade 2 A classe Template Power


Com a melhor integrao do PHP ao paradigma de orientao a objetos, diversas classes foram implementadas e distribudas com o objetivo de facilitar a vida dos programadores. Dentre classes que manipulam imagens, arquivos em pdf, compactao de arquivos, etc. uma delas destaca-se por resolver um dos maiores problemas enfrentados no desenvolvimento de aplicaes web em php a mistura do cdigo HTML com a linguagem dinmica. A classe Template Power teve sua ltima verso implementada em 15 de maro de 2003, e est disponvel para download no site: http://templatepower.codocad.com/download.php , veja abaixo um exemplo comparativo de como funciona a classe Template Power:

<html> <body> . . . </body> </html>

<?php $sql = select .... echo Resultado:; . . ?>

CSS

HTML

PHP

JS

XML

Comportando-se como uma parede divisria entre as duas codificaes, a sistemtica de implementao facilitada, pois o layout (HTML) no fica mais misturado com a aplicao (PHP). Problemas como alterao de layout do site no afetam mais a estrutura de programao, problemas que eram comuns principalmente quando utilizvamos aplicativos para a manipulao do layout os quais no interagiam com a linguagem, eliminando as vezes algumas linhas de programao essenciais na aplicao do site. A forma de manipulao do layout segue-se que teremos um arquivo PHP para cada arquivo HTML que confeccionarmos, sendo que em casos mais especficos poderemos realizar a juno de dois, ou mais arquivos com o intuito de formamos uma pagina nica.

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Veja a seguir os mtodos existentes na classe Template Power e como se segue o comportamento de cada um.

Mtodo TemplatePower() assignInclude prepare assign() newBlock()

Funcionalidade: Mtodo construtor Juno de dois ou mais arquivos de layout. Mtodo que prepara o documento HTML para interpretao do PHP. Responsvel pela substituio de strings do HTML por contedo dinmico do PHP. Mtodo responsvel por direcionar o ponteiro de leitura da classe para determinada rea do documento HTML. Mtodo responsvel por enviar o ponteiro de leitura da classe para fora de determinado bloco. Opo que serve para debug de variveis que no foram assignadas. Retorna todo contedo gerado pelo HTML para uma varivel, muitop utilizado em scripts para envio de newsletters e mailing. Mtodo final que mostra o resultado gerado pela classe na tela em formato HTML.

gotoBlock()

showUnAssigned() getOutPutContent()

printToScreen()

Os arquivos de layout podem possuir extenso HTML, ou TPL. Entretanto a segunda menos utilizada devido a falta de capacidade de interpretao dessa extenso por aplicativos de desenvolvimento de layout (Macromedia Dreamweaver por exemplo). Para utilizarmos a classe deveremos sempre dar um INCLUDE no arquivo class.TemplatePower.php. Esse include dever estar presente em cada arquivo php que precise de um layout para ser apresentado.

2.1 Exemplo 1
Vamos criar o nosso primeiro documento utilizando a classe Template Power. Comece criando um documento com extenso .HTM e salvando o arquivo com o nome de exemplo1.htm.
<html> <head>

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP <title>.:: Exemplo 1 ::.</title> </head> <body> Bem Vindo, {fulano} </body> </html>

Como voc pode observar o cdigo possui uma palavra entre chaves, {fulano}, a classe Template Power possui mtodos que visam substituir o contedo de palavras entre chaves por contedo dinmico gerado pelo script em php. Na segunda parte do nosso exemplo iremos criar agora um arquivo com extenso .PHP que possuir o mesmo nome que o criado anteriormente (exemplo1.php). O cdigo dever ficar como mostrado abaixo:
<?php include("class.TemplatePower.php"); $tpl = new TemplatePower("ex_1.htm"); $tpl->prepare(); $tpl->assign("fulano","Ccero Feijo"); $tpl->printToScreen(); ?>

Observe a ordem que os mtodos esto sendo mencionados no cdigo:

2.2 Estruturas de repetio


Estruturas de repetio so comumente usadas na exibio de registros que foram recuperados do banco de dados, visando mostrar de uma maneira mais agradvel os registros na integrao com o Template. Estas estruturas devem ser citadas no arquivo de Template de uma forma bastante especifica, neste caso, utilizamos comentrios em HTML para simbolizar uma estrutura de repetio ou BLOCO. Veja o exemplo abaixo:
<!-- START BLOCK : numeros --> <tr> <td>{numero}</td> <td>{numero_vezes_10}</td> </tr>

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP <!-- END BLOCK : numeros -->

No arquivo PHP que ser responsvel por processar este Template, iremos nos referir a este BLOCO da seguinte maneira:
for($x = 0; $x < 10; $x++){ $tpl->newBlock('numeros'); $tpl->assign("numero",$x); $tpl->assign("numero_vezes_10",$x*10); } $tpl->gotoBlock(_ROOT);

No esquecendo do mtodo gotoBlock(_ROOT), o qual responsvel por liberar o ponteiro de leitura do arquivo do Template, disponibilizando a leitura do restante do arquivo HTML.

2.3 Integrao entre arquivos de Template diferentes


Dentre as formas de montagem de um site utilizando Template, uma das mais usadas a mesclagem de diversos arquivos de Template de forma que estes sejam interpretados pelo script PHP de forma nica. Chamamos esse processo de Incluso de Bloco. Um exemplo prtico seria a incluso de um MENU ou RODAP no site, o qual tivessem a necessidade de interpretao de contedo dinmico.

10

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

A maneira de integrar estes trs arquivos no mesmo Template se d da seguinte forma: Arquivo HTML:
<body> <!-- INCLUDE BLOCK : TOPO --> <!-- INCLUDE BLOCK : CONTEUDO --> <!-- INCLUDE BLOCK : RODAPE --> </body>

Arquivo PHP:
$tpl->new TemplatePower('../htm/modelo.htm'); $tpl->assignInclude('topo','../htm/topo.htm'); $tpl->assignInclude('conteudo','../htm/conteudo.htm'); $tpl->assignInclude('rodape','../htm/rodape.htm'); $tpl->prepare(); . . . $tpl->printToScreen();

11

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

O processamento dos arquivos ser feito somente por um arquivo PHP, sendo que todas as TAGS de Template colocadas em ambos sero interpretadas de uma nica vez.

2.4 Exerccio:
Confeccione uma seo inicial de um site, que possua trs arquivos, um cabealho, um rodap, um menu lateral. No topo do cabealho dever ser apresentada a data atual, e no rodap do mesmo os crditos de implementao do projeto. Voc dever possuir apenas um script PHP gerenciando estas trs partes do site.

12

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Unidade 3 Introduo ao E-Commerce


Atualmente com o vinculo cada vez maior da internet ao nosso dia a dia, no basta apenas para um empresa possuir uma propaganda da sua corporao publicada na internet de forma esttica, esse contedo deve ser apresentado como uma espcie de servio, onde o cliente possa interagir com o site, e obter informaes diretas e precisas sobre o que procura. Alm da divulgao de produtos e empresas a internet acabou tendenciando uma nova forma de comrcio, o E-Commerce, ou comrcio eletrnico, onde existem algumas modalidas que merecem ser citadas aqui.

B2B: Business to Business: comrcio praticado entre fornecedores e clientes empresarias, ou seja, de Empresa para Empresa. B2C: Business to Consumer: comrcio efetuado diretamente entre a empresa produtora, vendedora ou prestadora de servios com o consumidor final. C2C: Consumer to Consumer: comrcio eletrnico entre usurios da internet, no envolvendo intermedirios, sendo realizado direto pelo consumidor final. G2C: Government to Consumer: do governo para os consumidores, como pagamento de tarifas, declarao de impostos, multas e tarifas publicas. G2B: Government to Business: relao de negcios na internet entre governos e empresas.
Veremos a seguir a implementao parte a parte de cada mdulo para o desenvolvimento de um Comrcio Virtual na modalidade B2C, mas que pode ser aplicado a qualquer uma das outras mencionadas acima, sem necessidade de remodelaes discrepantes.

13

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Unidade 4 Estrutura da Loja Virtual


Para a elaborao de uma loja virtual que supra as necessidades do cliente deveremos executar cada passo visto na formao at o momento. Desde a diagramao Entidade Relacionamento do Banco de Dados, at a implementao dos scripts em PHP e arquivos de Template do Projeto. Nosso projeto final ser como mostrado na imagem abaixo, possuindo um ambiente administrativo responsvel por alimentar os dados da loja (Cadastro de Produtos e Tipos de Produtos) e possibilitar o acompanhamento de Pedidos que foram efetuados na loja.

4.1 O Diagrama E.R. do Banco de Dados


Abaixo voc pode acompanhar como ser a estrutura do banco de dados para a loja, apesar de ser uma estrutura simplificada ela possibilita que implementaes adjacentes que venham a surgir de cliente para cliente sejam implementadas sem a necessidade de mudanas relevantes no Banco de Dados.

14

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

O Banco ser composto pelas seguintes tabelas:

1. tipo_produtos: tabela responsvel por armazenar os dados dos tipos de produtos existentes na loja (hardware, software, suprimentos, etc). 2. produtos: tabela responsvel por armazenar todos os produtos que esto cadastrados na loja virtual, campos essenciais como nome, descrio e valor esto presentes, ressaltando-se o campo destaque o qual servir para destacar alguns produtos que sero apresentados na pgina inicial do site. 3. clientes: relao de todos os clientes que compraram na loja, no processo final ser solicitado o cadastro do cliente ou a login do mesmo caso j possua cadastro conosco. 4. pedidos: tabela que armazena o resumo de pedidos, coletando dados simplificados da compra como cdigo do cliente, data do pedido e total do pedido. 5. produtos_pedidos: tabela relacional responsvel por vincular produtos da loja com os pedidos efetuados pelos clientes j cadastrados. importante mencionar que essa tabela alem de armazenar o cdigo do produto, armazena tambm os seu valor no momento da compra, evitando que futuras alteraes nos preos venham a comprometer os dados j adicionados no banco. 6. usuarios: nessa tabela esto cadastrados os usurios que sero capazes de administrar a loja, observe que o campo senha um VARCHAR de 50, sendo necessrio esta tipagem para armazenarmos senhas criptografadas em MD5, aumentando assim a confiabilidade e segurana do ambiente.

15

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

7. newsletter_recipes: nessa tabela iremos armazenar os dados de usurios interessados em receber o informativo da loja, veja o script de envio de newsletter no final da apostila como material extra.

4.2 Processo de compra: como funciona?


Para a elaborao dos scripts deveremos verificar como ser o processo de compra na loja, desde a entrada do cliente at a finalizao da compra no sistema. Isso pode ser facilmente demonstrado com o digrama abaixo:

Entrada da Loja (index.php)

Seleo de produtos no Comprar? sim Colocar no carrinho sim

Continuar comprando? no Finalizar Compra

no Possui Cadastro? sim Efetua Login e Fim Efetua cadastro

16

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Todas as compras do cliente sero armazenadas em um vetor bidimensional de sesso, ou seja, caso o usurio feche o navegador ele ir perder todos os produtos existentes no seu carrinho. O propsito da utilizao de variveis de sesso nesse caso visa aumentar a segurana da compra e eliminar consultas desnecessrias ao banco de dados, o que ocasionaria queda de desempenho.

Para a criao do Banco de Dados podemos utilizar qualquer ferramenta j vista na formao, ou bata utilizarmos a query disponvel abaixo diretamente no console do MYSQL.
#TABELA DE CLIENTES CREATE TABLE IF NOT EXISTS clientes ( id_cliente int(11) NOT NULL auto_increment, nome varchar(100) , endereco varchar(100) , cidade varchar(50) , estado char(2) , cep varchar(10) , fone varchar(20) , email varchar(100) , cpf varchar(15) , senha varchar(50) , PRIMARY KEY (id_cliente) ); #TABELA DE NEWSLETTER CREATE TABLE IF NOT EXISTS newsletter_recipes ( id_recipe int(11) NOT NULL auto_increment, nome varchar(100) , email varchar(100) NOT NULL DEFAULT '' , recebe char(3) DEFAULT 'Sim' , dt_cadastro date , PRIMARY KEY (id_recipe) ); #TABELA DE PEDIDOS CREATE TABLE IF NOT EXISTS pedidos ( id_pedido int(11) NOT NULL auto_increment, id_cliente int(11) NOT NULL DEFAULT '0' , dt_pedido date NOT NULL DEFAULT '0000-00-00' , total_pedido float(8,2) , PRIMARY KEY (id_pedido) );

17

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

#TABELA DE PRODUTOS CREATE TABLE IF NOT EXISTS produtos ( id_produto int(11) NOT NULL auto_increment, id_tipo int(11) NOT NULL DEFAULT '0' , nome varchar(100) , descricao text , valor float(8,2) , destaque char(3) DEFAULT 'No' , foto varchar(100) , PRIMARY KEY (id_produto) ); #TABELA RELACIONAL DE PRODUTOS POR PEDIDOS CREATE TABLE IF NOT EXISTS produtos_pedidos ( id_pedido int(11) NOT NULL DEFAULT '0' , id_produto int(11) NOT NULL DEFAULT '0' , valor float(8,2) NOT NULL DEFAULT '0.00' , qtd tinyint(3) unsigned ); #TABELA DE TIPO DE PRODUTOS CREATE TABLE IF NOT EXISTS tipo_produtos ( id_tipo int(11) NOT NULL auto_increment, nome varchar(50) , PRIMARY KEY (id_tipo) ); #TABELA DE USURIOS CREATE TABLE IF NOT EXISTS usuarios ( id_usuario int(11) NOT NULL auto_increment, usuario varchar(20) , senha varchar(50) , PRIMARY KEY (id_usuario) );

18

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

4.3 A estrutura de diretrios (site_map)


Com a utilizao da classe Template Power notamos que a organizao dos scripts modificada, tanto na questo referente a implementao, quanto a organizacional. Para isso podemos adotar um padro que melhora ainda mais o armazenamento de nosso arquivos no servidor. Observe a imagem a seguir:
Diretrio Raiz do Site css htm

img

php png

fotos includes

classes js index.php

Como podemos notar, o nico arquivo presente na raiz do site o index.php, este mesmo arquivo ser responsvel apenas por redirecionar o usurio do site para a pasta PHP que possuir o arquivo responsvel por carregar o layout da pgina.

19

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Outro diretrio que tambm deve receber uma ateno especial o INCLUDES, nele esto presentes as classes de conexo com banco de dados, template power e uma classe responsvel pela manipulao de dados diversos, como converso de datas e valores. No subdiretrio JS armazenaremos scripts em javascript que sero teis na loja virtual.

4.4 O layout (template)


Ao utilizarmos a sistemtica de Templates com o template power, deveremos primeiramente definir o que ser e como ser dividido o template principal da pgina. No nosso caso, possuiremos uma determinada rea do documento que se modificar a cada clique de troca de sesso ou comportamento que for atribudo pelo usurio, a essa rea daremos o nome de CONTEUDO, o restante da pgina nunca se modificar, ou seja, permanecer sempre com a mesma aparncia no importando a ao executada pelo visitante dentro do site. Uma sugesto de montagem dessa estrutura segue-se abaixo:

Como podemos ver somente o centro do site ser modificado, nele exibiremos informaes como o carrinho de compras do usurio, os produtos que esto sendo listados, o formulrio de compras, etc. O que podemos abstrair dessa idia que poderemos criar um BLOCO no Template que ira unir e incorporar essas informaes variadas ao site conforme formos navegando.

20

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

21

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Unidade 5 A pgina inicial


Inicialmente vamos criar um arquivo chamado modelo_site.htm. Este arquivo ser o responsvel por unir todos os outros e conter todo contedo tanto dinmico quanto esttico do site. Ele formado basicamente por um menu superior de 3 botes, os quais apontam para o documento principal (HOME), para a listagem de produtos (PRODUTOS) e por fim para um formulrio de contato (CONTATO). Ainda no topo deste mesmo documento teremos um link que ser responsvel por mostrar os produtos do carrinho de compras do usurio, e logo abaixo um formulrio simples para o login no ambiente administrativo do site.

Aps a montagem do esqueleto do site, teremos que definir as strings em html que sero substitudas pelo PHP no arquivo modelo_site.php. Como estamos trabalhando com uma estrutura que dar liberdade de alterao do layout sempre que desejado pelo cliente, devemos refletir que at mesmo os links do site sero interpretados pelo template. Ento na tabela superior do documento atual iremos atribuir os seguintes valores aos links de menu:
Link Home: <a href={link_home}> Link Produtos: <a href={link_produtos}> Link Contato: <a href={link_contato}> Faremos a mesma coisa no link do carrinho de compras: Link Carrinho: <a href={link_carrinho}>

22

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Agora, na tabela de login no podemos esquecer-nos de colocar criarmos um formulrio que receber os dados de login do administrador e o redirecionar para o ambiente administrativo caso o login tenho sido efetuado com sucesso. Caso contrrio, exibiremos uma mensagem nesta mesma tela informando que o usurio e a senha esto incorretos. Para isso deixaremos uma string chamada {msg_login} na linha superior ao formulrio. No centro do site deveremos listar os produtos que esto configurados para serem destaques, para facilitar a organizao criaremos um outro arquivo HTML que ser mesclado com o modelo_site.htm e mostrar os resultado final conforme visto no inicio do projeto. A esse arquivo daremos o nome de destaques.htm. O arquivo possuir a seguinte formatao:

Para cada produto encontrado no banco de dados que se define como destaque, iremos executar um loop de repetio. Quando necessitamos de uma estrutura de repetio em um template logo notamos que devemos criar um novo bloco. Observe que a tabela central do layout acima apresentado quem ser repetida a cada volta do lao. Podemos deixa-la ento dentro de uma tag de loop do template como mostrado abaixo:
<!START BLOCK : PRODUTOS --> . . . <!END BLOCK : PRODUTOS -->

Aps a montagem do arquivo modelo_site.htm e destaques.htm, deveremos agora criar o arquivo php que ser capaz de interpret-lo e exibi-lo na web, mas antes iremos implementar um classe responsvel por tratar os dados que sero exibidos para o usurio.

23

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Unidade 6 Arquivos, classes e mtodos para a loja


A seguir iremos implementar alguns mtodos que sero importantes para a manipulao de dados especficos na nossa loja, como o tratamento de datas e valores numricos referentes a moeda. Chamaremos essa classe de classUtil.php, onde os mtodos acima ser encapsulados, salve-a no diretrio INCLUDES do site.
class Util { #Mtodo que Formata um numero decimal function formataDecimal($numero){ $numero = str_replace(".",",",$numero); $num_vet = explode(",",$numero); if(sizeof($num_vet) == 1){ $numero = $numero . ",00"; }else{ if(strlen($num_vet[1]) < 2) $numero = $numero . "0"; } return $numero; } #Mtodo que converte um decimal para o formato do BANCO function converteDecimal($numero){ $converte=explode(",", $numero); return $converte[0].".".$converte[1]; } #Mtodo que converte uma data em formato Portugus ou Ingls com validao function formata_data($data){ if (strlen($data) > 0 && $data != '0000-00-00'){ if (ereg ("([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})", $data)){ list ($dia, $mes, $ano) = explode ("/", $data); $this->data = ($ano."-".$mes."-".$dia); }else{ list ($ano, $mes, $dia) = explode ("-", $data); $this->data = ($dia."/".$mes."/".$ano);

24

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP } return $this->data; }else return ""; } }

Como iremos manipular o banco de dados essencial que tenhamos um arquivo responsvel para conectar-se ao banco, e que possua uma facil configurao quando o site for exportado para outro servidor. Crie um novo arquivo PHP com o nome de CONEXAO.PHP e salve-o no diretrio INCLUDES do site.
<?php #Conecta com o banco de dados mysql_connect('localhost','root','') or die ('Erro de conexao'); #Seleciona database mysql_select_db('ecommerce'); ?>

25

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Unidade 7 O arquivo php inicial


Salve o arquivo atual, mas no o feche, crie agora um novo arquivo com extenso .PHP e salve-o no diretrio PHP do site da loja, com o nome de modelo_site.php.
include('../includes/classTemplatePower.php'); include('../includes/conexao.php'); include('../includes/classUtil.php');

Para incorporamos os dois documentos j montados anteriormente, deveremos primeiro instanciar a classe template power dentro do modelo_site.php, e logo aps realizar a juno do arquivo destaques.htm no documento.
$util = new Util; $tpl = new TemplatePower('../htm/modelo_site.htm'); $tpl->assignInclude('CONTEUDO','../htm/destaques.htm'); $tpl->prepare();

A prxima etapa substituirmos os termos dados aos links do menu pelos documentos que sero vinculados ao site.
#===== MONTA OS LINKS DO MENU SUPERIOR ===== $tpl->assign('link_home','../php/modelo_site.php'); $tpl->assign('link_produtos','../php/produtos.php'); $tpl->assign('link_contato','../php/contato.php'); $tpl->assign('link_carrinho','../php/carrinho.php');

A etapas acima descritas faro parte da maioria dos documentos que iremos confeccionar a seguir, entretanto as consultas ao banco sero bastante diversificadas, e sero colocadas sempre aps estas linhas iniciais. Como estamos implementando o documento principal do site, e este por sua vez possui uma listagem dos produtos que esto catalogados como destaque, devemos realizar a seguinte requisio ao banco de dados via PHP, para exibirmos os registros no documento.

26

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP #===== SELECIONA OS DESTAQUES DO BANCO ===== $sql = "select produtos.* from produtos where produtos.destaque = 'Sim' order by rand()"; $rs = mysql_query($sql) or die('Erro de produtos'); $total = mysql_num_rows($rs); for($x = 0; $x < $total; $x++){ $tpl->newBlock('PRODUTOS'); $tpl->assign('nome',mysql_result($rs, $x, 'nome')); $tpl->assign('descricao',mysql_result($rs, $x, 'descricao')); $tpl->assign('valor',$util>formataDecimal(mysql_result($rs, $x, 'valor'))); $tpl>assign('link_comprar','../php/carrinho.php?acao=comprar&i d_produto='.mysql_result($rs, $x, 'id_produto')); if(strlen(mysql_result($rs, $x, 'foto')) == 0) $tpl->assign('foto','../fotos/indisponivel.jpg'); else $tpl->assign('foto','../fotos/'.mysql_result($rs, $x, 'foto')); } $tpl->gotoBlock('_ROOT');

Mesmo ainda no tendo chegado nesse tpico, j iremos deixar preparado o documento para interceptar a string de mensagem de erro de login que mencionamos anteriormente.
if(isset($msg)) $tpl->assign('msg_login',$msg_login);

E por fim executamos o mtodo responsvel por criar o documento para o usurio.
$tpl->printToScreen(); ?>

7.1 Redirecionamento para a pgina inicial

27

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Como foi mencionado anteriormente no diretrio raiz do site existir apenas um arquivo chamado index.php, o qual ser responsvel por redirecionar o visitante para dentro do diretrio PHP que possuir o arquivo de manipulao do template da pgina inicial. Ainda com o arquivo acima aberto, crie um arquivo chamado index.php e salve-o no diretrio raiz do site. O arquivo index.php possuir apenas a seguinte linha:
<?php header('location:php/modelo_site.php'); ?>

28

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Unidade 8 Elaborao do arquivo CSS:


Antes de continuarmos com a implementao dos scripts, iremos confeccionar a folha de estilos do site, nesse arquivo sero adicionados alguns seletores responsveis por manipular e formatar os links, textos e formulrios do nosso site. Vamos criar um novo arquivo CSS, e chama-lo de TOTAL.CSS:
body { MARGIN-TOP : 0pt; MARGIN-LEFT: 0pt; SCROLLBAR-FACE-COLOR: #bfbfbf; SCROLLBAR-HIGHLIGHT-COLOR: #bfbfbf; SCROLLBAR-SHADOW-COLOR: #bfbfbf; SCROLLBAR-3DLIGHT-COLOR: #bfbfbf; SCROLLBAR-ARROW-COLOR: #395a4f; SCROLLBAR-TRACK-COLOR: #bfbfbf; SCROLLBAR-DARKSHADOW-COLOR: #bfbfbf; } input,select,textarea { BORDER-RIGHT: #333333 1px outset; BORDER-TOP: #333333 1px outset; FONT-SIZE: 11px; BORDER-LEFT: #333333 1px outset; COLOR: #333333; BORDER-BOTTOM: #333333 1px outset; FONT-FAMILY: Verdana, Arial, Verdana; BACKGROUND-COLOR: #ffffff } .vermelho11 { FONT-WEIGHT: normal; FONT-SIZE: 11px; COLOR: #FF0000; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; TEXT-DECORATION: none; } .branco11{ FONT-WEIGHT: normal;

29

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP FONT-SIZE: 11px; COLOR: #FFFFFF; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; TEXT-DECORATION: none } .cinzaforte11 { FONT-WEIGHT: normal; FONT-SIZE: 11px; COLOR: #777777; FONT-FAMILY: "Trebuchet MS"; TEXT-DECORATION: none; } A.linkpreto10 { FONT-WEIGHT: normal; FONT-SIZE: 10px; COLOR: #000000; FONT-FAMILY: Verdana, Arial, TEXT-DECORATION: none; } A.linkpreto10:hover { FONT-WEIGHT: normal; FONT-SIZE: 10px; COLOR: #000000; FONT-FAMILY: Verdana, Arial, TEXT-DECORATION: underline; } A.linkbranco11 { FONT-WEIGHT: normal; FONT-SIZE: 11px; COLOR: #FFFFFF; FONT-FAMILY: Verdana, Arial, TEXT-DECORATION: none; } A.linkbranco11:hover { FONT-WEIGHT: normal; FONT-SIZE: 11px; COLOR: #FFFFFF; FONT-FAMILY: Verdana, Arial, TEXT-DECORATION: underline; }

Helvetica, sans-serif;

Helvetica, sans-serif;

Helvetica, sans-serif;

Helvetica, sans-serif;

Agora que possumos as formataes para os componentes principais do site, continuaremos com as implementaes dos scripts da Loja.

30

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

31

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Unidade 9 A listagem de produtos


No menu superior da loja, o usurio poder tambm selecionar os produtos que esto disponveis para a venda, sendo que esta seleo pode ser feita atravs de uma filtragem de tipos ou palavras chaves que procuram estes itens na nossa base de dados.

Primeiramente teremos que montar o arquivo de template da pgina, sendo que como podemos observar os tipos de produtos sero recuperados atravs de uma consulta feita na tabela TIPOS_PRODUTOS da base de dados. Crie ento um novo arquivo HTML e salve-o como produtos.htm na pasta htm do nosso site. Este documento ser equivalente ao confeccionado anteriormente (destaques.htm) porem possuir um template especifico para interpret-lo, o que veremos no prximo tpico. O layout do arquivo ser como mostrado abaixo:

Dentro do campo de filtragem por tipo e por busca, teremos dois componentes para o formulrio, um MENU LIST e um campo do TIPO TEXT. O formulrio submeter os dados ao mesmo documento, ou seja, teremos que testar se foi feita alguma filtragem antes de mostrar os produtos. A montagem do MENU LIST de tipos de produtos ser feita atravs de blocos do template, o qual chamaremos de BLOCO TIPOS.
<!START BLOCK : TIPOS --> .

32

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP . . <!END BLOCK : TIPOS -->

Abaixo do formulrio iremos mostrar a quantidade de registros encontrados na busca. Portanto, adicionaremos a tag {resultados} no template. A exibio dos registros, juntamente da foto e dos dados do produto sero mostrados com a mesma sistemtica abordada nos destaques, utilizando-se outro loop em bloco, chamado BLOCO PRODUTOS.
<!START BLOCK : PRODUTOS --> . . . <!END BLOCK : PRODUTOS -->

Montado o template, vamos agora implementar o script php que ser responsvel por interpretar o arquivo html e exibir os produtos encontrados na tela. Crie um arquivo novo chamado produtos.php e salve-o no diretrio php da loja.
<?php include('../includes/classTemplatePower.php'); include('../includes/conexao.php'); $tpl = new TemplatePower('../htm/modelo_site.htm'); $tpl->assignInclude('CONTEUDO','../htm/produtos.htm'); $tpl->prepare(); #===== MONTA OS LINKS DO MENU SUPERIOR ===== $tpl->assign('link_home','../php/modelo_site.php'); $tpl->assign('link_produtos','../php/produtos.php'); $tpl->assign('link_contato','../php/contato.php'); $tpl->assign('link_carrinho','../php/carrinho.php'); #===== MOSTRA OS TIPOS DE PRODUTO PARA SELEO ===== $sql = "select tipo_produtos.* from tipo_produtos order by tipo_produtos.nome"; $rs = mysql_query($sql) or die('Erro de tipos'); $total = mysql_num_rows($rs); for($x = 0; $x < $total; $x++){ $tpl->newBlock('TIPOS');

33

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP $tpl->assign('id_tipo',mysql_result($rs, $x, 'id_tipo')); $tpl->assign('nome_tipo',mysql_result($rs, $x, 'nome')); } $tpl->gotoBlock('_ROOT'); #===== SELECIONA OS PRODUTOS DO BANCO ===== if(!isset($busca)){ $busca = ''; }else{ $resultado = 'Foram encontrados: '; } #caso o usuario deixa a opo SELECIONE no tipo if(isset($id_tipo) && $id_tipo == '00') unset($id_tipo); if(!isset($id_tipo)){ if(isset($resultado)) $sql_mais = ''; else $sql_mais = 'limit 0,3'; $sql = "select produtos.* from produtos where produtos.nome like '%$busca%' or produtos.descricao like '%$busca%' order by rand() $sql_mais "; }else{ $sql = "select produtos.* from produtos where produtos.id_tipo = $id_tipo and (produtos.nome like '%$busca%' or produtos.descricao like '%$busca%') order by produtos.nome"; } $rs = mysql_query($sql) or die('Erro de produtos'); $total = mysql_num_rows($rs); if(isset($resultado)){ $resultado .= $total . ' produto(s)'; $tpl->assign('resultados',$resultado);

34

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP } for($x = 0; $x < $total; $x++){ $tpl->newBlock('PRODUTOS'); $tpl->assign('nome',mysql_result($rs, $x, 'nome')); $tpl->assign('descricao',mysql_result($rs, $x, 'descricao')); $tpl->assign('valor',mysql_result($rs, $x, 'valor')); $tpl>assign('link_comprar','../php/carrinho.php?acao=comprar&i d_produto='.mysql_result($rs, $x, 'id_produto')); if(strlen(mysql_result($rs, $x, 'foto')) == 0) $tpl->assign('foto','../fotos/indisponivel.jpg'); else $tpl->assign('foto','../fotos/'.mysql_result($rs, $x, 'foto')); } $tpl->gotoBlock('_ROOT'); $tpl->printToScreen(); ?>

Como voc pode ver na analise do cdigo php apresentado, a varivel $sql_mais uma espcie de complemento que adicionado query de consulta do banco caso no tenha sido efetuada nenhuma pesquisa por produtos pelo usurio, mostrando assim apenas trs registros randmicos da tabela de produtos quando a seo acessada pela primeira vez.

35

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Unidade 10 O formulrio de contato


Todo e qualquer site da web atualmente na maioria dos casos possui um formulrio de contato para facilitar a comunicao entre seus usurios e a empresa. Outra vantagem da utilizao desse mtodo de comunicao que o envio da mensagem ser feito via servio de email do servidor, no necessitando que o usurio possua um cliente de email instalado e configurado na estao que esta acessando o website. Alem do mais, a facilidade em poder documentar este contato armazenando-o em uma base de dados tambm um dos pontos fortes a serem considerados. Vamos agora criar um simples formulrio de contato para a nossa loja, aproveitando-se de alguns recursos do php para realizarmos a validao do documento. Crie um arquivo novo chamado contato.htm e salve-o no diretrio htm do nosso site. O layout desse documento ser como mostrado abaixo:

Cuide para nomear corretamente os campos do formulrio para que possamos acess-los sem erros no nosso arquivo php. Alem dos campos mostrados no formulrio, temos ainda uma varivel oculta (hidden) chamada enviar na qual atribumos o valor sim no formulrio. Montado esse arquivo vamos agora implementar dois arquivos php, primeiramente implementaremos o contato.php que ser responsvel por trabalhar com o template htm que acabamos de montar, e juntamente confeccionaremos o arquivo mensagem.php que servira como uma espcie de retorno das validaes que criaremos. Crie um arquivo novo em php e salve-o como contato.php no diretrio php do servidor, veja abaixo como ficar o script:
<?php include('../includes/classTemplatePower.php'); $tpl = new TemplatePower('../htm/modelo_site.htm');

36

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP $tpl->assignInclude('CONTEUDO','../htm/contato.htm'); $tpl->prepare(); #===== MONTA OS LINKS DO MENU SUPERIOR ===== $tpl->assign('link_home','../php/modelo_site.php'); $tpl->assign('link_produtos','../php/produtos.php'); $tpl->assign('link_contato','../php/contato.php'); $tpl->assign('link_carrinho','../php/carrinho.php'); #===== VALIDAO DOS CAMPOS ===== #TESTA SE A VARIAVEL OCULTA(HIDDEN) CHAMADA 'ENVIAR' CHEGOU, #CASO SIM, SINAL QUE O USUARIO APERTOU NO SUBMIT if(isset($enviar)){ $msg = ''; if(strlen($nome) == 0) $msg .= '<li>Nome no foi preenchido!<br>'; if(strlen($email) == 0) $msg .= '<li>Email no foi preenchido!<br>'; if(strlen($mensagem) == 0) $msg .= '<li>Mensagem no foi preenchida!<br>'; if(strlen($msg) > 0){ header("location:../php/mensagem.php?msg=$msg"); }else{ #Cabealhos para envio de email #REMETENTE $headers ="From: $email"; #VERSAO DO SCRIPT DE MENSAGEM $headers.="MIME-Version: 1.0"; #CONTEUDO TEXTO/HTML - CHARSET = ACENTOS $headers.="Content-Type: text/html; charset=ISO8859-1"; #CRIPTOGRAFIA DE ENVIO $headers.="Content-Transfer-Encoding: base64"; $texto = $texto.= $texto.= $texto.= "<font face=\"verdana\" size=\"2\">"; "Nome: $nome <br>"; "Email: $email <br>"; "Mensagem: $mensagem";

37

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP mail('cicero@alfamidia.com.br','Contato Site',$texto,$headers); $msg = 'Obrigado pela sua visita, em breve entraremos em contato'; header("location:../php/mensagem.php?msg=$msg"); } } $tpl->printToScreen(); ?>

Analisando o script acima, notamos nas linhas iniciais, o teste do envio da varivel enviar, que caso seja detectado inicia uma seria de testes em cada campo do formulrio, verificando se o numero de caracteres presentes maior do que 1. Caso algum dos campos no possua preenchimento adicionada uma string de caracteres com uma informao varivel $msg que logo aps testada e caso possua tamano de caracteres maior que zero, encerra a execuo dos processos e remete o usurio para um outro documento chamado mensagem.php. Este tipo de artifcio muito utilizado como validao no php, ou seja, aplicamos uma serie de regras e testes variveis que queremos validar, e caso o resultado desejado no seja encontrado acabamos armazenando nosso erro ou mensagem em um varivel especifica. Logo aps a serie de testes ser efetuada e a consistncia dos dados ter sido aprovada, passamos para um segundo passo, que o envio das informaes por email para o contato do site. Este processo utiliza-se da funo mail do php que exige somente que um servio de envio de mensagens esteja habilitado e configurado no servidor que hospeda o site. Antes do envio so criados algumas regras de cabealho que permitem o uso de tags HTML dentro do email e padroniza o envio da mensagem em formato que seja interpretado corretamente pelos clientes de email. Aps a concluso do processo mostrada uma mensagem de agradecimento ao usurio. Vamos agora implementar o nosso arquivo de validao, que ser utilizado em todos os formulrios do site. Inicialmente crie um arquivo chamado mensagem.htm e salve-o no diretrio htm do seu site. O layout do arquivo dever ficar como mostrado abaixo:

Nesse arquivo teremos apenas uma tag de template que ser substituda pelo script, a tag {msg}.

38

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Lembrando que o envio de caracteres para a substituio desta tag ser feito via mtodo GET do formulrio, pois utilizamos a funo header(location:) do php para este processo, portanto importante cuidar para que o limite de caracteres no ultrapasse os 255 que o suportado pelo cabealho HTTP. Crie agora um arquivo novo chamado mensagem.php e salve-o no diretrio php do seu site. O script simples de ser implementado e ficar como mostrado a seguir:
<?php include('../includes/classTemplatePower.php'); $tpl = new TemplatePower('../htm/modelo_site.htm'); $tpl->assignInclude('CONTEUDO','../htm/mensagem.htm'); $tpl->prepare(); #===== MONTA OS LINKS DO MENU SUPERIOR ===== $tpl->assign('link_home','../php/modelo_site.php'); $tpl->assign('link_produtos','../php/produtos.php'); $tpl->assign('link_contato','../php/contato.php'); $tpl->assign('link_carrinho','../php/carrinho.php'); $tpl->assign('msg',$msg); $tpl->printToScreen(); ?>

Pronto, agora j possumos o documento que ir informar ao usurio se algum campo do formulrio no foi preenchido corretamente, ou se simplesmente algum processo de envio ou de cadastro foi concludo. Veja abaixo um exemplo de retorno gerado pelo documento mensagem.php.

39

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Unidade 11 A implementao do carrinho de compras


Dentre os processos de implementao de uma loja virtual, o carrinho de compras o que mais se destaca pela necessidade de ser um script gil e seguro para com as compras do clientes e seus dados. Voc j viu o fluxograma de processo de compras que foi apresentado anteriormente, mas antes de comearmos a implementao envolvendo os processos do fluxograma iremos conhecer um pouco sobre a lgica introdutria do processo para assim termos mais facilidade na implementao dos nossos scripts. Para o cliente, tanto a tecnologia, quanto a forma de implementao da loja transparente, ou seja, no importa em qual linguagem, banco de dados ou metodologia a soluo foi desenvolvida, e sim somente se ele conseguir encontrar de forma rpida e eficaz o que precisa, solicitar a compra e receber o produto. Entretanto no lado do desenvolvedor termos como a performance do banco de dados e a segurana tanto dos dados da loja quanto os dados do cliente devem ser levados em considerao. Abaixo seguem uma srie de questes relevantes que devem ser analisadas:

11.1 Como os produtos sero colocados dentro do carrinho?


O fato de colocar os produtos dentro do carrinho de compras ir utilizar de uma forma usada na maioria das estruturas de venda online na internet. Imagine que a cada minuto seu site poder estar sendo acesso por n clientes, de n locais diferentes do planeta. Voc no pode prever quantos produtos cada cliente ir comprar, e nem mesmo saber se um cliente ir finalizar a compra dele. Fatores estes que devem ser levados em considerao quando o assunto acesso aos dados do servidor. Se cada produto for tratado como um item e cada item inserido no carrinho fosse diretamente inserido em uma tabela do nosso banco de dados, sem nem mesmo o cliente ter concludo a compra, teramos uma queda de performance e um estouro do limite de conexes simultneas do banco rapidamente. Portanto, a melhor forma de trabalharmos com o carrinho de compras online o uso das sesses. Como voc j deve ter visto uma sesso quando iniciada no php vale somente enquanto o navegador do usurio estiver em execuo. Caso o mesmo seja finalizado os dados armazenados em sesso so completamente perdidos no podendo ser recuperados, isso ocasiona em mais segurana e mais performance no acesso aos dados da loja.

40

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

11.2 Como armazenar os produto no carrinho?


Os produtos que forem comprados devero ser armazenados em variveis de sesso, mas como imprevisvel o nmero de produtos que ser comprado por cada cliente, no podemos possuir uma varivel para cada produto selecionado, logo a primeira idia que nos surge para sanarmos este problema o uso de vetores, vetores de sesso. Para compreender melhor veja a figura abaixo:

Mas e se o cliente tivesse comprado o mesmo produto mais de uma vez? Acabaramos tendo a seguinte situao:

Imagine um vetor com 120 posies, onde destas 120, existissem apenas 5 produtos distintos. Estaramos desperdiando tempo gerenciando produtos em demasia, e no momento de incluso destes dados no banco teramos um algoritmo redundante e inadequado para a ocasio.

11.3 Como controlar os produtos distintos por quantidade?


Existem trs formas prticas para controlarmos a quantidade de produtos distintos em nosso carrinho: Criar um vetor adjacente: um vetor de sesso que possuir o mesmo tamanho que o vetor de compras, porem possuindo apenas a quantidade dos produtos armazenados dentro de suas posies. A desvantagem da utilizao desse mtodo que teremos que ter

41

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

cuidado na manipulao de dois vetores, sempre mantendo a ateno na manipulao dos dados e das posies dos mesmos. Armazenar o produto e a quantidade dentro do mesmo vetor, porem separados por virgulas: forma simples e eficaz de soluo do problema, porem deveremos ficar atentos separao destes valores quando formos inseri-los no banco de dados, lembrando que a virgula poderia vir a atrapalhar na manipulao destes dados sendo simplesmente tratada como um numero inteiro. Utilizar um vetor bidimensional: a forma mais clssica e eficaz, nos permite que tenhamos separados os valores de quantidade de produtos, permitindo acesso direto a cada um deles sem muito esforo de implementao. Selecionaremos ento a ultima alternativa, criando um vetor de sesso bidimensional para o controle de produtos do carrinho e suas respectivas quantidades, lembrando que como o acesso feito via sesso do navegador, cada usurio conectado no site possuir o seu carrinho de compras com seus produtos e quantidades, sendo estes levados para o banco de dados somente na finalizao da compra. Veja abaixo a estrutura de um vetor bidimensional:

Para acessar as informaes destes dados manteremos a mesma sintaxe de acesso de um vetor comum, porem informando sempre a COLUNA e a LINHA que iremos manipular, como se fosse um jogo de batalha naval. Veja o exemplo abaixo, onde acessamos o produto 5 e sua quantidade no vetor:
#COLUNA 0 LINHA 0 = PRODUTO $VETOR_CARRINHO[0][0] = Produto 1; #COLUNA 0 LINHA 1 = QUANTIDADE $VETOR_CARRINHO[0][1] = 1;

42

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

11.4 O produto ser armazenado pelo nome do vetor?


Os nomes dos produtos podem de acordo com a estrutura do banco podem possuir at 100 caracteres, desnecessrio que armazenemos todo esse dado no vetor, por isso a melhor maneira para evitarmos essa situao armazenarmos a chave primria do produto, o identificador nico de cada produto da loja. Quando formos percorrer o vetor iremos simplesmente consultar o id do produto no banco de dados e assim montarmos o resumo da compra.

43

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Unidade 12 O script do carrinho de compras


Como voc j deve ter notado, nos scripts de listagem de produtos e no script inicial em que aparecem os destaques do site, foi criado um boto COMPRAR que direciona o usurio para um documento chamado carrinho.php. Este script ser responsvel por manipular todas as operaes referentes ao carrinho de compras da loja. Existem quatro operaes principais que sero feitas neste script: Insero: insere produtos no vetor de sesso do carrinho de compras. Atualizao: atualiza a quantidade e o calculo geral de valores do carrinho de compras. Excluso: exclui determinado produto do vetor de sesso do carrinho de compras. Mostrar: sempre que o script for executado seu processo final ser mostrar os produtos existentes no carrinho de compras. A tela do carrinho de compras ser exibida sempre que o usurio comprar um produto, ou ao clicar no cone MEU CARRINHO localizado no topo do site junto do cabealho. Veja a seguir a tela final do carrinho de compras:

Como voc pode observar o usurio pode alem de excluir o produto atualizar a quantidade de itens no carrinho, isso evita que ele necessite clicar mais de uma vez sobre o produto que seja comprar para incrementar a quantidade de itens. Aps esse procedimento o usurio decide se continuar comprando, ou se deseja finalizar a compra. Caso seja selecionada a primeira opo o mesmo ser direcionado para a tela de seleo de produtos, caso contrrio ser apresentado um formulrio para o usurio se logar ou se cadastrar, finalizando assim as compras. Vamos ento montar a tela de template do carrinho de compras, crie um arquivo novo em formato HTML e salve-o como carrinho.htm no diretrio htm do site. O layout do documento dever ser da seguinte forma:

44

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Onde teremos um formulrio que possuir uma tabela interna para a apresentao dos produtos. No topo desta tabela inicialmente ser apresentada uma contagem de itens do carrinho, utilizando-se a tag {itens}, onde substituiremos pela quantidade de itens disponveis no vetor de sesso das compras multiplicado pela quantidade de produtos. Da mesma forma que usvamos blocos para exibir os produtos nas telas anteriores, utilizaremos um loop de bloco neste template para exibir cada registro do nosso vetor. Chamaremos esse loop de BLOCO PRODUTOS e dentro dele teremos quatros tags de template: {nome_produto}, {valor}, {qtd} e {total_prod}. Como possumos na linha inicial do vetor de sesso o id_produto do produto que o usurio inseriu no carrinho de compras, fica fcil acessarmos os outros dados acima mencionados recuperando-os do banco de dados atravs de uma simples query de consulta. A tag de template {total_geral} fica de fora deste bloco e assignada no final da repetio atravs de uma varivel auxiliar que contabiliza os dados de preo X quantidade no momento da exibio dos produtos do carrinho na tela. Vamos agora implementar o script de carrinho de compras para interpretar o template j montado anteriormente. Crie um arquivo novo em php e salve-o como carrinho.php dentro do diretrio php do seu site.
<?php include('../includes/classTemplatePower.php'); include('../includes/conexao.php'); include('../includes/classUtil.php'); $util = new Util; $tpl = new TemplatePower('../htm/modelo_site.htm'); $tpl->assignInclude('CONTEUDO','../htm/carrinho.htm'); $tpl->prepare(); #===== MONTA OS LINKS DO MENU SUPERIOR =====

45

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP $tpl->assign('link_home','../php/modelo_site.php'); $tpl->assign('link_produtos','../php/produtos.php'); $tpl->assign('link_contato','../php/contato.php'); $tpl->assign('link_carrinho','../php/carrinho.php'); #===== MANIPULAO DO CARRINHO DE COMPRAS ===== #VERIFICA SE ESTA SENDO ENVIADA ALGUMA OPERAO NO CARRINHO session_start(); if(isset($acao)){ switch($acao){ case 'comprar': if(!isset($VETOR_CARRINHO)){ session_register("VETOR_CARRINHO"); $VETOR_CARRINHO[0][0] = $id_produto; $VETOR_CARRINHO[0][1] = 1; }else{ #PERCORE O CARRINHO VERIFICANDO SE O PRODUTO A SER INSERIDO #JA NAO EXISTE DENTRO, CASO SIM: INCREMENTA A QTD. EM +1 #CASO NAO, INSERE NO FIM DO VETOR $tamanho = sizeof($VETOR_CARRINHO);

for($x = 0; $x < $tamanho;$x++){ if($VETOR_CARRINHO[$x][0] == $id_produto){ $VETOR_CARRINHO[$x][1] = ($VETOR_CARRINHO[$x][1]) + 1; $x = $tamanho; $ins = 'sim'; } } if(!isset($ins)){ $VETOR_CARRINHO[$tamanho][0] = $id_produto; $VETOR_CARRINHO[$tamanho][1] = 1; } }

46

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP break; case 'atualizar': for($x = 0; $x < sizeof($qtd); $x++){ $VETOR_CARRINHO[$x][1] = $qtd[$x]; } break; case 'excluir': $tamanho = sizeof($VETOR_CARRINHO); if($posicao != $tamanho-1){ for($x = $posicao; $x < $tamanho-1; $x++){ $VETOR_CARRINHO[$x][0] = $VETOR_CARRINHO[$x+1][0]; $VETOR_CARRINHO[$x][1] = $VETOR_CARRINHO[$x+1][1]; } } array_pop($_SESSION['VETOR_CARRINHO']); break; } } #MOSTRA TODOS OS PRODUTOS DO CARRINHO #CRIA UMA VARIAVEL DE TOTALGERAL VAZIA; $total_geral = ''; $qtd_geral = ''; #POREM VERIFICA SE EXISTE ALGO PRA MOSTRAR ANTES if(isset($VETOR_CARRINHO)){ for($x = 0; $x < sizeof($VETOR_CARRINHO); $x++){ $tpl->newBlock('PRODUTOS'); $sql = "select produtos.* from produtos where produtos.id_produto = ".$VETOR_CARRINHO[$x][0]; $rs = mysql_query($sql) or die('Erro de produtos'); $tpl->assign('nome_produto',mysql_result($rs, 0, 'nome')); $tpl->assign('valor',$util>formataDecimal(mysql_result($rs, 0, 'valor'))); $tpl->assign('qtd',$VETOR_CARRINHO[$x][1]);

47

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP $tpl>assign('link_excluir',"../php/carrinho.php?acao=excluir&p osicao=$x"); #PEGA A QUANTIDADE DA POSICAO $X DO VETOR E MULTIPLICA PELO #SEU VALOR NO BANCO DE DADOS $total_prod = $VETOR_CARRINHO[$x][1] * mysql_result($rs, 0,'valor'); $tpl->assign('total_prod',$util>formataDecimal($total_prod)); $total_geral += $total_prod; $qtd_geral += $VETOR_CARRINHO[$x][1]; } $tpl->gotoBlock('_ROOT'); }else{ $msg = "Voce no possui produtos no seu carrinho!"; header("location:../php/mensagem.php?msg=$msg"); } #ATRIBUI A VER TOTAL_GERAL NO FINAL DO CARRINHO $tpl->assign('total_geral',$util>formataDecimal($total_geral)); $tpl->assign('itens',$qtd_geral); #REFERENTE AOS BOTOS DE FINALIZAR OU CONTINUAR COMPRA $tpl->assign('link_continuar','../php/produtos.php'); $tpl->assign('link_finalizar','../php/finaliza.php'); $tpl->printToScreen(); ?>

Note que o script baseia-se simplesmente na manipulao de vetores, tendo como particularidade o vetor bidimensional que criamos no ato da insero do primeiro produto no carrinho. O final do arquivo voc ver os processos de exibio do vetor do carrinho na tela, o qual como mencionado anteriormente executado sempre que o script for executado no importando a operao que foi realizada. A varivel ao testada sempre no inicio do script, portanto, quando o usurio clicar em comprar, atualizar ou excluir a varivel muda de valor. Outro ponto importante que deve ser observado a utilizao dos mtodos de converso que criamos na classUtil.php, que tem extrema importncia na exibio de valores convertidos como o caso do preo dos produtos.

48

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

49

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Unidade 13 Finalizao da compra


Aps a escolha dos produtos para a compra o cliente dever clicar em FINALIZAR COMPRA na tela do carrinho de compras que montamos acima. Este procedimento ira direcion-lo para outro script o qual chamaremos de finaliza.php. Este script ser responsvel por perguntar para o usurio se ele j possui cadastro ou se deseja se cadastrar, no primeiro caso os dados de login do usuario sero recuperados do banco de dados, evitando que um novo cadastro seja preenchido, no segundo caso o usuario dever preencher os campos obrigatrio juntamente de uma senha que servir para futuras compras na loja. Veja abaixo como ficar o layout do arquivo de template finaliza.htm:

Crie um novo arquivo do tipo HTML e salve-o como finaliza.htm no diretrio htm do seu site. Este arquivo possui dois formulrios dentro de uma nica tabela, ambos os formulrios possuem sua ACTION para o mesmo arquivo, porem passando aes diferentes via GET para o destino. O primeiro formulrio possuir a seguinte sintaxe na sua ACTION:
<form id="form1" name="form1" method="post" action="../php/finaliza_compra.php?login=sim">

50

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

O segundo ser da seguinte forma:


<form id="form3" name="form3" method="post" action="../php/finaliza_compra.php?login=nao">

Da mesma maneira que utilizamos a validao via php no script de contato, iremos utilizar esse artifcio para o login ou para o cadastro. Para isso deveremos implementar o script que utilizar o template que acabamos de montar. Crie um novo arquivo php e salve-o como finaliza.php o diretrio php da loja. Como voc deve ter notado o documento anterior envia os dados dos formulrios para o finaliza_compras.php, estes dados de acordo com a ao executaram determinado bloco de processos dentro do script, portanto nosso script atual servir simplesmente para exibir o template. Veja o script a seguir:
<?php include('../includes/classTemplatePower.php'); $tpl = new TemplatePower('../htm/modelo_site.htm'); $tpl->assignInclude('CONTEUDO','../htm/finaliza.htm'); $tpl->prepare(); #===== MONTA OS LINKS DO MENU SUPERIOR ===== $tpl->assign('link_home','../php/modelo_site.php'); $tpl->assign('link_produtos','../php/produtos.php'); $tpl->assign('link_contato','../php/contato.php'); $tpl->assign('link_carrinho','../php/carrinho.php');

$tpl->printToScreen(); ?>

O foco principal da finalizao ficar no script da ACTION dos formulrios, este script no utiliza de templates para ser executado, sendo elaborado em php puro. Como de costume as estruturas de testes sempre executam o teste mais simples em sua primeira execuo, deixando os processos mais trabalhosos para o final. Iremos nesse arquivo verificar se o usurio esta inicialmente tentando efetuar login, verificaremos se o login esta correto e por fim testaremos se a ao executada um cadastro de um novo usurio a loja. Crie um novo arquivo php e salve-o como finaliza_compras.php no diretrio php do site da loja.

51

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

A sintaxe do script finaliza_compras.php dever ficar como mostrada abaixo:


<?php include('../includes/conexao.php'); session_start(); if(isset($login)){ if($login == 'sim'){ #VERIFICA SE OS DADOS DO USUARIO EXISTEM NA TABELA DE CLIENTES $sql = "select clientes.* from clientes where clientes.cpf = '$cpf' and clientes.senha = '$senha'"; $rs = mysql_query($sql) or die(mysql_error()); $total = mysql_num_rows($rs); if($total > 0){ #SE VERDADEIRO PEGA O ID_CLIENTE PARA A INSERO DOS PRODUTOS COMPRADOS NO BANCO DE DADOS $id_cliente = mysql_result($rs, 0, 'id_cliente'); }else{ $msg = "LOGIN invlidos"; header("location:../php/mensagem.php?msg=$msg"); } }else{ #INSERE O CLIENTE NA TABELA DE CLIENTES #REALIZANDO A VALIDAO DOS CAMPOS $msg = ''; if(empty($nome)) $msg .= "<li>Nome no preenchido!"; if(empty($endereco)) $msg .= "<li>Endereco no preenchido!"; if(empty($cidade)) $msg .= "<li>Cidade no preenchida!"; if(empty($cep)) $msg .= "<li>CEP no preenchido!"; if(empty($fone)) $msg .= "<li>Fone no preenchido!"; if(empty($email)) $msg .= "<li>Email no preenchido!";

52

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP if(empty($cpf)) $msg .= "<li>CPF no preenchido!"; if(empty($senha)) $msg .= "<li>SENHA no preenchida!";

#VERIFICA SE NAO EXISTE NENHUM CLIENTE JA USANDO ESTE CPF $sql = "select clientes.cpf from clientes where clientes.cpf = '$cpf'"; $rs = mysql_query($sql) or die(mysql_error()); $total = mysql_num_rows($rs); if($total > 0){ $msg .= "<li><strong>J existe um cliente cadastrado com esse CPF!</strong>"; } if(strlen($msg) > 0){

header("location:../php/mensagem.php?msg=$msg"); }else{ #INSERE O CLIENTE NO BANCO $sql = "insert into clientes (nome,endereco,cidade,cep,fone,email,cpf,senha) values ('$nome','$endereco','$cidade','$cep','$fone','$email','$c pf','$senha')"; mysql_query($sql) or die(mysql_error()); #RECUPERA O ID DESSE NOVO CLIENTE PARA USO NA TABELA DE PEDIDOS $sql = "select clientes.id_cliente from clientes order by clientes.id_cliente desc limit 0,1"; $rs = mysql_query($sql) or die(mysql_error()); $id_cliente = mysql_result($rs, 0, 'id_cliente'); } }

53

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP }

#POR SEGURANA VERIFICA SE AT AQUI JA SE TEM UM VALOR PARA ID_CLIENTE if(isset($id_cliente)){ #MANIPULA O PEDIDO DO CLIENTE $dt_pedido = date("Y-m-d"); $sql = "insert into pedidos (id_cliente,dt_pedido) values ($id_cliente,'$dt_pedido')"; mysql_query($sql) or die(mysql_error()); $sql = "select pedidos.id_pedido from pedidos order by pedidos.id_pedido desc limit 0,1"; $rs = mysql_query($sql) or die(mysql_error()); $id_pedido = mysql_result($rs, 0, 'id_pedido'); #INSERE OS PRODUTOS NA TABELA DE PEDIDOS_PRODUTOS $total = 0; for($x = 0; $x < sizeof($VETOR_CARRINHO); $x++){ $id_produto = $VETOR_CARRINHO[$x][0]; $qtd = $VETOR_CARRINHO[$x][1]; $sql_prod = "select produtos.valor from produtos where produtos.id_produto = $id_produto"; $rs_prod = mysql_query($sql_prod) or die(mysql_error()); $valor = mysql_result($rs_prod, 0, 'valor'); #INSERE DENTRO DO BANCO $sql_ped = "insert into produtos_pedidos (id_pedido,id_produto,valor,qtd) values ($id_pedido,$id_produto,'$valor',$qtd)"; mysql_query($sql_ped) or die(mysql_error()); $total += $qtd * $valor; #CALCULA O TOTAL

54

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP } #ATUALIZA O CAMPO TOTAL DA TABELA PEDIDOS $sql_ped = "update pedidos set pedidos.total_pedido = '$total' where pedidos.id_pedido = $id_pedido"; mysql_query($sql_ped) or die(mysql_error()); #APOS CONCLUIR A OPERAO - MATA A SESSAO E ENVIA O USUARIO PARA TELA DE FIM session_destroy(); header("location:../php/obrigado.php"); } ?>

Analisando o script acima notaremos a presena dos processos de validao, e por fim a destruio da sesso do usurio caso as compras tenham sido armazenadas no banco de dados com sucesso. Esta finalizao consiste em destruir a sesso por completo, mesmo que o usurio no finalize a execuo do navegador os dados presentes no carrinho de compras so eliminados por questo de segurana. Vamos agora construir o ltimo template do site, chamaremos este arquivo de obrigado.htm, tendo como base o layout abaixo:

Crie tambm o arquivo obrigado.php que ser responsvel por exibir a tela de template mostrada acima. O script possuir a seguinte sintaxe:
<?php

55

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP include('../includes/classTemplatePower.php'); $tpl = new TemplatePower('../htm/modelo_site.htm'); $tpl->assignInclude('CONTEUDO','../htm/obrigado.htm'); $tpl->prepare(); #===== MONTA OS LINKS DO MENU SUPERIOR ===== $tpl->assign('link_home','../php/modelo_site.php'); $tpl->assign('link_produtos','../php/produtos.php'); $tpl->assign('link_contato','../php/contato.php'); $tpl->assign('link_carrinho','../php/carrinho.php');

$tpl->printToScreen(); ?>

Conclumos ento o processo de compras e exibio de produtos na loja, ou seja, todas as funcionalidades disponveis para o CLIENTE foram concludas. Vamos agora partir para outro passo importante no sistema de E-Commerce, a administrao da loja em um ambiente seguro e confivel.

56

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Unidade 14 A administrao da loja


Todo site, tanto voltado para a rea de E-Commerce, ou para outro foco possui a necessidade de um ambiente administrativo, um local onde um usurio que no possua conhecimentos de programao e desenvolvimento possa alimentar de forma rpida e fcil o contedo do site. Iremos agora elaborar essa camada para a nossa loja virtual.

14.1 Mdulos do ambiente


Os seguinte mdulos dinmicos devero ser implementados: Cadastro de tipos de produtos; Cadastro de Produtos; Acompanhamento de pedidos.

14.2 Implementando de forma segura


Da mesma maneira que utilizamos uma sesso segura para manter o carrinho de compras do usurio, deveremos criar uma sesso segura para o login no ambiente administrativo. O login ser feito atravs do documento inicial do site, como voc deve lembrar existe um formulrio ao lado direito do site que solicita USUARIO e SENHA. Ajuste ento o ACTION deste formulrio para o destino login.php. Neste novo arquivo iremos verificar se os dados digitados esto presentes na tabela de usurios do banco de dados, caso contrario uma mensagem de erro gerada e direcionada para o documento modelo_site.php como mostra a imagem abaixo:

57

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Caso os dados sejam aceitos o usurio possui seu ID registrado em sesso e ento direcionado para a tela a seguir:

Para evitar o acesso irrestrito aos documentos de manipulao de contedo teremos que verificar se o ID do usurio esta registrado a cada acesso. Vamos criar um novo arquivo HTML e salva-lo no diretrio htm do nosso site como modelo_admin.htm. O layout deste arquivo dever ser como mostrado abaixo:

58

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

No centro deste documento possuiremos um bloco de incluso chamado contedo:


<!INCLUDE BLOCK : CONTEUDO -->

Veja que os dados de login como usuario, data e hora so mostrados no topo do documento, abaixo criado um menu que ir linkar os outros documentos do ambiente administrativo. Para os itens do menu daremos os seguintes endereo para as ancoras:
Tipos de produtos: <a href={link_tipos}> Produtos: <a href={link_produtos}> Pedidos: <a href={link_pedidos}> Logout: <a href={link_logout}>

Vamos ento implementar o script responsvel pelo login do usurio no sistema, crie um arquivo novo e salve-o como login.php dentro do diretrio php do site. Este script far a conexo com o banco de dados e ira verificar a consistncia dos dados de login, veja a sintaxe do algoritmo abaixo:
<?php include('../includes/classTemplatePower.php'); include('../includes/conexao.php'); #==== VERIFICA SE O USUARIO EXISTE NO BANCO DE DADOS ===== if(isset($usuario) && isset($senha)){ $sql = "select usuarios.* from usuarios where usuarios.usuario = '$usuario' and senha = '$senha'";

59

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP $rs = mysql_query($sql) or die(mysql_error() . 'Erro de usuario'); $total = mysql_num_rows($rs); #SE ENCONTRAR UM REGISTRO LIBERA PARA O ADMINISTRADOR, SENAO VOLTA if($total > 0){ session_start(); $ID_USUARIO = mysql_result($rs, 0, 'id_usuario'); session_register("ID_USUARIO"); header("location:../php/modelo_admin.php"); }else{ $msg_login = 'Erro de login!!!'; header("location:../php/modelo_site.php?msg_login=$msg_ login"); } } ?>

Caso ocorra tudo certo, a sesso registrada e o modelo_site.php apresentado. Ateno: evite registrar dados confidenciais em variveis de sesso, no caso acima estaos registrando a chave primaria do usurio no banco de dados, no sendo aconselhado registrar dados como o nome de LOGIN ou a SENHA, a no ser que estes estejam criptografados. Aps a execuo do script de login, surge a necessidade de criarmos o script do modelo_admin.php, que ser a tela de recepo do ambiente administrativo da loja. Crie um arquivo novo php com o nome de modelo_admin.php e salve-o no diretrio php da loja. Este script apenas assignar os valores ao menu do topo e os dados de login do usuario. Veja a seguir a sintaxe do arquivo:
<?php include('../includes/classTemplatePower.php'); include('../includes/conexao.php'); include('../php/ver_sessao.php'); $tpl = new TemplatePower('../htm/modelo_admin.htm'); $tpl->assignInclude('CONTEUDO','../htm/inicio_admin.htm'); $tpl->prepare();

60

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

#===== MONTA OS LINKS DO MENU SUPERIOR ===== $tpl->assign('link_tipos','../php/tipos_admin.php'); $tpl->assign('link_produtos','../php/produtos_admin.php'); $tpl->assign('link_pedidos','../php/pedidos_admin.php'); $tpl->assign('link_logout','../php/logout.php');

#MOSTRA O NOME DO USUARIO NO INICIO $sql = "select usuarios.usuario from usuarios where usuarios.id_usuario = $ID_USUARIO"; $rs = mysql_query($sql) or die ('Erro de usuario'); $tpl->assign('usuario',mysql_result($rs,0,'usuario')); $tpl->assign('data',date("d/m/Y")); $tpl->assign('hora',date("h:i")); $tpl->printToScreen(); ?>

Dentro do bloco CONTEUDO que criamos anteriormente estamos vinculando um arquivo chamado inicio_admin.htm, este arquivo possui uma mensagem de boas vindas, uma sugesto interessante seria colocarmos um aviso de novos contatos e novos pedidos que entraram o dia atual. Vamos implement-lo a seguir, criando o arquivo inicio_admin.htm e salvando-o no diretrio htm do site. O layout do arquivo dever ficar como est sendo mostrado abaixo:

Como este arquivo um bloco vinculado ao documento modelo_admin.htm no precisamos elaborar o documento php que o interpretar.

61

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Unidade 15 Validando a sesso


Como foi mencionado anteriormente, no basta validar o login e a senha do usuario somente no primeiro acesso ao ambiente administrativo, precisamos que a cada url que for restrita revalidar esses dados, como fica invivel solicitarmos os dados a cada clique, criaremos um documento que verifica se a sesso foi iniciada e se a variavel de sesso foi criada. Chamaremos esse arquivo ver_sessao.php e salvaremos ele na pasta php do nosso site. A lgica deste algoritmo simples, ele verifica a existncia da varivel, caso ela no seja identifica o usurio direcionado para a tela de login do site novamente. Veja abaixo a sintaxo do arquivo:
<?php session_start(); if(!isset($ID_USUARIO)){ $msg = 'Erro de login!'; header("location:../php/modelo_site.php?msg=$msg"); } ?>

Iremos incluir este arquivo em cada documento do administrador.

15.1 Tipos de produtos


Os tipos de produtos so essenciais para uma diviso mais adequadas de itens da loja, ao clicar no link: Tipos de produtos do ambiente administrativo ser exibida uma listagem de tipos cadastrados no banco de dados. Vamos ento criar um novo arquivo de template em HTML chamado tipos_admin.htm e salve-lo na pasta htm do nosso site. A aparncia deste template dever ser como mostrada abaixo:

Neste arquivo teremos um loop de tipos chamado BLOCO TIPOS que mostrar cada item da tabela tipo_produtos da nossa base de dados. Um fator interessante usarmos uma tag

62

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

de template chamada {cor} que ficar presentes na tag HTML <TR> da linha que exibe o nome do tipo. Essa tag ser substituda por valores hexadecimais de cores intercaladas a cada volta do loop, dando um efeito de separao entre cada registro do banco facilitando assim a leitura dos dados. Existem ainda trs links importantes neste documento, que devero ser substitudos pelas seguintes tags:
Link editar: <a href={link_editar}> Link excluir: <a href={link_excluir}> Link novo: <a href={link_novo}>

Para interpretar este arquivo iremos agora criar o seu script php, chamado tipo_admin.php e salvando-o no diretrio php do nosso servidor.
<?php include('../includes/classTemplatePower.php'); include('../includes/conexao.php'); include('../php/ver_sessao.php'); $tpl = new TemplatePower('../htm/modelo_admin.htm'); $tpl->assignInclude('CONTEUDO','../htm/tipos_admin.htm'); $tpl->prepare(); #===== MONTA OS LINKS DO MENU SUPERIOR ===== $tpl->assign('link_tipos','../php/tipos_admin.php'); $tpl->assign('link_produtos','../php/produtos_admin.php'); $tpl->assign('link_pedidos','../php/pedidos_admin.php'); $tpl->assign('link_logout','../php/logout.php'); #===== LISTA OS TIPOS DE PRODUTOS ===== $sql = "select tipo_produtos.* from tipo_produtos order by tipo_produtos.nome"; $rs = mysql_query($sql) or die('Erro de tipos'); $total = mysql_num_rows($rs); for($x = 0; $x < $total; $x++){ $tpl->newBlock('TIPOS'); #DIVIDE $X POR 2, SE FOR IMPAR ATRIBUI UM VALOR A COR, E A LINHA FICA DE UM JEITO #CASO CONTRARIO A COR EQUIVALE A OUTRO VALOR if($x%2) $tpl->assign('cor','#F3F3F3'); else

63

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP $tpl->assign('cor','#FFFFFF'); #PARA CADA BOTAO (EDITAR , EXCLUIR) COLOCAR O LINK $tpl>assign('link_editar',"../php/tipos_admin_editar.php?acao= editar&id_tipo=" . mysql_result($rs, $x, 'id_tipo')); $tpl>assign('link_excluir',"../php/tipos_admin_editar.php?acao =excluir&id_tipo=" . mysql_result($rs, $x, 'id_tipo')); $tpl->assign('nome_tipo',mysql_result($rs, $x, 'nome')); } $tpl->gotoBlock('_ROOT'); $tpl>assign('link_novo',"../php/tipos_admin_editar.php?acao=no vo"); $tpl->printToScreen(); ?>

15.2 Inserindo e editando um tipo


Ao clicar no boto NOVO uma varivel chamada ao e remetida ao documento tipos_admin_editar.php, essa varivel analisada e acaba por fazer com que o formulrio venha vazio. Primeiramente vamos criar o documento que conter o formulrio de cadastro e edio de tipos, crie um novo documento HTML e salve-o como tipos_admin_editar.htm no diretrio htm do nosso site. O layout do arquivo devera seguir este padro:

A tag {nome_tipo} ficar dentro do atributo VALUE do campo texto do formulrio, sendo que esta vira em branco em caso de insero e preenchida no caso de uma atualizao de registro. Vamos agora criar o arquivo responsvel pela insero, edio e excluso de tipos de produtos no site.

64

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Crie um arquivo em php com o nome de tipos_admin_editar.php e salve-o no diretrio php do site. Dentre os valores analisados para a varivel ao neste documento, existe tambm o de SALVAR, onde verificamos se esta sendo uma edio (UPDATE) ou insero (INSERT0 na base de dados, para isso simplesmente passamos no ACTION do nosso formulrio o id_tipo do registro em caso de edio. Caso o id_tipo tenha sido passado saberemos que se trata da edio de um registro. Veja abaixo a sintaxe do script em php:
<?php include('../includes/classTemplatePower.php'); include('../includes/conexao.php'); include('../php/ver_sessao.php'); $tpl = new TemplatePower('../htm/modelo_admin.htm'); $tpl>assignInclude('CONTEUDO','../htm/tipos_admin_editar.htm') ; $tpl->prepare(); #===== MONTA OS LINKS DO MENU SUPERIOR ===== $tpl->assign('link_tipos','../php/tipos_admin.php'); $tpl->assign('link_produtos','../php/produtos_admin.php'); $tpl->assign('link_pedidos','../php/pedidos_admin.php'); $tpl->assign('link_logout','../php/logout.php'); #===== VERIFICA QUAL A OPERAO SER REALIZADA ===== switch($acao){ case 'novo': $tpl->assign('nome_tipo',''); $tpl>assign('acao',"../php/tipos_admin_editar.php?acao=salvar" ); break; case 'editar': $sql = "select tipo_produtos.* from tipo_produtos where tipo_produtos.id_tipo = $id_tipo"; $rs = mysql_query($sql ) or die(mysql_error() . 'Erro de tipo'); $tpl->assign('nome_tipo',mysql_result($rs, 0, 'nome'));

65

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP #TPL ASSIGN NA ACAO DO FORMULARIO, MOSTRANDO QUE UMA EDIO $tpl>assign('acao',"../php/tipos_admin_editar.php?acao=salvar& id_tipo=$id_tipo"); break; case 'excluir': #A EXCLUSAO S PODE SER FEITA SE NAO EXISTIR NENHUM PRODUTO USANDO O TIPO, CASO EXISTA NAO DEIXAR!!! #PRIMEIRO SELECIONA-SE TODOS OS PRODUTOS DESSE TIPO, SE ACHAR ALGUM NAO FAZ O DELETE $sql = "select produtos.* from produtos where produtos.id_tipo = $id_tipo"; $rs = mysql_query($sql) or die(mysql_error()); $total = mysql_num_rows($rs); if($total > 0){ $msg = 'Existem produtos usando este tipo!'; header("location:../php/tipos_admin.php?msg=$msg"); }else{ $sql = "delete from tipo_produtos where tipo_produtos.id_tipo = $id_tipo"; mysql_query($sql) or die(mysql_error()); header("location:../php/tipos_admin.php"); } break; case 'salvar': $msg =''; #VALIDAO DOS CAMPOS if(strlen($nome_tipo) == 0) $msg = '<li>Nome invalido!'; if(strlen($msg) > 0){ header("location:mensagem_admin.php?msg=$msg"); exit; }else{ if(isset($id_tipo)){

66

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP #SE O ID_TIPO VEIO JUNTO SINAL QUE UM EDICAO (UPDATE NO BANCO), CAOS CONTRARIO INSERO $sql = "update tipo_produtos set nome = '$nome_tipo' where tipo_produtos.id_tipo = $id_tipo"; mysql_query($sql) or die(mysql_error()); }else{ $sql = "insert into tipo_produtos (nome) values ('$nome_tipo')"; mysql_query($sql) or die(mysql_error()); } header('location:../php/tipos_admin.php'); } break; } $tpl->printToScreen(); ?>

Como estamos manipulando os dados atravs de um formulrio e precisamos ter consistncia dos dados que esto sendo inseridos na base de dados, realizamos o processo de validao no bloco em que desejamos salvar os dados. Por questo de apresentao, no podemos usar o mesmo arquivo de mensagem que usamos no ambiente do usurio, pois o layout um pouco diferente, ento acabamos por ter de criar um script e um template especifico para exibir as mensagens retornadas no ambiente administrativo. Como j sabemos a funcionalidade deste script iremos apenas aproveitar o j existente e duplica-lo com o nome de mensagem_admin.htm e mensagem_admin.php respectivamente. Estas e outras vantagens do uso do template facilitam a nossa implementao e o ganho de tempo em diversos casos. Ajustaremos apenas o layout do arquivo mensagem_admin.htm para uma largura maior. J no script ajustaremos a linha de bloco e de template. Veja abaixo o script mensagem_admin.php como dever ser implementado:
<?php include('../includes/classTemplatePower.php'); include('../includes/conexao.php'); include('../php/ver_sessao.php');

67

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP $tpl = new TemplatePower('../htm/modelo_admin.htm'); $tpl>assignInclude('CONTEUDO','../htm/mensagem_admin.htm'); $tpl->prepare(); #===== MONTA OS LINKS DO MENU SUPERIOR ===== $tpl->assign('link_tipos','../php/tipos_admin.php'); $tpl->assign('link_produtos','../php/produtos_admin.php'); $tpl->assign('link_pedidos','../php/pedidos_admin.php'); $tpl->assign('link_logout','../php/logout.php'); $tpl->assign('msg',$msg); $tpl->printToScreen(); ?>

15.3 Produtos
Aps a concluso do cadastro de tipos de produtos, deveremos ento partir para o prximo passo, o cadastro e manuteno dos produtos da loja. Estes scripts sero similares ao do modulo de tipos, porem com uma particularidade: o upload de imagens no servidor. Para realizarmos o upload de arquivos em php deveremos levar duas coisas em considerao: O tipo de arquivo dever ser verificado, imagens suportadas somente em formato gif, jpg e png. O diretrio que ser salvo as imagens dever estar com direitos de escrita liberado para o usurio comum. A imagem nunca salva com o nome original, renomeamos o arquivo para um nome consistente e que se baseie na sua identificao no banco de dados. A primeira tela a ser exibida quando clicamos em produtos do site a listagem de produtos, de qualquer forma aproveitaremos o script de listagem de tipos, e criaremos um novo arquivo chamado: produtos_admin.htm salvando-o no diretrio htm do servidor.

O layout do arquivo dever ficar como mostrado abaixo:

68

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Teremos aqui um bloco chamado BLOCO PRODUTOS e o atributo de cor da linha atribudo da mesma forma que fizemos na listagem de tipos de produtos anteriormente. Os links presentes so:
Link editar: <a href={link_editar}> Link excluir: <a href={link_excluir}> Link novo: <a href={link_novo}>

Para interpretarmos o template, vamos criar um novo produtos_admin.php e salva-lo no diretrio php do nosso site. Veja abaixo a sintaxe do script mencionado:

arquivo

chamado

<?php include('../includes/classTemplatePower.php'); include('../includes/conexao.php'); include('../php/ver_sessao.php'); $tpl = new TemplatePower('../htm/modelo_admin.htm'); $tpl>assignInclude('CONTEUDO','../htm/produtos_admin.htm'); $tpl->prepare(); #===== MONTA OS LINKS DO MENU SUPERIOR ===== $tpl->assign('link_tipos','../php/tipos_admin.php'); $tpl->assign('link_produtos','../php/produtos_admin.php'); $tpl->assign('link_pedidos','../php/pedidos_admin.php'); $tpl->assign('link_logout','../php/logout.php'); #===== LISTA OS PRODUTOS ===== $sql = "select produtos.* from produtos order by produtos.nome"; $rs = mysql_query($sql) or die('Erro de produtos'); $total = mysql_num_rows($rs); for($x = 0; $x < $total; $x++){ $tpl->newBlock('PRODUTOS'); #DIVIDE $X POR 2, SE FOR IMPAR ATRIBUI UM VALOR A COR if($x%2) $tpl->assign('cor','#F3F3F3'); else $tpl->assign('cor','#FFFFFF');

69

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP #PARA CADA BOTAO (EDITAR , EXCLUIR) COLOCAR O LINK $tpl>assign('link_editar',"../php/produtos_admin_editar.php?ac ao=editar&id_produto=" . mysql_result($rs, $x, 'id_produto')); $tpl>assign('link_excluir',"../php/produtos_admin_editar.php?a cao=excluir&id_produto=" . mysql_result($rs, $x, 'id_produto')); $tpl->assign('nome_produto',mysql_result($rs, $x, 'nome')); $tpl->assign('valor',mysql_result($rs, $x, 'valor')); } $tpl->gotoBlock('_ROOT'); $tpl>assign('link_novo',"../php/produtos_admin_editar.php?acao =novo"); $tpl->printToScreen(); ?>

15.4 Inserindo e editando um produto


O processo de insero, edio e excluso de um produto funcionar da mesma forma que vimos com os tipos, sendo que a varivel ao possuir quatro estados que sero analisados no processo de submisso do formulrio de manuteno dos produtos. O ultimo deles o processo de salvar os dados do registro o banco, onde iremos validar as informaes que esto sendo passadas antes de finalizar o processo, e caso haja alguma inconsistncia nesses valores iremos direcionar o usurio para o arquivo mensagem_admin.php informando que est errado nesses itens. Outro fator importante que veremos no script a utilizao de funes para a manipulao de arquivos via php e o tratamento que damos para vincul-los a um registro especifico na base de dados. Crie um novo arquivo php e nomeie de produtos_admin.php, salvando-o no diretrio php do servidor. A sintaxe do arquivo mostrada a seguir:
<?php include('../includes/classTemplatePower.php');

70

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP include('../includes/conexao.php'); include('../php/ver_sessao.php'); $tpl = new TemplatePower('../htm/modelo_admin.htm'); $tpl>assignInclude('CONTEUDO','../htm/produtos_admin_editar.ht m'); $tpl->prepare(); #===== MONTA OS LINKS DO MENU SUPERIOR ===== $tpl->assign('link_tipos','../php/tipos_admin.php'); $tpl->assign('link_produtos','../php/produtos_admin.php'); $tpl->assign('link_pedidos','../php/pedidos_admin.php'); $tpl->assign('link_logout','../php/logout.php'); #===== VERIFICA SE UMA EDIO DE PRODUTO E FAZ COM QUE O TIPO JA VENHA SELECIONADO if(isset($acao) && $acao == 'editar'){ $sql = "select produtos.id_tipo from produtos where produtos.id_produto = $id_produto"; $rs = mysql_query($sql) or die(mysql_error()); $id_tipo = mysql_result($rs, 0, 'id_tipo'); } #===== MONTA A CAIXA DE SELEO DE TIPOS NO TOPO DA PAGINA ===== $sql = "select tipo_produtos.* from tipo_produtos order by tipo_produtos.nome"; $rs = mysql_query($sql) or die(mysql_error()); $total = mysql_num_rows($rs); for($x = 0; $x < $total; $x++){ $tpl->newBlock('TIPOS'); $tpl->assign('nome_tipo',mysql_result($rs, $x, 'nome')); $tpl->assign('id_tipo',mysql_result($rs, $x, 'id_tipo')); if(isset($id_tipo) && $id_tipo == mysql_result($rs, $x, 'id_tipo')) $tpl->assign('marcar', 'selected'); }

71

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP $tpl->gotoBlock('_ROOT'); #===== VERIFICA QUAL A OPERAO SER REALIZADA ===== switch($acao){ case 'novo': $tpl->assign('nome_produto',''); $tpl->assign('descricao',''); $tpl->assign('valor',''); $tpl>assign('acao',"../php/produtos_admin_editar.php?acao=salv ar"); break; case 'editar': $sql = "select produtos.* from produtos where produtos.id_produto = $id_produto"; $rs = mysql_query($sql ) or die(mysql_error() . 'Erro de produto'); $tpl->assign('nome_produto',mysql_result($rs, 0, 'nome')); $tpl->assign('descricao',mysql_result($rs, 0, 'descricao')); $tpl->assign('valor',mysql_result($rs, 0, 'valor')); if(mysql_result($rs, 0, 'destaque') == 'Sim') $tpl->assign('seleciona','checked'); #VERIFICA SE O PRODUTO TEM FOTO CASO POSSUA FAZ COM QUE ESTA APAREA NA TELA if(strlen(mysql_result($rs, 0, 'foto'))>0) $tpl->assign('foto',"<img src=\"../fotos/".mysql_result($rs,0,'foto')."\" width=\"85\">"); #TPL ASSIGN NA ACAO DO FORMULARIO, MOSTRANDO QUE UMA EDIO $tpl>assign('acao',"../php/produtos_admin_editar.php?acao=salv ar&id_produto=$id_produto"); break; case 'excluir': #ANTES DE EXCLUIR O PRODUTO EXCLUI A SUA FOTO

72

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP $sql = "select produtos.foto from produtos where produtos.id_produto = $id_produto"; $rs = mysql_query($sql) or die(mysql_error()); $foto = mysql_result($rs, 0, 'foto'); #VERIFICA SE TINHA FOTO CADASTRADA PARA O PRODUTO A SER EXCLUIDO if(strlen($foto)>0) unlink("../fotos/$foto"); #APOS O PROCESSO EXCLUI O PRODUTO $sql = "delete from produtos where produtos.id_produto = $id_produto"; mysql_query($sql) or die(mysql_error()); header("location:../php/produtos_admin.php"); break; case 'salvar': $msg = ''; #VALIDAO DOS CAMPOS DO FORMULARIO if($id_tipo == '00') $msg = '<li>Selecione um tipo de produto!'; if(strlen($nome_produto) == 0) $msg .= '<li>Nome invlido!'; if(strlen($descricao) == 0) $msg .= '<li>Descrio invlida!'; if(strlen($valor) == 0 || !is_numeric($valor)) $msg .= '<li>Valor invlido'; if(strlen($msg) > 0){ header("location:mensagem_admin.php?msg=$msg"); exit; }else{ if(isset($id_produto)){ #SE O ID_PRODUTO VEIO JUNTO SINAL QUE UM EDICAO (UPDATE NO BANCO), CAOS CONTRARIO INSERO #VERIFICA SE O DESTAQUE VEIO MARCADO E ATUALIZA NO BANCO DE DADOS TAMBEM ;) if(isset($destaque))

73

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP $sql_destaque = ",destaque = 'Sim'"; else $sql_destaque = ''; $sql = "update produtos set id_tipo = '$id_tipo', nome = '$nome_produto', descricao = '$descricao', valor = '$valor' $sql_destaque where produtos.id_produto = $id_produto"; mysql_query($sql) or die(mysql_error()); #NO MOMENTO DA INSERO VERIFICA SE VEIO FOTO if(strlen($foto) > 0){ #ACEITA S SE FOR ARQUIVO JPG OU GIF if($foto_type == 'image/pjpeg' || $foto_type == 'image/gif'){ #PEGA OS TRES ULTIMOS CARACTES DO ARQUIVO PARA FORMAR A EXTENSO $extensao = explode(".",$foto_name); $tam = sizeof($extensao); $extensao = $extensao[$tam-1]; $nome_arquivo = 'foto_'. $id_produto . "." . $extensao; #COPIA O ARQUIVO ENVIADO PARA O DIRETORIO ESPECIFICADO copy($foto,"../fotos/$nome_arquivo");

74

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP #ATUALIZA O REGISTRO COM O NOME DA FOTO $sql = "update produtos set foto = '$nome_arquivo' where produtos.id_produto = $id_produto"; mysql_query($sql) or die(mysql_error()); } } }else{ $sql = "insert into produtos (nome,valor,descricao,id_tipo) values ('$nome_produto','$valor','$descricao','$id_tipo')"; mysql_query($sql) or die(mysql_error()); #NO MOMENTO DA INSERO VERIFICA SE VEIO FOTO #CASO TENHA VINDO INICIA O PROCESSO DE NOMEAO DO ARQUIVO E COPIA PARA O DIRETORIO if(strlen($foto) > 0){ #motangem do nome do arquivo atraves do id do produto recem inserido $sql = "select produtos.id_produto from produtos order by produtos.id_produto desc limit 0,1"; $rs = mysql_query($sql) or die(mysql_error()); $id_produto = mysql_result($rs, 0, 'id_produto'); #ACEITA S SE FOR ARQUIVO JPG OU GIF if($foto_type == 'image/pjpeg' || $foto_type == 'image/gif'){ #PEGA OS TRES ULTIMOS CARACTES DO ARQUIVO PARA FORMAR A EXTENSO $extensao = explode(".",$foto_name);

75

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP $tam = sizeof($extensao); $extensao = $extensao[$tam-1]; $nome_arquivo = 'foto_'. $id_produto . "." . $extensao; #COPIA O ARQUIVO ENVIADO PARA O DIRETORIO ESPECIFICADO copy($foto,"../fotos/$nome_arquivo"); #ATUALIZA O REGISTRO COM O NOME DA FOTO $sql = "update produtos set foto = '$nome_arquivo' where produtos.id_produto = $id_produto"; mysql_query($sql) or die(mysql_error()); } } } header('location:../php/produtos_admin.php'); } break; } $tpl->printToScreen(); ?>

importante ressaltar o processo de excluso do registro do banco, em que no basta simplesmente eliminar o registro, e sim eliminar junto o arquivo de imagem que est publicado no diretrio de fotos, evitando assim o acumulo de arquivos em desuso no site o que acaba por ocupar espao desnecessrio no servidor de hospedagem.

76

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

15.5 Controle de pedidos


Todas as compras efetuadas na loja sero armazenadas na base de dados, assim teremos um controle de quando foram realizadas as compras, por quem foram feitas e qual o valor que custou cada pedido. Observe que na estrutura de modelagem do banco foram criadas duas tabelas para o controle de pedidos: PEDIDOS e PRODUTOS_PEDIDOS, na primeira teremos apenas um resumo do pedido, e na segunda os itens includos em cada compra. Teremos de realizar uma leitura simultnea das duas tabelas para montarmos nosso relatrio. Para iniciarmos a implementao deste mdulo iremos agora criar o arquivo de template para o script, crie um arquivo novo HTML e salve-o no diretrio htm do servidor com o nome de pedidos_admin.htm. O layout deste arquivo dever ficar semelhando ao mostrado abaixo:

Neste arquivo em particular teremos de montar dois blocos encadeados, sendo o primeiro chamado de BLOCO PEDIDOS e o segundo (aninhado como filho do primeiro) de BLOCO PRODUTOS. No documento HTML a estrutura ficar como mostrada a seguir:
<!-- START BLOCK : PEDIDOS --> . . . <!-- START BLOCK : PRODUTOS --> . . . <!-- END BLOCK : PRODUTOS --> . . . <!-- END BLOCK : PEDIDOS -->

Iremos percorrer a tabela de PEDIDOS e a cada pedido encontrado iremos percorrer a tabela de PRODUTOS PEDIDOS, gerando um relatrio como mostrado abaixo:

77

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Para interpretar o layout recm montado, iremos criar um novo arquivo php chamado pedidos_admin.php e salve-lo no diretrio php do nosso site. Este script conter todas as querys de consulta para montar o relatrio acima, levando em conta que deveremos chamar os mtodos da classe til para convertermos as datas e os valores para o formato compreensvel e formatado. Veja abaixo a sintaxe lgica do script:
<?php include('../includes/classTemplatePower.php'); include('../includes/conexao.php'); include('../includes/classUtil.php'); include('../php/ver_sessao.php'); $util = new Util; $tpl = new TemplatePower('../htm/modelo_admin.htm'); $tpl>assignInclude('CONTEUDO','../htm/pedidos_admin.htm'); $tpl->prepare(); #===== MONTA OS LINKS DO MENU SUPERIOR ===== $tpl->assign('link_tipos','../php/tipos_admin.php'); $tpl->assign('link_produtos','../php/produtos_admin.php'); $tpl->assign('link_pedidos','../php/pedidos_admin.php'); $tpl->assign('link_logout','../php/logout.php');

#===== SELECIONA OS PEDIDOS REALIZADOS E VINCULA AOS RESPECITOVS CLIENTES E PRODUTOS $sql = "select pedidos.*, clientes.* from pedidos, clientes

78

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP where pedidos.id_cliente = clientes.id_cliente order by pedidos.dt_pedido desc"; $rs = mysql_query($sql) or die(mysql_error()); $total = mysql_num_rows($rs); for($x = 0; $x < $total; $x++){ $tpl->newBlock('PEDIDOS'); $tpl->assign('nome_cliente',mysql_result($rs, $x, 'clientes.nome')); $tpl->assign('total',$util>formataDecimal(mysql_result($rs, $x, 'pedidos.total_pedido'))); $tpl->assign('dt_pedido',$util>converteData(mysql_result($rs, $x, 'pedidos.dt_pedido')));

#DENTRO DESSE MESMO BLOCO RECUPERA OS PRODUTOS DO PEDIDO $sql2 = "select produtos_pedidos.*, produtos.* from produtos_pedidos,produtos where produtos_pedidos.id_produto = produtos.id_produto and produtos_pedidos.id_pedido = " . mysql_result($rs, $x, 'id_pedido') . " order by produtos.nome"; $rs2 = mysql_query($sql2) or die(mysql_error()); $total2 = mysql_num_rows($rs2); for($y = 0; $y < $total2; $y++){ $tpl->newBlock('PRODUTOS'); $tpl->assign('nome_produto',mysql_result($rs2, $y, 'nome')); $tpl->assign('valor',$util>formataDecimal(mysql_result($rs2, $y, 'valor'))); } } $tpl->gotoBlock('_ROOT'); $tpl->printToScreen(); ?>

79

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Como mencionado ao entrarmos o bloco de pedidos automaticamente a cada volta do loop entramos no bloco de produtos, gerando assim o relatrio de pedidos.

80

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Unidade 16 Efetuando logout, finalizando a sesso


Aps o usurio do ambiente administrativo do site ter efetuado as consultas e manutenes necessrias, precisamos finalizar de maneira segura a sua sesso, para isso criaremos um simples script de logout. Neste arquivo a sesso destruda, e o usurio direcionado para a tela de login novamente. Crie um novo arquivo php e salve-o como logout.php dentro do diretrio php do site. A estrutura do algoritmo dever ficar como mostrado a seguir:
<?php session_start(); session_destroy(); header('location:../php/modelo_site.php'); ?>

Com os passos acima seguidos podemos ter uma soluo flexvel e segura para uma loja virtual, lembrando que com a estrutura que montamos desde o banco de dados at os templates e scripts fica fcil agregar novas funcionalidades aos mdulos utilizando-se de um tecnologia gratuita e altamente robusta volta para o ambiente web.

16.1 Extra - Implementando uma newsletter


Com a utilizao da internet como uma nova forma de negcios e propaganda, a divulgao virtual se torna algo essencial para termos de forma rpida e automatizada o envio de mailing para um determinado grupo de usurios. Utilizando a tecnologia de template podemos fazer isso de forma mais fcil e rpida do que dos meios habituais. Todo cdigo lido e gerado pela juno do HTML com o script php retornado para o usurio atravs do mtodo $tpl->printToScreen, entretanto se no quisssemos mostrar o contedo na tela e sim armazen-lo em uma varivel poderamos chamar o mtodo $tpl->getOutputContent. Veja o digrama abaixo, o qual explica a lgica do envio do documento por email:

81

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP

Veja abaixo um exemplo prtico de um script php que recebe um template chamado newsletter.htm e o envia por email:

Arquivo newsletter.htm:

Arquivo newsletter.php:
<?php $headers = "From: Loja Virtual <newsletter@lojavirtual.com.br>\n"; $headers .= "Content-Type: text/html; charset=iso-88591\n"; $headers .= "MIME-Version: 1.0\r\n"; //======================================================== =//==> Instanciar TemplatePower para juntar o PHP + HTML //======================================================== = $tpl = new TemplatePower('../htm/newsletter.htm');

82

2007 Alfamidia Educao Profissional

Sistema de e-commerce em PHP $tpl->prepare(); $tpl->assign('data',date("d/m/Y")); $tpl->assign('titulo','Newsletter E-Commerce'); $tpl->assign('descricao','Esta uma newsletter exemplo!'); $message = $tpl->getOutputContent(); mail($destino, $titulo, $message, $headers); ?>

Analisando o script acima vemos que o comportamento o mesmo, entretanto nada na tela retornado e sim somente enviado por email. importante lembrar que no arquivo HTML, as imagens e o arquivo CSS devero ser inseridos com o caminho completo: HTTP://www.seudominio.com.br pois no cliente de email do usurio o navegador precisar do endereo completo de exibio das imagens. Voc pode incrementar o script fazendo com que os receptores do endereo sejam coletados do banco de dados, juntamente das informaes que sero agregadas na newsletter. Uma sugesto interessante seria criar um mdulo que permitisse a incluso de produtos para anuncio na newsletter, fazendo assim que a divulgao de determinados produtos em promoo ou em lanamento na sua loja fosse enviado por email.

16.2 Formas de pagamento (boleto bancrio e carto de crdito)


Uma das duvidas cruciais no desenvolvimento de um sistema de e-commerce a forma de pagamento da compra. Antigamente era necessrio que o desenvolvedor implementasse uma seria de scripts para gerar cdigos de barras e codificaes especificas para a transao via carto de crdito, atualmente existem dezenas de servios que simplesmente solicitam o envio dos dados da compra como valor, nome do cliente e um cdigo de identificao para determinada URL fornecida pela empresa. Antes de comear a desenvolver uma aplicao que fornea esses dados ou que gere um boleto bancrio automaticamente procure se informar dos servios disponibilizados pelas empresas credenciadas e bancos autorizados para o fornecimento deste servio. Assim voc estar evitando retrabalho e futuros problemas na implementao do seu script de venda.

83

2007 Alfamidia Educao Profissional