Académique Documents
Professionnel Documents
Culture Documents
Apresentao da Disciplina
EMENTA
Tpicos relacionados com inovaes tecnologias decorrentes de pesquisas de vanguarda e da evoluo apurada na rea. O estado da Arte da Tecnologia.
CRITRIOS DE APROVEITAMENTO:
Provas: peso 8.0 (oito) Trabalhos: peso 2.0 (dois)
Bibliografia
Livro Texto: 1. PHP 4: A Bblia; Converse, Tim et al; Ed. Campus; 1 edio; 2001; 5 exemplares. 2. Use a Cabea: PHP e MySQL; Beighley, Linn; Ed. Alta Books; 1 edio; 2010; 10 exemplares. 3. Ajax (ASYNCHRONOUS JAVASCRIPT AND XML); Soares, Walace; Ed. rica; 1 edio; 2006; 10 exemplares. Complementar: 4. Profissional PHP: Programando; Castagneto, Jesus et al; Ed. Makron Books; 1 edio; 2001; 1 exemplar. 5. PHP e MySQL: Desenvolvimento Web; Welling, Luke et al; Ed. Campus; 1 edio; 2001; 1 exemplar. 6. Programando em PHP: Conceitos e Aplicaes; Soares, Walace; Ed. rica; 1 edio; 2000; 5 exemplares. 7. Fundamentos de PHP; Meloni, Julie C.; Ed. Cincia Moderna; 1 edio; 2000; 5 exemplares. 8. Guia de Consulta Rpida: Integrando PHP com MySQL; Stoco, Lucio M.; Ed. Novatec; 1 edio; 2000; 5 exemplares.
EasyPHP (http://www.easyphp.org/)
EasyPHP um sistema indicado para os usurios que no tm instalado no sistema nenhum dos programas necessrios para programar em PHP (Apache, PHP e MySQL)
Notepad++ (http://notepad-plus-plus.org/ )
Seqncia para instalao: 1. 2. 3. 4. 5. 6. 7. Tela de boas vindas ... Termos de uso da licena ... Informao sobre o uso ... Pasta para instao ... Nome da atalho no menu ... Pronto para instalao ... Instalao Completa!
cone do programa
Interface do EasyPHP
7
http://localhost/ ou http://127.0.0.1/
Pasta Base
Pasta Base o local onde os programas PHP devero ser salvos. nesse local que o Apache ir buscar os scripts para serem interpretados. Pela instalao padro, a pasta base ser: C:\Arquivos de programas\EasyPHP-5.3.3\www possvel redefinir a pasta base editando o arquivo httpd.conf, atravs da diretiva: DocumentRoot Nesse arquivo tambm possvel configurar o nome do arquivo default a ser carregado: DirectoryIndex index.php index.html index.htm
9
EasyPHP home
http://localhost/home
A partir da pgina principal do EasyPHP possvel: - Criar um Alias (apelido) indicando onde os scripts estaro gravados, como uma alternativa para a pasta base padro. - Ver informaes sobre as configuraes do PHP - Acessar o PhpMyAdmin para administrar bases de dados no MySQL. - Ler os termos de licena de todos os softwares oferecidos no pacote.
10
11
Esquema do Funcionamento
Internet
usurio servidor pgina PHP
pgina html
base de dados
12
Primeiro Script
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Aprendendo PHP</title> </head> <body>
13
A instruo if usada para garantir que nada seja apresentado quando a pgina for carregada pela primeira vez. possvel atribuir o valor do INPUT direto para uma varivel do PHP.
preciso configurar register_globals = On no arquivo PHP.INI e reiniciar o servidor Apache. Por questes de segurana, esta opo est desabilitada a partir do PHP 6.
16
Desvio Condicional - if
<?php if(!empty($_GET["sexo"])) { $sexo = $_GET["sexo"]; if ($sexo == "M") echo "Sexo masculino"; else if($sexo == "F") echo "Sexo feminino"; } ?> <br><br> <form method="GET" action=""> <input type="radio" name="sexo" value="M">Masculino<br> <input type="radio" name="sexo" value="F">Feminino<br><br> <input type="submit" value="Enviar"> </form>
Se uma condio if possuir 2 ou mais comando preciso coloc-los entre chaves. { e } representam, respectivamente, begin e end.
18
20
10
<!-- welcome.php --> <html><body> <?php echo "Seja bem-vindo!!!<br>"; include("data.php"); ?> </body></html>
21
Um array inicia na posio 0 (zero). A funo count retorna a quantidade de elementos de um array.
22
11
Uso de Sesso
O uso de sesso permite a criao de variveis acessveis por todo o sistema enquanto uma sesso estiver aberta. As variveis de sesso so independentes para cada usurio conectado.
<!-- page1.php --> <?php session_start(); echo "Pagina #1"; $_SESSION["x"] = "PHP"; echo "<br><a href=\"page2.php\">page 2</a>"; ?> <!-- page2.php --> <?php session_start(); echo "Pagina #2"; echo "<br>Valor da varivel de sesso x: " .$_SESSION["x"]; ?>
23
Exerccio - Calculadora
Elaborar uma calculadora simples com as 4 operaes bsicas. O usurio deve informar 2 nmeros e o operador (+ - * / )
24
12
27
Exerccios
1. 2. 3. 4. 5. 6. 7. 8. Apresentar os nmeros pares entre 1 e 100. Apresentar os anos bissextos entre um intervalo informado pelo usurio. Apresentar os 10 primeiros termos da srie de Fibonacci. Solicitar um valor e verificar se um nmero primo. Criar um programa para ler um nmero de 1 a 12 e apresentar o respectivo ms por extenso. Criar um programa para ler uma data em formato dd/mm/yyyy. Por exemplo: 21/03/2012 -> 21 de maro de 2012. Criar um programa para ler um nmero entre 1 e 100 e apresent-lo por extenso. Criar um gerador automtico de curriculum. O usurio deve informar: nome, dados pessoais, objetivos, experincia profissional, formao acadmica e conhecimentos gerais. O usurio tambm dever escolher a cor do texto e do fundo do site. O programa deve gerar um curriculum em formato .html.
32
13
Trabalho Lanchonete
(individual)
Elaborar uma pgina em PHP para montar um lanche e calcular o valor a ser cobrado do cliente.
44
Alm dos comandos da linguagem PHP, de extrema importncia conhecer a linguagem SQL.
45
14
47
15
Na programao, troque os prefixos mysql_ das funes por ibase_ para utilizar o Interbase. Nem todas funes disponveis para MySQL funcionam para os demais bancos.
48
Banco de Dados
Banco de Dados
CREATE DATABASE IF NOT EXISTS db_aula; USE db_aula;
Tabela CONTATO
CREATE TABLE IF NOT EXISTS tb_contato( cod_cont integer not null auto_increment, nome varchar(50), endereco varchar(60), cidade varchar(40), data_nasc date, fone varchar(15), PRIMARY KEY(cod_cont) );
Incluso de dados
INSERT INTO tb_contato(nome,endereco,cidade,fone,data_nasc) VALUES('Jonatas','Rua da Glria,12','Lins','3533-1234','1972-03-20'); INSERT INTO tb_contato(nome,endereco,cidade,fone,data_nasc) VALUES('Raquel','R. 7 Setembro,55','Ponga','3523-0022','1973-05-15'); INSERT INTO tb_contato(nome,endereco,cidade,fone,data_nasc) VALUES('Marcos','Av.Saudade,275','Lins','3532-3344','1980-12-25'); INSERT INTO tb_contato(nome,endereco,cidade,fone,data_nasc) VALUES('Ana','R. das Flores,99','Lins','3523-9999','1984-01-05'); COMMIT; 49
16
Listar registros do BD
<?php $link = mysql_connect("127.0.0.1","root",""); mysql_select_db("db_aula"); $sql = "SELECT cod_cont, nome, endereco, cidade, fone, data_nasc FROM tb_contato"; $resultado = mysql_query($sql); while($registro = mysql_fetch_array($resultado)){ echo $registro["cod_cont"] . " | " . $registro["nome"] . " | " . $registro["endereco"] . " | " . $registro["cidade"] . " | " . $registro["fone"] . " | " . $registro["data_nasc"] . "<br>"; } mysql_close($link); ?>
50
Exerccios
1. 2. 3. 4. 5. 6. 7. Alterar o programa anterior para que a listagem seja exibida em formato de tabela. Fazer com que a relao de registros cadastrados seja exibida num relatrio zebrado. Permitir que usurio escolha o campo de deseja para ordenao dos registros. Adicionar um campo para que o usurio digite parte do nome a ser consultado. Apresentar, ao final da listagem, a quantidade total de registros da agenda. Apresentar os dados com paginao, mostrando 10 registros de cada vez. Apresentar os registros utilizando uma tableless (tabela feita com folha de estilo)
51
17
Requisitos:
O mdulo de agenda deve ser um CRUD, ou seja, deve permitir consultar, cadastrar, alterar e excluir registros de pessoas. Para cada registro, deve-se armazenar: codigo, nome, endereo, cidade, telefone e data de nascimento. Todas as funcionalidades da agenda devem ser acessadas atravs de um menu de opes.
Lista de Eventos
No Evento
01 02 03 04 Listar Contatos Cadastrar Contato Alterar Contato Excluir Contato
Descrio
Listar a relao de contatos da agenda Cadastrar dados pessoais de um contato Alterar dados de um contato Excluir fisicamente os registros
Ator
Administrador Administrador Administrador Administrador
53
18
Menu
<!-- menu.php --> <a href="listar.php">Listar</a> | <a href="inserir.php">Inserir</a> | <a href="alterar.php">Alterar</a> | <a href="excluir.php">Excluir</a> <hr>
54
Listar registros do BD
<!-- listar.php --> <?php include "menu.php"; $link = mysql_connect("127.0.0.1","root",""); mysql_select_db("db_aula"); $sql = "SELECT cod_cont, nome, endereco, cidade, fone, data_nasc FROM tb_contato"; $rs = mysql_query($sql); while($r = mysql_fetch_array($rs)){ echo $r["cod_cont"] . " | " . $r["nome"] . " | " . $r["endereco"] . " | " . $r["cidade"] . " | " . $r["fone"] . " | " . $r["data_nasc"] . "<br>"; } mysql_close($link); ?>
55
19
<!- inserir.php --> <?php include "menu.php"; ?> <form method="GET" action="inserir2.php"> Nome: <input type="text" name="nome"> <br> Endereo: <input type="text" name="endereco"> <br> Cidade: <input type="text" name="cidade"> <br> <br> Telefone: <input type="text" name="fone"> Data Nasc.: <input type="text" name="data_nasc"><br> <br><input type="submit" value="Gravar"> </form>
56
Inserir
(Cont. 2/2)
<!- inserir2.php --> <?php include "menu.php"; // recebe os parmetros do formulrio @$nome = $_GET["nome"]; @$endereco = $_GET["endereco"]; @$cidade = $_GET["cidade"]; @$fone = $_GET["fone"]; @$data_nasc = $_GET["data_nasc"]; $data_nasc = implode('-',array_reverse(explode('/',$data_nasc))); //conecta e insere no banco de dados $link = mysql_connect("127.0.0.1","root",""); mysql_select_db("db_aula"); $sql = "INSERT INTO tb_contato(nome,endereco,cidade,fone,data_nasc) VALUES('$nome','$endereco','$cidade','$fone','$data_nasc')"; //echo $sql."<br>"; $status = mysql_query($sql); if($status == 1) echo "Sucesso ao inserir registro!"; else if ($status == 0 ) echo "Erro ao inserir!"; mysql_close($link); ?> 57
20
Alterar dados no BD
<!- alterar.php --> <?php include "menu.php"; $link = mysql_connect("127.0.0.1","root",""); mysql_select_db("db_aula"); $sql = "SELECT cod_cont, nome FROM tb_contato"; $rs = mysql_query($sql); while($r=mysql_fetch_array($rs)){ echo "<a href=alterar2.php?cod_cont=".$r["cod_cont"].">" .$r["nome"]."</a><br>"; } mysql_close($link); ?>
58
Alterar
<?php
(Cont. 2/3)
<!-- alterar2.php --> include "menu.php"; $cod_cont = $_GET["cod_cont"]; $link = mysql_connect("127.0.0.1","root",""); mysql_select_db("db_aula"); $sql = "SELECT * FROM tb_contato WHERE cod_cont=".$cod_cont; $rs = mysql_query($sql); $r = mysql_fetch_array($rs); $r[5] = implode('/',array_reverse(explode('-',$r[5]))); mysql_close($link); ?> <form method="GET" action="alterar3.php"> Cdigo:<input type="text" name="cod_cont" value="<?php echo $r[0]; ?>" readonly><br> Nome: <input type="text" name="nome" value="<?php echo $r[1]; ?>"><br> Endereo: <input type="text" name="endereco" value="<?php echo $r[2]; ?>"><br> Cidade: <input type="text" name="cidade" value="<?php echo $r[3]; ?>"><br> Telefone: <input type="text" name="fone" value="<?php echo $r[4]; ?>"><br> Data Nasc.: <input type="text" name="data_nasc" value="<?php echo $r[5]; ?>"><br> <br><input type="submit" value="Atualizar"> </form> 59
21
Alterar
(Cont. 3/3)
<!- alterar3.php --> <?php include "menu.php"; @$cod_cont = $_GET["cod_cont"]; @$nome = $_GET["nome"]; @$endereco = $_GET["endereco"]; @$cidade = $_GET["cidade"]; @$fone = $_GET["fone"]; @$data_nasc = $_GET["data_nasc"]; $data_nasc = implode('-',array_reverse(explode('/',$data_nasc))); $link = mysql_connect("127.0.0.1","root",""); mysql_select_db("db_aula"); $sql = "UPDATE tb_contato SET nome='$nome', endereco='$endereco', cidade='$cidade', fone='$fone', data_nasc='$data_nasc' WHERE cod_cont=$cod_cont"; $status = mysql_query($sql); if ($status==0) echo "Erro ao atualizar.<br>"; else if ($status==1) echo "Atualizado com sucesso.<br>"; mysql_close($link); ?> 60
Excluir registros do BD
<!- excluir.php --> <?php include "menu.php"; $link = mysql_connect("127.0.0.1","root",""); mysql_select_db("db_aula"); if (!empty($_GET["cod_cont"])) { $codigos = implode(", ", $_GET["cod_cont"]); $sql = "DELETE FROM tb_contato WHERE cod_cont IN (".$codigos.")"; $status = mysql_query($sql); if ($status==0) echo "Erro ao excluir.<br>"; } ?> <form method="GET" action=""> <?php $sql = "SELECT cod_cont, nome FROM tb_contato"; $rs = mysql_query($sql); while($r=mysql_fetch_array($rs)){ echo "<input type=checkbox name=cod_cont[] value=".$r["cod_cont"].">" .$r["nome"]."<br>"; } mysql_close($link); ?> <br><input type="submit" value="Excluir"></form>
61
22
Controle de Acesso
Da forma que fizemos, nosso CRUD est funcionando. Contudo, qualquer pessoa que conhea o endereo da Agenda Eletrnica ser capaz de acessar o sistema.
Tabela USUARIO
CREATE TABLE IF NOT EXISTS tb_usuario( cod_usu integer not null auto_increment, usuario varchar(30) UNIQUE not null, senha varchar(30) not null, PRIMARY KEY(cod_usu) ); INSERT INTO tb_usuario(usuario, senha) VALUES('admin','master'); Commit;
62
login.php
(1/2)
<?php session_start(); @$usuario = $_POST['usuario']; @$senha = $_POST['senha']; if(!empty($usuario) AND !empty($senha)) { $link = mysql_connect("127.0.0.1", "root", ""); mysql_select_db("db_aula"); $sql = "SELECT cod_usu FROM tb_usuario WHERE usuario = '$usuario' AND senha = '$senha'"; $rs = mysql_query($sql); if(!empty($rs) AND mysql_num_rows($rs)==1) { $r = mysql_fetch_array($rs); $_SESSION['cod_usu'] = $r['cod_usu']; } mysql_close($link); }
63
23
login.php
(2/2)
if(!empty($_SESSION['cod_usu'])) { ?> <script>location='menu.php';</script> <?php exit; } else { ?> <form method="POST" action=""> Usurio: <input type="text" name="usuario"><br> Senha: <input type="password" name="senha"><br> <input type="submit" value="Entrar"> </form> <?php } ?>
64
logout.php
<?php session_start(); $_SESSION['login'] = null; ?> <script>location='menu.php';</script>
65
24
menu.php
<?php session_start(); if(empty($_SESSION['cod_usu'])) { ?> <script>location='login.php';</script> <?php exit; } ?> <a href="listar.php">Listar</a> | <a href="inserir.php">Inserir</a> | <a href="alterar.php">Alterar</a> | <a href="excluir.php">Excluir</a> | <a href="logout.php">Logout</a> <hr>
66
Organizao dos arquivos: conexao.php grid.php form.php salvar.php excluir.php index.php - conexo com o BD para todos os arquivos - tela principal para gerenciamento - formulrio para inserir e alterar - responsvel por inserir e atualizar no DB - responsvel pela excluso de registros - arquivo inicial que direciona para o grid
67
25
conexao.php
68
grid.php (1/3)
<?php include "conexao.php"; @$filtro = trim(addslashes($_GET['filtro'])); $sql = "SELECT cod_cont, nome, endereco, cidade, fone DATE_FORMAT(data_nasc,'%d/%m/%Y') data FROM tb_contato WHERE nome LIKE '$filtro%'"; $rs = mysql_query($sql); echo '<table border=1> <th bgcolor=#EEEEEE>Gerenciar Contatos</th><tr><td> <table border=0> <tr> <td width= "20"> </td> <td width= "20"> </td> <td width= "40"><b>ID</td> <td width="200"><b>Nome</td> <td width="220"><b>Endereo</td> <td width="120"><b>Cidade</td> <td width="110"><b>Cidade</td> <td width= "80"><b>Data Nasc.<td> </tr>';
69
26
grid.php (2/3)
if(empty($rs) OR mysql_num_rows($rs)==0) { echo '<tr><td colspan=8 align=center>Nenhum contato encontrado</td></tr>'; } else { while($r = mysql_fetch_array($rs)){ echo "<tr> <td><a href=\"excluir.php?codigo=".$r['cod_cont']."\" onClick=\"return confirm('Confirma a excluso?');\"> <img src=\"./img/excluir.png\" border=0 alt=excluir></a> </td> <td><a href=\"form.php?codigo=".$r['cod_cont']."\"> <img src=\"./img/alterar.png\" border=0 alt=alterar></a> </td> <td>".$r['cod_cont']."</td> <td>".$r['nome']."</td> <td>".$r['endereco']."</td> <td>".$r['cidade']."</td> <td>".$r['data']."</td> </tr>"; } }
70
grid.php (3/3)
echo "</table></td></tr>"; echo "<tr><td><table width=100% border=0><tr><td> <input type=button value=Novo onClick=\"location='form.php';\"></td> <form><td align=right>Pesquisar por: <input name=filtro> <input type=submit value=Buscar></td></form></tr></table>"; echo "</td></tr></table>"; mysql_close($link); ?>
71
27
salvar.php (1/2)
<?php include "conexao.php"; @$codigo = $_GET["cod_cont"]; @$nome = $_GET["nome"]; @$endereco = $_GET["endereco"]; @$cidade = $_GET["cidade"]; @$fone = $_GET["fone"]; @$data_nasc = $_GET["data_nasc"]; if(!empty($data_nasc)) $data_nasc = implode('-',array_reverse(explode('/',$data_nasc))); if(empty($codigo)) { $sql = "INSERT INTO tb_contato(nome, endereco, cidade, fone, data_nasc) VALUES('$nome', '$endereco', '$cidade', '$fone', '$data_nasc')"; } else { $sql = "UPDATE tb_contato SET nome = '$nome', endereco = '$endereco', cidade = '$cidade', fone = '$fone', data_nasc = '$data_nasc' WHERE cod_cont = $codigo"; }
72
salvar.php (2/2)
//echo $sql."<br>"; $status = mysql_query($sql); if($status==1) $msg = "Sucesso ao salvar registro"; else $msg = "Erro ao salvar registro"; mysql_close($link); ?> <script> alert('<?php echo $msg; ?>'); location = 'grid.php'; </script>
73
28
excluir.php (2/2)
<?php include "conexao.php"; $codigo = $_GET["codigo"]; $sql = "DELETE FROM tb_contato WHERE cod_cont = $codigo"; $status = mysql_query($sql); if($status==1) $msg = "Sucesso ao excluir registro"; else $msg = "Erro ao excluir registro"; mysql_close($link); ?> <script> alert('<?php echo $msg; ?>'); location = 'grid.php'; </script>
74
index.php
75
29
Requisitos:
Criar um CRUD para gerenciar cidades. De cada cidade deve-se armazenar o nome e o estado. Os estados devero estar previamente cadastrados numa tabela.
Banco de Dados
Tabela tb_estado
CREATE TABLE IF NOT EXISTS tb_estado( sigla char(2) not null, nome varchar(40), PRIMARY KEY(sigla) );
Tabela tb_cidade
CREATE TABLE IF NOT EXISTS tb_cidade( id integer not null auto_increment, sigla char(2), nome varchar(40), PRIMARY KEY(id), FOREIGN KEY(sigla) REFERENCES tb_estado );
Incluso de estados
INSERT INSERT INSERT INSERT INSERT INSERT INSERT ... COMMIT; 77 INTO INTO INTO INTO INTO INTO INTO tb_estado tb_estado tb_estado tb_estado tb_estado tb_estado tb_estado VALUES VALUES VALUES VALUES VALUES VALUES VALUES ('SP', ('RJ', ('MG', ('ES', ('RS', ('SC', ('PR', 'So Paulo'); 'Rio de Janeiro'); 'Minas Gerais'); 'Esprito Santo'); 'Rio Grande do Sul'); 'Santa Catarina'); 'Paran');
30
Organizao dos arquivos: conexao.php - conexo com o BD para todos os arquivos grid.php - tela principal para gerenciamento form.php - formulrio para inserir e alterar excluir.php - responsvel pela excluso de registros salvar.php - responsvel por inserir e atualizar no DB index.php - arquivo inicial que direciona para o grid 78
grid.php (1/2)
<!-- grid.php --> <table border=1> <th bgcolor=#EEEEEE>Gerenciar Cidades</th> <tr><td> <table border=0> <tr><td width=20> </td><td width=20> </td> <td width= 40><b>ID</td> <td width=300><b>Cidade</td> <td width= 50><b>Estado</td></tr> <?php include "conexao.php"; @$filtro = trim(addslashes($_GET['filtro'])); $sql = "SELECT a.id, a.nome, b.nome estado FROM tb_cidade a LEFT JOIN tb_estado b ON a.sigla = b.sigla WHERE a.nome LIKE '$filtro%' ORDER BY a.nome"; $rs = mysql_query($sql); if(empty($rs) OR mysql_num_rows($rs)==0) { echo "<tr><td colspan=5 align=center>Nenhum registro localizado</td></tr>"; } else {
79
31
grid.php (2/2)
while($r = mysql_fetch_array($rs)){ echo "<tr> <td><a href=\"excluir.php?id=".$r['id']."\" onClick=\"return confirm('Confirma a excluso?');\"> <img src=\"./img/excluir.png\" border=0 alt=excluir></a></td> <td><a href=\"form.php?id=".$r['id']."\"> <img src=\"./img/alterar.png\" border=0 alt=alterar></a></td> <td>".$r['id']."</td> <td>".$r['nome']."</td> <td>".$r['estado']."</td> </tr>"; } } mysql_close($link); ?> </table></td></tr> <tr><td> <table width="100%" border=0><tr> <td><input type=button value=Novo onClick="location='form.php';"></td><form> <td align=right>Pesquisar por: <input name=filtro> <input type=submit value=Buscar></td></form></tr> </table> </td></tr> </table> 80
form.php (1/2)
<!-- form.php --> <?php $r = array(); @$r['id'] = $_GET['id']; $r['nome'] = null; $r['sigla'] = "SP"; include "conexao.php"; if(!empty($r['id'])) { $sql = "SELECT id,nome,sigla FROM tb_cidade WHERE id=".$r['id']; $rs = mysql_query($sql); $r = mysql_fetch_array($rs); } ?> <table border=1> <th bgcolor=#EEEEEE>Formulrio de Cidades</th> <tr><form action="salvar.php"><td> <table border=0> <tr><td>Cdigo:</td><td> <input type=text name=id value="<?php echo $r['id']; ?>" readonly></td></tr> <tr><td>Cidade:</td><td> <input type=text name=nome value="<?php echo $r['nome']; ?>"></td></tr>
81
32
form.php (2/2)
<tr><td>Estado:</td><td> <select name="sigla"> <?php $sql2 = "SELECT sigla, nome FROM tb_estado ORDER BY nome"; $rs2 = mysql_query($sql2); while($r2 = mysql_fetch_array($rs2)) { ?> <option value="<?php echo $r2['sigla']; ?>" <?php if($r['sigla']==$r2['sigla']) echo " SELECTED"; ?>> <?php echo $r2['nome']; ?></option> <?php } ?> </select> </td></tr> </table> </td></tr> <tr><td> <table width=100% border=0> <tr><td><input type=button value=Cancelar onClick="location='grid.php';"></td> <td align=right><input type=submit value=Salvar></td></form></tr> </table> </td></tr> </table> <?php mysql_close($link); ?>
82
salvar.php
<!-- salvar.php --> <?php include "conexao.php"; @$id = $_GET["id"]; @$nome = $_GET["nome"]; @$sigla = $_GET["sigla"]; if(empty($id)) { $sql = "INSERT INTO tb_cidade(nome,sigla) VALUES('$nome','$sigla')"; } else { $sql = "UPDATE tb_cidade SET nome='$nome', sigla='$sigla' WHERE id=$id"; } //echo $sql."<br>"; $status = mysql_query($sql); if($status==1) $msg = "Sucesso ao salvar registro"; else $msg = "Erro ao salvar registro"; mysql_close($link); ?> <script> alert('<?php echo $msg; ?>'); location = 'grid.php'; </script> 83
33
excluir.php
<!-- excluir.php --> <?php include "conexao.php"; $id = $_GET["id"]; $sql = "DELETE FROM tb_cidade WHERE id = $id"; $status = mysql_query($sql); if($status==1) $msg = "Sucesso ao excluir registro"; else $msg = "Erro ao excluir registro"; mysql_close($link); ?> <script> alert('<?php echo $msg; ?>'); location = 'grid.php'; </script>
84
34
87
35
Herana em PHP
<!-- pessoa.class.php --> <?php class PESSOA { private $pes_nome; private $pes_sexo; private $pes_nasc; public function setar($nome,$sexo,$nasc){ $this->pes_nome = $nome; $this->pes_sexo = $sexo; $this->pes_nasc = $nasc; } public function obterNome() { return $this->pes_nome; } public function obterSexo() { return $this->pes_sexo; } public function obterNascimento() { return $this->pes_nasc; } } ?> } <!-- funcionario.class.php --> include "pessoa.class.php"; class FUNCIONARIO extends PESSOA { private $fun_cargo; private $fun_salario; public function setar($nome,$sexo,$nasc, $cargo,$salario) { PESSOA::setar($nome, $sexo, $nasc); $this->fun_cargo = $cargo; $this->fun_salario = $salario; } function obterCargo() { return $this->fun_cargo; } function obterSalario() { return $this->fun_salario; } function reajustarSalario($aumento) { $this->fun_salario += $aumento; }
88
36
Construtores e Destrutores
<!-- construtores.php --> <?php class myClass { function __construct() { echo "Primeira classe construda <br />"; } function operacoes() { echo "Realizando Operaes <br />"; } function __destruct() { echo "Primeira classe destruda <br />"; } } $obj = new myClass(); $obj->operacoes(); ?>
(1/2)
91
37
(2/2)
92
93
38
database.php
(1/3)
<?php class database { private $link; private $database; private $ip = "127.0.0.1"; private $user = "root"; private $pass = ""; private $db = "db_aula"; function __construct($flag=false){ if($flag==true){ $this->connect(); } } function __destruct() { $this->close(); } protected function connect(){ $this->link = mysql_connect($this->ip, $this->user, $this->pass); $this->database = mysql_select_db($this->db); }
94
database.php
(2/3)
protected function close(){ $this->database = null; if(!empty($this->link)) @mysql_close($this->link); } protected function query($sql){ return mysql_query($sql); } protected function execute($sql){ $sql = utf8_decode($sql); return $this->query($sql) ? 1 : 0; } protected function affected_rows(){ return mysql_affected_rows(); } protected function insert_id(){ return mysql_insert_id(); } protected function num_rows($rs){ return empty($rs) ? 0 : mysql_num_rows($rs); }
95
39
database.php
(3/3)
protected function result($sql,$index=0) { $rs = $this->query($sql); return ($this->num_rows($rs)>0) ? mysql_result($rs,$index) : null; } protected function fetch_array($rs){ return empty($rs) ? null : mysql_fetch_array($rs); } protected function select_id($sql){ $rs = $this->query($sql); return $this->fetch_array($rs); } protected function select_all($sql){ $dados = array(); $rs = $this->query($sql); while($r = $this->fetch_array($rs)){ $dados[] = $r; } return $dados; } } // fim da classe database ?>
96
40
Banco de Dados
Tabela PRODUTO
CREATE TABLE IF NOT EXISTS tb_produto ( cod_prod int(11) NOT NULL AUTO_INCREMENT, descricao varchar(60) NOT NULL, preco decimal(8,2) NOT NULL, PRIMARY KEY (cod_prod) );
98
99
41
produto.php
(1/7)
<?php require_once "database.php"; class produto extends database { function __construct() { @$this->action = $_GET['action']; if($this->action=='grid') $this->grid(); else if($this->action=='form') $this->form(); else if($this->action=='save') $this->save(); else if($this->action=='delete') $this->delete(); else $this->grid(); }
100
produto.php
(2/7)
private function grid() { $sql = "SELECT cod_prod, descricao, preco FROM tb_produto ORDER BY cod_prod"; $this->connect(); $dados = $this->select_all($sql); ?> <table border="1"> <th bgcolor=#EEEEEE>Gerenciar Agenda</th> <tr><td> <table border="0"> <tr> <td> </td><td> </td> <td width= "80"><b>Cdigo</b></td> <td width="200"><b>Descrio</b></td> <td width="120" align="right"><b>Preo</b></td> </tr> <?php if(empty($dados)) {?> <tr><td>Nenhum registro localizado.</td></tr> <?php } else { $tam = count($dados); for($i=0; $i<$tam; $i++) {
101
42
produto.php
(3/7)
$r = $dados[$i]; $r['preco'] = "R$ ".number_format($r['preco'],2,',','.'); ?> <tr> <td><a href="?action=delete&cod_prod= <?php echo $r['cod_prod']; ?>"> <img src="./img/excluir.png" border="0"></a></td> <td><a href="?action=form&cod_prod= <?php echo $r['cod_prod']; ?>"> <img src="./img/alterar.png" border="0"></a></td> <td align="center"><?php echo $r['cod_prod']; ?></td> <td><?php echo $r['descricao']; ?></td> <td align="right"><?php echo $r['preco']; ?></td> </tr> <?php } } ?> </table> </td></tr> <tr><td colspan="5" align="left"> <input type=button value=Novo onClick="location='?action=form';"> </td></tr></table><?php }
102
produto.php
(4/7)
private function form() { @$r['cod_prod'] = $_GET['cod_prod']; $r['descricao'] = null; $r['preco'] = null; if(!empty($r['cod_prod'])) { $this->connect(); $sql = "SELECT * FROM tb_produto WHERE cod_prod = ".$r['cod_prod']; $r = $this->select_id($sql); } ?> <table border=1> <th bgcolor=#EEEEEE>Formulrio de Produtos</th> <tr> <td> <table border="0"> <form method="POST" action="?action=save"> <tr> <td>Cdigo:</td> <td><input type="text" name="cod_prod" READONLY value="<?php echo $r['cod_prod']; ?>"></td> </tr>
103
43
produto.php
(5/7)
<tr> <td>Descrio:</td> <td><input type="text" name="descricao" value="<?php echo $r['descricao']; ?>"></td> </tr> <tr> <td>Preo:</td> <td><input type="text" name="preco" value="<?php echo $r['preco']; ?>"></td> </tr> <tr> <td><input type="submit" value="Salvar"></td> <td align="right"><input type="button" value="Cancelar" onClick="location='?action=grid';"></td> </tr> </form> </table> </td> </tr> </table> <?php }
104
produto.php
(6/7)
private function save() { $p = (object) $_POST; $p->preco = str_replace(",", ".", $p->preco); if(empty($p->cod_prod)) { $sql = "INSERT INTO tb_produto(descricao, preco) VALUES('".$p->descricao."',".$p->preco.")"; } else { $sql = "UPDATE tb_produto SET descricao = '".$p->descricao."', preco=".$p->preco." WHERE cod_prod = ".$p->cod_prod; } $this->connect(); $status = $this->execute($sql); if($status==1) $msg = "Sucesso ao gravar registro."; else $msg = "Erro ao gravar registro."; ?> <script> alert('<?php echo $msg; ?>'); location="?action=grid"; </script> <?php }
105
44
produto.php
(7/7)
private function delete() { $cod_prod = $_GET['cod_prod']; $sql = "DELETE FROM tb_produto WHERE cod_prod = ".$cod_prod; $this->connect(); $status = $this->execute($sql); $msg = ($status==1) ? "Sucesso ao excluir registro." : "Erro ao excluir registro."; ?> <script> alert('<?php echo $msg; ?>'); location="?action=grid"; </script> <?php } } $p = new produto(); ?>
106
Exerccios
1. Modificar o mdulo de produto de forma que seja possvel fazer upload de fotos dos produtos. As fotos podem ficar armazenadas dentro do banco de dados (maior segurana) ou numa pasta externa (maior agilidade), vinculando-se o nome do arquivo PK do registro.
107
45
46
Exerccios
2. Criar um mdulo de controle de acesso para que somente usurios autorizados possam acessar o mdulo de produtos. O mdulo deve ser criado baseado em programao orientada a objetos.
114
Exerccios
3. Criar um mdulo para uma vitrine virtual, na qual qualquer o visitante possa consultar os produtos. Deve existir um campo para consulta por descrio e o resultado deve ser exibido com paginao.
115
47
Exerccios
4. Criar um mdulo para carrinho de compras nos moldes de uma loja virtual. O usurio poder adicionar seus produtos nesse carrinho.
116
Programao em 3 Camadas
A programao em 3 Camadas - MVC (Model, View e Controller) uma tcnica que consiste em separar a programao em trs partes responsveis por:
Exibir as informaes (view) Controlar as regras de negcio (controller) Acessar o banco de dados (model)
117
48
MVC - Funcionamento
1. A camada de Viso solicita as informaes para a camada de Controle 2. A camada de Controle aplica as regras de negcio e aciona a camada de Dados.
3. A camada de Dados acessa o Banco de Dados e retorna o resultado obtido para a camada de Controle.
Viso (View)
1 4
Controle (Controller)
2 3
Dados (Model)
4. A camada de Controle repassa os dados prontos para a camada de Viso, que finalmente exibe na tela.
118
Manuteno
O cdigo fica mais organizado
Produtividade
possvel ter mais de um programador trabalhando simultaneamente num mesmo mdulo
Reuso de cdigo
possvel substituir uma camada sem fazer modificaes nas demais. possvel ter mais de uma camada de viso compartilhando as camadas de controle e de dados.
119
49
Banco de Dados
Banco de Dados CREATE DATABASE IF NOT EXISTS db_aula; USE db_aula; Tabela CLIENTE CREATE TABLE IF NOT EXISTS tb_cliente( cod_cli integer not null auto_increment, nome varchar(80), fone varchar(20), PRIMARY KEY(cod_cli) ); Incluso de dados INSERT INTO tb_cliente(nome,fone) VALUES ('Enzo', ('Renan', ('Igor', ('Hiago', COMMIT;
120
(1/2)
<?php class cliente { function __construct() { $this->view(); } public function view() { $dados = $this->controller(); if(empty($dados)) { echo "Nenhum registro localizado!"; } else { $qtde = count($dados); for($i=0; $i<$qtde; $i++) { $r = $dados[$i]; echo $r["cod_cli"] . " | " . $r["nome"] . " | " . $r["fone"] . "<br />"; } } echo '<hr /><form>Pesquisar por: <input name="filtro"> <input type="submit" value="Buscar"></form>'; }
121
50
(2/2)
public function controller() { @$filtro = addslashes(trim($_GET['filtro'])); return $this->model($filtro); } public function model($filtro) { $link = mysql_connect("127.0.0.1", "root", ""); mysql_select_db("db_aula"); $sql = "SELECT cod_cli, nome, fone FROM tb_cliente WHERE nome LIKE '$filtro%'"; $rs = mysql_query($sql); $dados = Array(); if(!empty($rs) AND mysql_num_rows($rs)>0) { while($r = mysql_fetch_array($rs)) { $dados[] = $r; } } return $dados; } } $c = new cliente(); ?>
122
Vamos modificar a classe de clientes criando duas verses de listagem da camada de viso: web e mobile. As camadas de controle e de dados devem ser compartilhadas pelas 2 vises.
index.php (detectar o dispositivo utilizado)
123
51
Normalmente, a verso Web no tem a opo para selecionar a verso Mobile 124
index.php
<script> (screen.width<700) ? location="cliente.php?versao=mobile" : location="cliente.php?versao=web"; </script>
125
52
cliente.php
(1/3)
<link rel="stylesheet" type="text/css" href="cliente.css" /> <?php class cliente { function __construct() { @$versao = $_GET['versao']; $versao=="mobile" ? $this->viewMobile() : $this->viewWeb(); } public function viewWeb() { $dados = $this->controller(); if(empty($dados)) { echo "Nenhum registro localizado!"; } else { $qtde = count($dados); for($i=0; $i<$qtde; $i++) { $r = $dados[$i]; echo '<div class="cliente_web">#'.$r["cod_cli"]."<br />". $r["nome"]."<br />".$r["fone"].'</div>'; } }
126
cliente.php
(2/3)
echo '<form style="clear:both; text-align=center;">Pesquisar por: <input name="filtro"><input type="submit" value="Buscar"> </form>'; echo '<div class="versao_web"> <span class="disable">Web | </span> <a href="?versao=mobile">Mobile</a> </div>'; } public function viewMobile() { $dados = $this->controller(); if(empty($dados)) { echo "Nenhum registro localizado!"; } else { $qtde = count($dados); for($i=0; $i<$qtde; $i++) { $r = $dados[$i]; echo '<div class="cliente_mobile">'. $r["nome"] . '<br />' . $r["fone"] . '</div>'; } }
127
53
cliente.php
(3/3)
echo '<form>Pesquisar: <input name="filtro"> <input type="submit" value="Buscar"></form>'; echo '<div class="versao_mobile"><a href="?versao=web">Web</a> <span class="disable"> | Mobile</span>'; } public function controller() { ... } public function model($filtro) { ... } } $c = new cliente(); ?>
128
cliente.css
body { font-family: verdana, arial; color: #0033AA; } a { text-decoration: none; color: #0033AA; } .cliente_mobile { border-top: solid 1px #0033AA; border-left: solid 1px #0033AA; margin-bottom: 10px; padding: 3px; width: 300px; } .versao_mobile { border-top: solid 1px #0033AA; width: 300px; text-align: center; } .cliente_web { float: left; border: solid 1px #0033AA; margin: 5px; padding: 7px; width: 150px; height: 80px; text-align: center; background-color: #C6E2FF; } .versao_web { border-top: solid 1px #0033AA; width: 100%; text-align: center; } .disable { color: #999999; }
129
54
cliente.view.php
<?php include "cliente.controller.php"; class clienteView { public function listar() { $c = new clienteController(); $dados = $c->listar(); if(empty($dados)) { echo "Nenhum registro localizado!"; } else { $qtde = count($dados); for($i=0; $i<$qtde; $i++) { $r = $dados[$i]; echo $r["cod_cli"]." | ".$r["nome"]." | ".$r["fone"]."<br />"; } } echo '<hr /><form>Pesquisar por: <input name="filtro"> <input type="submit" value="Buscar"></form>'; } } $v = new clienteView(); $v->listar(); ?>
131
55
cliente.controller.php
<?php include "cliente.model.php"; class clienteController { public function listar() { @$filtro = addslashes(trim($_GET['filtro'])); $m = new clienteModel(); return $m->listar($filtro); } } ?>
132
cliente.model.php
<?php class clienteModel { public function listar($filtro) { $link = mysql_connect("127.0.0.1", "root", ""); mysql_select_db("db_aula"); $sql = "SELECT cod_cli, nome, fone FROM tb_cliente WHERE nome LIKE '$filtro%'"; $rs = mysql_query($sql); $dados = Array(); if(!empty($rs) AND mysql_num_rows($rs)>0) { while($r = mysql_fetch_array($rs)) { $dados[] = $r; } } return $dados; } } ?>
133
56
Para cada classe criado um mtodo listar, cada um cumprindo seu papel na respectiva camada.
134
Exerccios
1. Usando MVC, criar uma listagem de livros com os campos: cod_livro, titulo, autor e ano (de publicao). 2. Acrescentar a capa do livro na exibio da listagem. 3. Criar uma segunda viso para apresentar a listagem em dispositivos mveis. 4. Substituir a camada de dados para que seja utilizado outro SGBD no lugar do MySQL.
135
57
EXTJS
Framework para RIA (Rich Internet Applications) Biblioteca JavaScript cross-browser
Camada de Viso (MVC) Suporta diversas linguagens (integrao via JSON) Utiliza JS, XML, JSON, CSS e AJAX Interfaces baseadas em janelas e grids Licena GPL ou licena comercial (U$ 329,00)
136
Carregando o ExtJS:
<link rel="stylesheet" type="text/css" href="./extjs/resources/css/ext-all.css"> <script type="text/javascript" src="./extjs/ext-all.js"></script>
ext-all.css
contm os estilos que fazem a ligao do HTML gerado pelo ExtJS com a Skin, a qual contm inmeras linhas de estilos e ligaes com imagens.
ext-all.js
contm o cdigo de todos os componentes visuais e no visuais da biblioteca.
137
58
Banco de Dados
CREATE DATABASE IF NOT EXISTS db_aula; USE db_aula; CREATE TABLE IF NOT EXISTS tb_empresas ( codigo integer not null auto_increment primary key, empresa varchar(50), valor decimal(8,2), variacao decimal(6,2), data date, ativo integer, check(ativo in(0,1)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci AUTO_INCREMENT=11; INSERT INTO tb_empresas(codigo,empresa,valor,variacao,data,ativo) VALUES ( 1, '3m Co' , 71.72, 0.03, '2011-09-10', 1), ( 2, 'Alcoa Inc' , 29.01, 1.47, '2011-09-09', 1), ( 3, 'Altria Group Inc' , 83.81, 0.34, '2011-09-08', 0), ( 4, 'American Express Company' , 52.55, 0.02, '2011-09-07', 1), ( 5, 'American International Group, Inc.' , 64.13, 0.49, '2011-09-06', 1), ( 6, 'AT&T Inc.' , 31.61, -1.54, '2011-09-05', 1), ( 7, 'Boeing Co.' , 75.43, 0.71, '2011-09-04', 1), ( 8, 'Caterpillar Inc.' , 67.27, 1.39, '2011-09-03', 1), ( 9, 'Citigroup, Inc.' , 49.37, 0.04, '2011-09-02', 1), (10, 'E.I. du Pont de Nemours and Company', 40.48, 1.28, '2011-09-01', 1); COMMIT; 138
139
59
Criando o grid
(1/3)
<!doctype html> <html lang="pt-BR"> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="./ext-4.1.1a/resources/css/ext-all.css" /> <script src="./ext-4.1.1a/ext-all.js"></script> </head> <body> <script> Ext.onReady(function(){ Ext.define('Empresa', { extend: 'Ext.data.Model', fields: [ {name: 'codigo', type: {name: 'empresa', type: {name: 'valor', type: {name: 'variacao', type: {name: 'data', type: {name: 'ativo', type: ] });
140
Criando o grid
(2/3)
var store = Ext.create('Ext.data.Store', { model: 'Empresa', autoLoad: true, typ indica que a requisio proxy: { usar ajax. type: 'ajax', url indica o programa que ir url: 'listagem_simples.php', processar a chamada. reader: { json o formato dos dados. type: 'json', root indica que a raiz do root: 'dados' retorno chama-se dados. } } }); var grid = Ext.create('Ext.grid.Panel', { border: false, store: store, columns: [ { text: 'Cdigo', width: 60, dataIndex: 'codigo' }, { text: 'Empresa', flex: 1, dataIndex: 'empresa' }, { text: 'Valor', width: 75, dataIndex: 'valor' }, { text: 'Variao', width: 75, dataIndex: 'variacao' }, { text: 'Data', width: 85, dataIndex: 'data' }, { text: 'Situao', width: 60, dataIndex: 'ativo' } ] });
141
60
Criando o grid
(3/3)
var winGrid = Ext.create('widget.window', { title: 'Empresas', layout: 'fit', maximizable: true, collapsible: true, closable: true, closeAction: 'hide', width: 500, minWidth: 300, height: 300, items: grid }).show(); }); </script> </body> </html>
142
listagem_simples.php
<?php $link = mysql_connect("127.0.0.1", "root", ""); $db = mysql_select_db("db_aula"); $sql $rs = "SELECT codigo, empresa, valor, variacao, data, ativo FROM tb_empresas"; = mysql_query($sql); $dados = array(); while($obj = mysql_fetch_object($rs)){ $obj->empresa = utf8_encode($obj->empresa); $dados[] = $obj; } mysql_close($link); echo json_encode(array("dados" => $dados)); ?>
143
61
144
Renderizando os campos
(1/3)
columns: Vamos atualizar as colunas [{ do grid, adicionando as formataes dos campos. text: 'Cdigo', width: 60, dataIndex: 'codigo', align: 'right' },{ text: 'Empresa', flex: 1, dataIndex: 'empresa', renderer: Ext.util.Format.uppercase },{ text: 'Valor', width: 75, dataIndex: 'valor', align: 'right', renderer: function(val) { return 'R$ ' + Ext.util.Format.number(val); } },{
145
62
Renderizando os campos
(2/3)
text: 'Variao', width: 75, dataIndex: 'variacao', align: 'center', renderer: function(val) { if (val >= 0) { return '<span style="color:green;">' + val + '%</span>'; } else { return '<span style="color:red;">' + val + '%</span>'; } } },{ text: 'Data', width: 85, dataIndex: 'data', align: 'center', renderer: Ext.util.Format.dateRenderer('d/m/Y') },{
146
Renderizando os campos
(3/3)
text: 'Situao', width: 60, dataIndex: 'ativo', align: 'center', renderer: function(val){ icone = (val==1) ? './img/ativo.gif' : './img/inativo.gif'; return '<img src="' + icone + '" style="width:12px; height12px;">'; } }]
147
63
Ordenao
148
64
listagem_ordenacao.php
<?php @$sort = $_REQUEST['sort']; if(empty($sort)) { $sort->property = 'codigo'; $sort->direction = 'ASC'; } else { $sorters = json_decode(stripslashes($sort)); $sort = $sorters[0]; } $link = mysql_connect("127.0.0.1", "root", ""); $db = mysql_select_db("db_aula"); $sql = "SELECT codigo, empresa, valor, variacao, data, ativo FROM tb_empresas ORDER BY $sort->property $sort->direction"; $rs = mysql_query($sql); $dados = array(); while($obj = mysql_fetch_object($rs)){ $obj->empresa = utf8_encode($obj->empresa); $dados[] = $obj; } mysql_close($link); echo json_encode(array("dados" => $dados)); ?>
150
Paginao
151
65
listagem_paginacao.php
<?php $limit = $_REQUEST['limit']; $start = $_REQUEST['start']; $link = mysql_connect("127.0.0.1", "root", ""); $db = mysql_select_db("db_aula"); $sql = "SELECT COUNT(*) FROM tb_empresas"; $rs = mysql_query($sql); $total = mysql_result($rs,0); $sql = "SELECT codigo, empresa, valor, variacao, data, ativo FROM tb_empresas LIMIT $start, $limit";
$rs = mysql_query($sql); $dados = array(); while($obj = mysql_fetch_object($rs)){ $obj->empresa = utf8_encode($obj->empresa); $dados[] = $obj; } mysql_close($link); echo json_encode(array("dados" => $dados, "total" => $total)); ?>
153
66
154
67
listagem_filtro.php
<?php @$filtro = trim(addslashes($_REQUEST['filtro'])); $link = mysql_connect("127.0.0.1", "root", ""); $db = mysql_select_db("db_aula"); $sql = "SELECT codigo, empresa, valor, variacao, data, ativo FROM tb_empresas WHERE empresa LIKE '$filtro%'";
$rs = mysql_query($sql); $dados = array(); while($obj = mysql_fetch_object($rs)){ $obj->empresa = utf8_encode($obj->empresa); $dados[] = $obj; } mysql_close($link); echo json_encode(array("dados" => $dados)); ?>
156
Exerccio
Criar um grid para apresentar as empresas que permita ordenar, paginar e filtrar simultaneamente.
Basicamente, iremos juntar todos os recursos vistos at aqui num nico programa.
157
68
Formulrio
Muitas formataes e validaes de campos em formulrios so realizadas automaticamente pelo EXTJS.
158
formulario.php
(1/6)
locale para definir o idioma das
mensagens padres do EXTJS. <!doctype html> Ext.form.Panel o componente <html lang="pt-BR"> para criao de formulrios. <head> <meta charset="UTF-8"> <link rel="stylesheet" href="./ext-4.1.1a/resources/css/ext-all.css" /> <script src="./ext-4.1.1a/ext-all.js"></script> <script src="./ext-4.1.1a/locale/ext-lang-pt_BR.js"></script> <style> .save{background-image: url('./img/save.png')} .cancel{background-image: url('./img/cancel.png')} </style> </head> <body> <script> Ext.onReady(function(){ var form = Ext.create('Ext.form.Panel', { frame:true, bodyStyle:'padding:5px 5px 0', baseCls: 'x-plain',
159
69
formulario.php
(2/6)
fieldDefaults: { fieldDefaults valor padro para allowBlank: false, os campos do formulrio. labelAlign: 'left', allowBlank indica se o campo labelWidth: 80, pode ser vazio. msgTarget exibe as mensagens width: 200, de erro na lateral. labelSeparator: ':', hidden indica campo oculto anchor: '100%', xtype define o tipo de campo msgTarget: 'side' }, items: [{ name: 'codigo', allowBlank: true, hidden: true },{ name: 'empresa', xtype: 'textfield', fieldLabel: 'Empresa', emptyText:'Digite o nome da empresa', maxLength: 50, maxLengthText: 'A empresa deve ter no mximo 50 caracteres.' },{
160
formulario.php
},{
(3/6)
name: 'valor', xtype: 'numberfield', hideTrigger: true, fieldLabel: 'Valor' name: 'variacao', xtype: 'numberfield', value: 0, minValue: -100, maxValue: 100, allowDecimals: true, decimalPrecision: 2, step: 0.01, fieldLabel: 'Variao' },{ name: 'data', xtype: 'datefield', fieldLabel: 'Data' },{
161
70
formulario.php
(4/6)
name: 'ativo', xtype: 'checkbox', inputValue: 1, checked: true, fieldLabel: 'Situao' }] }); var winForm = Ext.create('widget.window', { title: 'Formulrio', layout: 'fit', resizable: false, modal: true, closable: true, closeAction: 'hide', width: 350, border: false, items: form, buttonAlign:'center',
162
formulario.php
(5/6)
buttons: [{ text: 'Salvar', iconCls: 'save', scale: 'medium', handler: function() { if(form.getForm().isValid()) { winForm.el.mask('Salvando...', 'x-mask-loading'); form.getForm().submit({ url: 'insert.php', method: 'POST', success: function(form, action){ Ext.Msg.alert('SUCESSO', 'Registro salvo com sucesso!'); winForm.el.unmask(); form.reset(); }, failure: function(form, action){ winForm.el.unmask(); Ext.Msg.alert('ERRO', 'Falha ao salvar registro'); } }); } }
163
71
formulario.php
(6/6)
},{ text: 'Cancelar', iconCls: 'cancel', scale: 'medium', handler: function() { form.reset(); } }] }).show(); }); </script> </body> </html>
164
insert.php
<?php @$empresa = trim(addslashes($_REQUEST['empresa'])); @$valor = $_REQUEST['valor']; @$variacao = $_REQUEST['variacao']; @$data = $_REQUEST['data']; @$ativo = empty($_REQUEST['ativo']) ? 0 : 1; if(!empty($data)) $data = "'".implode('-',array_reverse(explode('/',$data)))."'"; $link = mysql_connect("127.0.0.1", "root", ""); $db = mysql_select_db("db_aula"); $sql = "INSERT INTO tb_empresas(empresa, valor, variacao, data, ativo) VALUES('$empresa', $valor, $variacao, $data, $ativo)"; $status = mysql_query($sql); mysql_close($link); $msg = ($status==1) ? 'Sucesso ao inserir registro' : 'Erro ao inserir registro'; echo json_encode(array('success'=>$status, 'msg'=> utf8_encode($msg))); ?>
165
72
Criando um CRUD
Agora iremos juntar o grid e o formulrio, de forma que poderemos fazer as 4 operaes (select, insert, update, delete)
166
crud.php
(1/9)
<!doctype html> <html lang="pt-BR"> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="./ext-4.1.1a/resources/css/ext-all.css" /> <script src="./ext-4.1.1a/ext-all.js"></script> <script src="./ext-4.1.1a/locale/ext-lang-pt_BR.js"></script> <style> .insert{background-image: url('./img/insert.png')} .update{background-image: url('./img/update.png')} .delete{background-image: url('./img/delete.png')} .save {background-image: url('./img/save.png' )} .cancel{background-image: url('./img/cancel.png')} </style> </head> <body> <script>
167
73
crud.php
(2/9)
Ext.onReady(function(){ Ext.define('Empresa', { extend: 'Ext.data.Model', fields: [ {name: 'codigo', type: 'int'}, {name: 'empresa', type: 'string'}, {name: 'valor', type: 'float'}, {name: 'variacao', type: 'float'}, {name: 'data', type: 'date', dateFormat: 'Y-m-d'}, {name: 'ativo', type: 'boolean'} ] }); var store = Ext.create('Ext.data.Store', { model: 'Empresa', autoLoad: true, proxy: { type: 'ajax', url: 'select.php', reader: { type: 'json', root: 'dados' } } });
168
crud.php
(3/9)
var grid = Ext.create('Ext.grid.Panel', { border: false, store: store, columns: [ { text: 'Cdigo', width: 60, dataIndex: 'codigo' { text: 'Empresa', flex: 1, dataIndex: 'empresa' { text: 'Valor', width: 75, dataIndex: 'valor' { text: 'Variao', width: 75, dataIndex: 'variacao' { text: 'Data', width: 85, dataIndex: 'data' { text: 'Situao', width: 60, dataIndex: 'ativo' ], tbar: Ext.create('Ext.toolbar.Toolbar', { items: [{ text: 'Incluir', iconCls: 'insert', handler: function() { winForm.action = 'insert'; winForm.setTitle('Form [Inserindo]'); winForm.show(); form.getForm().reset(); } },{
}, }, }, }, }, }
169
74
crud.php
(4/9)
text: 'Alterar', iconCls: 'update', handler: function() { if(grid.getSelectionModel().hasSelection()){ var record = grid.getSelectionModel().getSelection(); form.getForm().loadRecord(record[0]); winForm.action = 'update'; winForm.setTitle('Form [Alterando]'); winForm.show(); }else{ Ext.Msg.alert('AVISO','Selecione o registro para alterar.'); } } },{ text: 'Apagar', iconCls: 'delete', handler: function() { if(grid.getSelectionModel().hasSelection()){ var record = grid.getSelectionModel().getSelection(); Ext.Msg.confirm( 'Ateno', 'Confirma a excluso do registro selecionado?', function(btn){ if(btn == 'yes'){
170
crud.php
(5/9)
Ext.Ajax.request({ url: 'delete.php', params: {codigo: record[0].data.codigo}, success: function(r){ var obj = Ext.decode(r.responseText); if(obj.success){ store.load(); } else{ Ext.Msg.alert('ERRO',obj.msg); } }, failure: function(){ Ext.Msg.alert('Erro no servidor.') } });
171
75
crud.php
(6/9)
var winGrid = Ext.create('widget.window', { title: 'Empresas', layout: 'fit', maximizable: true, closable: true, closeAction: 'hide', width: 500, minWidth: 300, height: 300, items: grid }).show(); var form = Ext.create('Ext.form.Panel', { frame:true, bodyStyle:'padding:5px 5px 0', baseCls: 'x-plain', fieldDefaults: { allowBlank: false, labelAlign: 'left', labelWidth: 80, width: 200, labelSeparator: ':', anchor: '100%', msgTarget: 'side' },
172
crud.php
(7/9)
items: [ { name:'codigo', xtype:'numberfield', allowBlank:true, hidden:true }, { name:'empresa', xtype:'textfield', fieldLabel:'Empresa' }, { name:'valor', xtype:'numberfield', hideTrigger:true, fieldLabel:'Valor'}, { name: 'variacao', xtype: 'numberfield', fieldLabel: 'Variao' }, { name:'data', xtype:'datefield', fieldLabel:'Data' }, { name:'ativo', xtype:'checkbox', fieldLabel:'Situao', checked:true } ] }); var winForm = Ext.create('widget.window', { title: 'Formulrio', layout: 'fit', resizable: false, modal: true, closable: true, closeAction: 'hide', width: 350, border: false, items: form, buttonAlign:'center',
173
76
crud.php
(8/9)
buttons: [{ text: 'Salvar', iconCls: 'save', scale: 'medium', handler: function() { if(form.getForm().isValid()) { winForm.el.mask('Salvando...', 'x-mask-loading'); form.getForm().submit({ url: winForm.action + '.php', method: 'POST', success: function(form, action){ Ext.Msg.alert('SUCESSO', action.result.msg); winForm.el.unmask(); form.reset(); winForm.hide(); store.reload(); }, failure: function(form, action){ winForm.el.unmask(); Ext.Msg.alert('ERRO', action.result.msg); } }); } }
174
crud.php
(9/9)
},{ text: 'Cancelar', iconCls: 'cancel', scale: 'medium', handler: function() { winForm.hide(); } }] }); }); </script> </body> </html>
175
77
select.php
<?php $link = mysql_connect("127.0.0.1", "root", ""); $db = mysql_select_db("db_aula"); $sql $rs = "SELECT codigo, empresa, valor, variacao, data, ativo FROM tb_empresas"; = mysql_query($sql); $dados = array(); if(!empty($rs) && mysql_num_rows($rs)>0) { while($obj = mysql_fetch_object($rs)){ $obj->empresa = utf8_encode($obj->empresa); $dados[] = $obj; } } mysql_close($link); echo json_encode(array("dados" => $dados)); ?>
176
insert.php
<?php @$empresa = trim(addslashes($_REQUEST['empresa'])); @$valor = $_REQUEST['valor']; @$variacao = $_REQUEST['variacao']; @$data = $_REQUEST['data']; @$ativo = empty($_REQUEST['ativo']) ? 0 : 1; if(!empty($data)) $data = "'".implode('-',array_reverse(explode('/',$data)))."'"; $link = mysql_connect("127.0.0.1", "root", ""); $db = mysql_select_db("db_aula"); $sql = "INSERT INTO tb_empresas(empresa, valor, variacao, data, ativo) VALUES('$empresa', $valor, $variacao, $data, $ativo)"; $status = mysql_query($sql); mysql_close($link); $msg = ($status==1) ? 'Sucesso ao inserir registro' : 'Erro ao inserir registro'; echo json_encode(array('success'=>$status, 'msg'=> utf8_encode($msg))); ?>
177
78
update.php
<?php @$codigo = $_REQUEST['codigo']; @$empresa = trim(addslashes($_REQUEST['empresa'])); @$valor = $_REQUEST['valor']; @$variacao = $_REQUEST['variacao']; @$data = $_REQUEST['data']; @$ativo = empty($_REQUEST['ativo']) ? 0 : 1; if(!empty($data)) $data = "'".implode('-',array_reverse(explode('/',$data)))."'"; $link = mysql_connect("127.0.0.1", "root", ""); $db = mysql_select_db("db_aula"); $sql = "UPDATE tb_empresas SET empresa='$empresa',valor=$valor,variacao=$variacao,data=$data,ativo=$ativo WHERE codigo = $codigo"; $status = mysql_query($sql); mysql_close($link); $msg = ($status==1) ? 'Sucesso ao inserir registro' : 'Erro ao inserir registro'; echo json_encode(array('success'=>$status, 'msg'=> utf8_encode($msg))); ?>
178
delete.php
<?php @$codigo = $_REQUEST['codigo']; $link = mysql_connect("127.0.0.1", "root", ""); $db = mysql_select_db("db_aula"); $sql = "DELETE FROM tb_empresas WHERE codigo = $codigo"; $status = mysql_query($sql); mysql_close($link); $msg = ($status==1) ? 'Sucesso ao apagar registro' : 'Erro ao apagar registro'; echo json_encode(array('success'=>$status, 'msg'=> utf8_encode($msg))); ?>
179
79
Ajustes no EXTJS
// SELECT var store = Ext.create('Ext.data.Store', { model: 'Empresa', autoLoad: true, proxy: { type: 'ajax', url: 'empresa.php', extraParams: { action: 'select' }, ...
// DELETE Ext.Ajax.request({ url: 'empresa.php', params: {codigo: record[0].data.codigo, action: 'delete'}, ...
181
80
empresa.php
<?php class empresa {
(1/5)
function __construct() { mysql_connect("127.0.0.1", "root", ""); mysql_select_db("db_aula"); @$action = $_REQUEST['action']; if($action=='select') $this->select(); else if($action=='insert') $this->insert(); else if($action=='update') $this->update(); else if($action=='delete') $this->delete(); } function __destruct() { mysql_close(); }
182
empresa.php
private function select() {
(2/5)
$sql = "SELECT codigo, empresa, valor, variacao, data, ativo FROM tb_empresas"; $rs = mysql_query($sql); $dados = array(); if(!empty($rs) AND mysql_num_rows($rs)>0) { while($obj = mysql_fetch_object($rs)){ $obj->empresa = utf8_encode($obj->empresa); $dados[] = $obj; } } echo json_encode(array("dados" => $dados)); }
183
81
empresa.php
private function insert() {
(3/5)
@$empresa = trim(addslashes($_REQUEST['empresa'])); @$valor = $_REQUEST['valor']; @$variacao = $_REQUEST['variacao']; @$data = $_REQUEST['data']; @$ativo = empty($_REQUEST['ativo']) ? 0 : 1;
if(!empty($data)) $data = "'".implode('-',array_reverse(explode('/',$data)))."'";
$sql = "INSERT INTO tb_empresas(empresa, valor, variacao, data, ativo) VALUES('$empresa', $valor, $variacao, $data, $ativo)"; $status = mysql_query($sql); $msg = ($status==1) ? 'Sucesso ao inserir registro' : 'Erro ao inserir registro'; echo json_encode(array('success'=>$status, 'msg'=> utf8_encode($msg))); }
184
empresa.php
(4/5)
private function update() { @$codigo = $_REQUEST['codigo']; @$empresa = trim(addslashes($_REQUEST['empresa'])); @$valor = $_REQUEST['valor']; @$variacao = $_REQUEST['variacao']; @$data = $_REQUEST['data']; @$ativo = empty($_REQUEST['ativo']) ? 0 : 1;
if(!empty($data)) $data = "'".implode('-',array_reverse(explode('/',$data)))."'";
$sql = "UPDATE tb_empresas SET empresa='$empresa', valor=$valor, variacao=$variacao, data=$data, ativo=$ativo WHERE codigo = $codigo"; $status = mysql_query($sql); $msg = ($status==1) ? 'Sucesso ao atualizar registro' : 'Erro ao atualizar registro'; echo json_encode(array('success'=>$status, 'msg'=> utf8_encode($msg))); }
185
82
empresa.php
(5/5)
private function delete() { @$codigo = $_REQUEST['codigo']; $sql = "DELETE FROM tb_empresas WHERE codigo = $codigo"; $status = mysql_query($sql); $msg = ($status==1) ? 'Sucesso ao apagar registro' : 'Erro ao apagar registro'; echo json_encode(array('success'=>$status, 'msg'=> utf8_encode($msg))); } } new empresa(); ?>
186
Esta proposta unifica as vantagens de cada padro, gerando um modelo organizado, robusto e de alta produtividade.
187
83
coreView.js
empresaView.js
coreController.php
empresaController.php
coreModel.php
empresaModel.php
188
189
84
coreView.js
Ext.require([ 'Ext.grid.*', 'Ext.data.*', 'Ext.form.*' ]);
(1/4)
Ext.define('Ext.grid.coreView', { extend: 'Ext.util.Observable', constructor: function(){ this.callParent(); Ext.QuickTips.init(); Ext.BLANK_IMAGE_URL = '../img/s.gif'; this.initStore(); this.initGrid(); },
190
coreView.js
(2/4)
initStore: function() { Ext.define('Ext.grid.Model', { extend: 'Ext.data.Model', fields: this.fields }); this.store = Ext.create('Ext.data.Store', { model: 'Ext.grid.Model', autoLoad: true, proxy: { type: 'ajax', url: this.url, actionMethods: 'POST', extraParams: { action: 'select' }, reader: { type: 'json', root: 'dados' } } }); },
191
85
coreView.js
(3/4)
initGrid: function() { this.tbar = Ext.create('Ext.toolbar.Toolbar', { items: [ '->', 'Pesquisar por: ', { id: this.filterId, xtype: 'textfield', width: 100, scope: this },{ text:'Filtrar', iconCls: 'filter', handler: this.filter, scope: this }] }); this.grid = Ext.create('Ext.grid.Panel', { border: false, store: this.store, columns: this.columns });
192
coreView.js
(4/4)
this.winGrid = Ext.create('widget.window', { title: this.title, items: this.grid, layout: 'fit', maximizable: true, closable: true, closeAction: 'hide', width: this.width ? this.width : 500, height: this.height ? this.height : 300, minWidth: 300, minHeight: 200, tbar: this.tbar }); }, filter: function() { this.store.reload({ params: { filter: Ext.getCmp(''+this.filterId+'').getValue() } }) } });
193
86
coreController.php
<?php class coreController { function getString($field) { return @trim(addslashes($_REQUEST[$field])); } } ?>
194
coreModel.php
<?php class coreModel { private $ip private $user private $pwd private $db = = = = "127.0.0.1"; "root"; ""; "db_aula";
(1/2)
function __construct() { @mysql_connect($this->ip, $this->user, $this->pwd); @mysql_select_db($this->db); } function __destruct() { @mysql_close(); } public function query($sql) { return mysql_query($sql); }
195
87
coreModel.php
(2/2)
public function num_rows($rs) { $r = mysql_num_rows($rs); return $r; } public function fetch_object($rs) { return mysql_fetch_object($rs); } public function select_all($sql) { $rs = $this->query($sql); $total = empty($rs) ? 0 : $this->num_rows($rs); $dados = null; if(!empty($rs) AND ($total>0)) { while($r = $this->fetch_object($rs)) { $dados[] = array_map('utf8_encode',(array) $r); } } return $dados; } } ?>
196
88
empresaView.js
(1/3)
Ext.define('Ext.grid.empresaView', { extend: 'Ext.grid.coreView', url: './empresaController.php', title: 'Gerenciar Empresas', filterId: 'filterEmpresa', fields: [ {name: 'codigo', type: 'int'}, {name: 'empresa', type: 'string'}, {name: 'valor', type: 'float'}, {name: 'variacao', type: 'float'}, {name: 'data', type: 'date', dateFormat: 'Y-m-d'}, {name: 'ativo', type: 'bool'} ], columns: [{ text: 'Cdigo', width: 60, align: 'right', dataIndex: 'codigo' },{ text: 'Empresa',
198
empresaView.js
},{
(2/3)
flex: 1, dataIndex: 'empresa', renderer: Ext.util.Format.uppercase text: 'Valor', width: 75, align: 'right', dataIndex: 'valor', renderer: function(val) { return 'R$ ' + Ext.util.Format.number(val); } },{ text: 'Variao', width: 75, align: 'center', dataIndex: 'variacao', renderer: function(val) { if (val >= 0) { return '<span style="color:green;">' + val + '%</span>'; } else {
199
89
empresaView.js
} } },{
(3/3)
text: 'Data', width: 85, dataIndex: 'data', align: 'center', renderer: Ext.util.Format.dateRenderer('d/m/Y') },{ text: 'Situao', width: 60, dataIndex: 'ativo', align: 'center', renderer: function(val){ classe = (val==1) ? 'active' : 'inactive'; return '<div class='+classe+'></div>'; } }] });
200
empresaController.php
<?php require_once('coreController.php'); require_once('empresaModel.php'); class empresaController extends coreController { function __construct() { @$action = $_REQUEST['action']; if($action=='select') $this->select(); } private function select() { $filter = $this->getString('filter'); $m = new empresaModel(); $dados = $m->select($filter); echo json_encode(array('dados' => $dados)); } } new empresaController(); ?>
201
90
empresaModel.php
<?php require_once('coreModel.php'); class empresaModel extends coreModel { function __construct() { parent::__construct(); } public function select($filter) { $sql = "SELECT codigo, empresa, valor, variacao, data, ativo FROM tb_empresas WHERE empresa LIKE '$filter%'"; return $this->select_all($sql); } } ?>
202
203
91
Elaborar um sistema para troca de mensagens on-line entre usurios. Para ter acesso ao sistema, o usurio dever realizar login. Qualquer usurio poder se cadastrar. O sistema deve permitir o envio de mensagens sempre direcionadas a um outro usurio. O usurio poder visualizar tanto suas mensagens enviadas, quando as suas mensagens recebidas.
204
Troca de Mensagens
(cont.)
205
92
Troca de Mensagens
(cont.)
CREATE DATABASE IF NOT EXISTS db_aula; USE db_aula; CREATE TABLE IF NOT EXISTS tb_usuario( id integer not null primary key auto_increment, nome varchar(40) not null UNIQUE, senha varchar(40) not null ); CREATE TABLE IF NOT EXISTS tb_mensagem( id integer not null primary key auto_increment, remetente integer not null, destinatario integer not null, mensagem varchar(140), data_hora datetime, foreign key(remetente) references tb_usuario(id), foreign key(destinatario) references tb_usuario(id) );
206
Trabalho
(1/4)
Elaborar um mdulo de controle de acesso, no qual seja necessrio informar o nome e a senha para ter acesso ao sistema. Novos usurios tambm podero se cadastrar, mas no se deve aceitar nome de usurio repetido.
207
93
Trabalho
(2/4)
Ao entrar no sistema, deve-se exibir 2 abas para mensagens recebidas e enviadas. Na aba Enviadas, deve-se exibir todas as mensagens postadas pelo usurio ordenando pelas mensagens mais recentes.
208
Trabalho
(3/4)
O boto Nova deve abrir um formulrio para envio de uma nova mensagem. O campo para do formulrio deve ser carregado com um combo com todos os usurios cadastrados, exceto o prprio usurio conectado.
209
94
Trabalho
(4/4)
Na aba Recebidas, deve-se listar todas as mensagens recebidas, ordenadas pelas mais recentes. O boto Atualizar deve verificar novas mensagens. E a opo Atualizao automtica dever atualizar a tela a cada 5 minutos.
210
Bibliografia
Livro Texto: 1. PHP 4: A Bblia; Converse, Tim et al; Ed. Campus; 1 edio; 2001; 5 exemplares. 2. Use a Cabea: PHP e MySQL; Beighley, Linn; Ed. Alta Books; 1 edio; 2010; 10 exemplares. 3. Ajax (ASYNCHRONOUS JAVASCRIPT AND XML); Soares, Walace; Ed. rica; 1 edio; 2006; 10 exemplares. Complementar: 4. Profissional PHP: Programando; Castagneto, Jesus et al; Ed. Makron Books; 1 edio; 2001; 1 exemplar. 5. PHP e MySQL: Desenvolvimento Web; Welling, Luke et al; Ed. Campus; 1 edio; 2001; 1 exemplar. 6. Programando em PHP: Conceitos e Aplicaes; Soares, Walace; Ed. rica; 1 edio; 2000; 5 exemplares. 7. Fundamentos de PHP; Meloni, Julie C.; Ed. Cincia Moderna; 1 edio; 2000; 5 exemplares. 8. Guia de Consulta Rpida: Integrando PHP com MySQL; Stoco, Lucio M.; Ed. Novatec; 1 edio; 2000; 5 exemplares.
211
95