Ecommerce PHP
Ecommerce PHP
Ecommerce PHP
(Apostila utilizada nos cursos Alfamdia de PHP em 2007 disponibilizada agora gratuitamente)
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
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
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.
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.
Veja a seguir os mtodos existentes na classe Template Power e como se segue o comportamento de cada um.
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>
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(); ?>
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.
10
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
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
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
14
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
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.
16
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
#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
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
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.
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
21
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
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
24
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
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
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(); ?>
27
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
29
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
31
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
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
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
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
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
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
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
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
40
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.
41
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
43
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
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
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
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
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
49
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
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
52
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
#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
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
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
57
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
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
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
#===== 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
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
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
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(); ?>
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
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
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
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
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.
68
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
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(); ?>
70
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
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
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
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
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
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
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
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
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
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
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.
81
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
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.
83