Você está na página 1de 12

Criando um CRUD com FormDin

Pgina 1

O objetivo deste exemplo criar uma aplicao utilizando a framework FormDin, que
permita fazer a manuteno completa em uma tabela, ou seja, ncluso, !onsulta, "lterao e
a #xcluso de re$istros, o que c%amamos de !&'D ( !reate )criar*, &etrieve )recuperar*,
'pdate )atualizar* e Delete )excluir*+

"consel%o ler o ,anual de nstalao e fazer a instalao do FormDin antes de
comear com este exerc-cio+

O Projeto

O projeto consistir. em criar um cadastro de ve-culos e um relat/rio em pdf, com os
se$uintes campos0

a1 2laca 3 campo 4exto com ,.scara1
b1 5ome 3 campo 4exto 1
c1 ,arca 3 campo 4exto 1
d1 ,odelo 3 campo 4exto 1
e1 "no Fabricao 3 campo nteiro 1
f1 !or 3 campo 4exto 1
$1 6alor 3 campo 5umrico 1
%1 Data "quisio 3 campo Data 1
i1 Observao 3 campo ,emo 1

O banco de dados utilizado ser. o 789ite :, devido a sua simplicidade e no precisar
de instalao , e todos podero executar o exemplo sem problemas+

A Aplicao

" aplicao ser. c%amada de 7istema de !adastro de 6e-culos ; 7!"6, dever.
possuir um menu principal com as se$uintes op<es0 !adastro (= 6e-culo e &elat/rios (=
6e-culo, bem simples mesmo+
Dividiremos a aplicao em > etapas, e poderei explicar mel%or cada uma delas+

?@1 !onfi$urao da "plicao 34"pplication1A
B@1 !onfi$urao da !onexo com banco de dados 342DO!onnection1A
:@1 !riao do ,enu 2rincipal 3 4D%tmlx,enu 1A
C@1 !riao do formul.rio de cadastro de ve-culos 3 4Form 1 e
>@1 !riao do relat/rio utilizando a classe 42DF que uma extenso da classe fpdf+

#nto vamos l.+

1 Passo ; !riao da "plicao
( crie o arquivo indexp!p" que ser. o nosso controlador respons.vel pela criao da interface
da aplicao e o tratamento das requisi<es+
( crie um diret/rio c%amado sica#$ no diret/rio htdocs ou www do apac%e ou onde desejar, de
forma que ele seja acessado pelo nave$ador atravs do apac%e+ 5o meu exemplo criarei dentro
do diret/rio c0DxamppD%tdocs, ficando min%a url de acesso %ttp0EElocal%ostEsicavE
Criando um CRUD com FormDin



Pgina 2

(crie no diret/rio sica#$ o subdiret/rio %ancoDados$ e utilizando qualquer &D' para o ()*ite,
aqui estou utilizando a (+*ite Admin 3 %ttp0EEsqliteadmin+orbmuBk+deE 1, crie um banco de
dados c%amado %dCruds,d% e tambm a tabela t%-#eiculo conforme o script abaixo0

CREATE TABLE [tb_veiculo] (
[id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[placa] varchar(8) UNIQUE NOT NULL,
[nome] varchar(100) NOT NULL,
[marca] varchar(30) NULL,
[modelo] varchar(30) NULL,
[ano] integer NULL,
[cor] varchar(20) NULL,
[valor] numeric(10,2) NULL,
[aquisicao] date NULL,
[observacao] text NULL
)

Dentro do diret/rio sica#$, crie um arquivo c%amado indexp!p com o se$uinte c/di$o0

<?php
require_once('../base/classes/webform/TApplication.class.php');
$app = new TApplication('Sistema de Cadastro de Veculos','Exemplo CRUD com
FormDin','SICAV','Equipe de Desenvolvimento');

// cololcar a logo do formdin como marca dagua
$app->setWaterMark('imagens/formdin.png');

// vou fazer algumas alteraes na interface s para enriquecer o exemplo at a
documentao da classe TApplication ficar pronta

//trocar a imagem de fundo ( papel de parede )
$app->setBackgroundImage('imagens/px.gif');

// trocar a imagem de fundo do cabealho;
$app->setHeaderBgImage('imagens/fundo_cabecalho.png');

// adicionar o menu principal
$app->setMainMenuFile('includes/menu_principal.php');

// trocar o tema do menu
$app->setMenuTheme("modern_blue");

// testar a conexo com o banco de dados
//TPDOConnection::test(); // se tiver ok dever aparecer no navegaro: Conexo com
SQLITE est Ok!!!!

$app->run();
?>

. Passo / !onfi$urao da conexo
"ntes de executarmos o c/di$o acima, vamos confi$urar e testar a conexo com o banco de
dados 7q9ite+
( crie outro subdiret/rio c%amado includes$ dentro de sica#$ e dentro dele o arquivo
con0i1-conexaop!p+ #ste o subdiret/rio e o arquivo que a classe 2PDOConnection -r.
procurar quando for solicitada al$uma operao com banco de dados+
Criando um CRUD com FormDin



Pgina 3

( adicione o se$uinte c/di$o0

define('BANCO','SQLITE');
define('DATABASE','bancoDados/bdCrud.s3db');
define('UTF8_DECODE',0);

( deixe a lin%a TPDOConnection::test(); do arquivo indexp!p descomentada e execute a
aplicao+ 7e estiver utilizando o linux, certifique(se de que o "pac%e tem permisso de
leitura nos diret/rios e subdiret/rios da aplicao e tambm de escrita nos subdiret/rios dao/ e
base/tmp.
( se tudo estiver correto dever. aparecer no nave$ador a mensa$em abaixo0
Conexo com (+*&2' est3 O45555
( comente novamente a lin%a //TPDOConnection::test(); do index+p%p, para remover o teste
de conexo, e a aplicao ser executada normalmente+

, Passo 6 !riao do ,enu 2rincipal+
2ara criarmos o menu principal, crie um arquivo c%amado menu_principal.php dentro do
subdiret/rio includesE com o se$uinte c/di$o0

<?php
$menu = New TMenuDhtmlx();
$menu->add(1,0,'Cadastro',null,null,'folderAzul.gif');
$menu->add(11,1,'Veculos','cad_veiculo',null,'folderAzulOpen.gif');
$menu->add(2,0,'Relatrios',null,null,'print16.gif');
$menu->add(21,2,'Veculos','rel_veiculo',null,'print16.gif');
$menu->add(9,0,'Gerador DAO/VO','base/includes/gerador_vo_dao.php');
$menu->getXml();
/**
* Observaes:
* As imagens utilizadas no menu esto no diretrio base/imagens. Para utilizar
* imagens de outro diretrio, configure o caminho que dever ser utilizado
* no index.php com o seguinte comando: $app->setMenuIconsPath('caminho/');
*
* A criao do menu muito simples sendo:
* id do item
* id do pai
* titulo
* hint
* imagem
* etc...
* Para a criao da hierarquia manualmente eu utilizei os ids como se fosse uma
lista numerada sem os pontos.
* Assim:
* item 1 = 1
* item 1.1 = 11
* item 2 = 2
* item 2.1 = 21
*/
?>

7 Passo / !riao do formul.rio de cadastro de ve-culos+
( crie o subdiret/rio modulos$ e dentro dele outro subdiret/rio com o nome cad-#eiculo$+ #sta
a estrutura su$erida para or$anizarmos a aplicao por m/dulos+ !ada m/dulo tem seu
subdiret/rio com seus respectivos arquivos p!p" css" js entre outros+ 4oda vez que o m/dulo
Criando um CRUD com FormDin



Pgina 4

for c%amado, a classe 2Form procurar. pelos arquivos js e css com o mesmo nome do
m/dulo trocando a extenso para js e css, se existirem, sero adicionados automaticamente F
p.$ina+ Outros arquivos js e css podem ser adicionados sempre que necess.rios atravs dos
mtodos0 add8sFile9:xxxjs;< e addCssFile9:xxxcss;< da classe 2Form
( crie o arquivo cad-#eiculop!p dentro do diret/rio m=dulos$cad-#eiculo$+ "dicione o
c/di$o abaixo salve o arquivo, execute a aplicao e clique na opo do menu0
Cadastro6>?e@culo

<?php
$frm = new TForm('Cadastro de Viculos');
$frm->show();
?>

" tela abaixo dever. aparecer0



( iremos adicionar os campos ao formul.rio+ 2ara enriquecer o exemplo e explorar os recursos
do FormDin, dividiremos o formul.rio em duas abas, sendo a primeira aba c%amada de
Cadastro e a se$unda aba de *ista1em+ 5a primeira colocaremos os campos e na se$unda
uma 1ride que permita listar os ve-culos j. cadastrados e com as a<es de "lterar ou #xcluir
um ve-culo em cada lin%a+

Criando um CRUD com FormDin



Pgina 5

( retornemos ao c/di$o fonte do arquivo cad-#eiculop!p e altere para que fique com as
se$uintes lin%as0 3o que est. em ne$rito o que foi adicionado ao c/di$o j. existente 1

<?php
$frm = new TForm('Cadastro de Viculos');


// adicionar o campo hidden para a coluna chave da tabela.
$frm->addHiddenField('id');

// adicionando abas ao formulrio
$pc $frm->add!a"e#ontrol('pc'); // criar inst$ncia do controlador de p"inas
// adicionar a pa"ina %#adastro%
$pc->add!a"e('#adastro'&true&true&'aba#adastro'); // a partir da'ui& tudo 'ue for
adicionado ao form ficar dentro da aba at( encontrar o metodo close)roup();
// adicionar os campos na aba cadastro
$frm->add*as+Field('placa'&',- da !laca.'&true&'aaa-////');
$frm->add0e1tField('nome'&',ome.'&233&true&43);
$frm->add0e1tField('marca'&'*arca.'&53);
$frm->add0e1tField('modelo'&'*odelo.'&53&false&null&null&false);
$frm->add,umberField('ano'&'6no.'&7&false&3);
$frm->add0e1tField('cor'&'#or.'&83&null&null&null&false);
$frm->add,umberField('valor'&'9alor :$.'&23&false&8);
$frm->add;ateField('a'uisicao'&';ata 6'uisi<=o.'&false);
$frm->add*emoField('observacao'&'>bserva<?es.'&8333&false&@3&7);
$frm->addAutton('Balvar'&'salvar'&'btnBalvar'&null&null&true&false);
$frm->addAutton('Cimpar'&'limpar'&'btnCimpar'&null&null&false&false);
// para e1emplificar o uso do campo html e da inclus=o de um ar'uivo css
e1terno
$frm->addHtmlField('mensa"em'&'Dbr>Dcenter>Db>Dspan
class%Fonte9ermelha%>#ampos em vermelho s=o de preenchimento
obri"atErioD/span>D/b>D/center>');

// adicionar a aba Cista"em
$pc->add!a"e('Cista"em');

$frm->addHtmlField('htmlF"ride'&'6'ui ser carre"ado o "ride');


// processar as a<?es do diretErio action/
$frm->process6ction();

// criar<=o do "ride
$" neG 0)rid(
'"d' // id do "ride no html
&'Cista"em dos 9eHculos' // titulo do "ride
&0bFveiculo;6>..select6ll('nome') // arraI de dados
&null
&null
&'J;'); // chave da tabela);

// adicionando o obKeto ao campo html criado acima
$frm->set('htmlF"ride'&$"); // ou $frm->"etField('"ride')->add($");

// e1ibir o formulrio
$frm->show();
?>

( execute novamente a aplicao ou atualize a p.$ina do nave$ador 3F>1, se j. estiver com a
aplicao executando+
" tela deve ser a se$uinte0

Criando um CRUD com FormDin



Pgina 6



( devemos fazer o tratamento das a<es dos bot<es 7alvar e 9impar+ 4oda ao executada no
formul.rio, deve %aver um arquivo de mesmo nome no subdiret/rio action$ do m/dulo,
portanto, vamos cria(lo como modulos$cad-#eiculo$action e dentro dele crie um arquivo
c%amado sal#arp!p e outro limparp!p, conforme definimos no parGmetro AstrAction do
mtodo A0rm6>addButton3 H7alvarH ,Csal#arC, +++1 e A0rm6>addButton3 H7alvarH ,ClimparC, +++1+
7e estiver utilizando o linux, lembre(se de verificar os direitos de acesso para o apac%e, a
sempre que criar um diret/rio ou arquivo+
( antes de prosse$uirmos com a codificao, criaremos as classes DAO e ?O da tabela
t%-#eiculos, que sero as respons.veis pelas opera<es de consulta, incluso e excluso na
tabela, !aso no esteja familiarizado com o padro D"OE6O acesse
%ttp0EEp%pbr+wordpress+comEBIIJEIBEIKEabstracao(de(base(de(dados(utilizando(daoE e faa
uma leitura+
( no diret/rio %ase$includes existe um arquivo c%amado 1erador-#o-daop!p para $erar o
c/di$o fonte destas duas classes com os mtodos b.sicos para nosso CRUD+
( adicionaremos este arquivo em nosso menu principal para que possamos execut.(lo+
( no arquivo includes$menu-principalp!p, adicione a se$uinte lin%a antes do comando
$menu->getXml();.
+++
$menu->add(9,0,'Gerador DAO/VO','base/includes/gerador_vo_dao.php');
+++

( atualize a p.$ina no nave$ador 3F>1, e dever. aparecer o item Derador DAO$?O, conforme
a ima$em do menu abaixo0



Criando um CRUD com FormDin



Pgina 7

( clique na opo Derador DAO$?O para exibir a tela abaixo+

0

( 6amos preenc%L(la assim0
a1 diret/rio no precisa alterar deixe com0 dao$
b1 nome da tabela0 t%-#eiculo
c1 nome da coluna c%ave0 id
d1 colunas0 id"placa"nome"marca"modelo"ano"cor"#alor"a)uisicao"o%ser#acao
Os nomes das colunas tambm podem ser informados, um em baixo do outro, utilizando
o Menter= como delimitador e retirando as vir$ulas+
( ap/s preenc%imento dos campos, clique no boto Nerar e a$uarde a mensa$em F,+ Fec%e a
tela e verifique se no subdiret/rio sica#$dao foram criados os arquivos0
2%-#eiculoDAOclassp!p e 2%-#eiculo?Oclassp!p+
( caso ocorra al$um problema, verifique os direitos de acesso para o apac%e nos diret/rios e
arquivos+ 4ente criar o subdiret/rio sica#$dao manualmente e dar os direitos de escrita e
leitura para o apac%e+
Criando um CRUD com FormDin



Pgina 8

( a$ora prosse$uiremos com a codificao das a<es+ "bra o arquivo action$sal#arp!p e
adicione o se$uinte c/di$o0

<?php
$vo = new Tb_veiculoVO();
/**
como os campos do formulrio possuem o mesmo nome dos campos da tabela, podemos
utilizar o mtodo setVo() da classe TForm para carregar o objeto vo com os valores
do dos campos do formurio, caso contrrio teramos que utilziar
os mtodos sets do objeto vo para cada campo. Exemplo:
$vo->setId($frm->get('id'));
$vo->setPlaca($frm->get('placa'));
$vo->setNome($frm->get('nome'));
...
*/
$frm->setVo($vo);

// Gravando o dado no banco de dados
if( tb_veiculoDAO::insert($vo) )
{
$frm->setMessage('Veculo salvo com SUCESSO!');
// chamar a ao limpar para limpar os campos aps a gravao
include('limpar.php');
}
else
{
$frm->addError(Tb_veiculoDAO::getError());
}
?>

( abra o arquivo action$limparp!p e adicione o se$uinte c/di$o0

<?php
// limpar todos os campos do formulrio.
$frm->clearFields();
?>

( vamos testar a incluso+ #xecute a aplicao e faa o cadastro de um ve-culo+ 7e estiver tudo
funcionando corretamente, ap/s clicar no boto 7alvar, a se$uinte mensa$em de confirmao
dever. aparecer0


Criando um CRUD com FormDin



Pgina 9

( pr/ximo passo ser. fazer a lista$em dos ve-culos na aba 9ista$em, com as a<es de "lterar
ou #xcluir+

( para criarmos a lista$em, vamos utilizar a classe 2Drid do FormDin+ #sta classe possui
tantas funcionalidades, que ter. um manual s/ para ela, mas a sua utilizao muito simples+

( abra o arquivo cad-#eiculop!p e lo$o ap/s a lin%a A0rm6>processAction9< adicione o
c/di$o abaixo, para criao do 1ride e exibio na p.$ina+

// criao do gride
$g = new TGrid(
'gd' // id do gride no html
,'Listagem dos Veculos' // titulo do gride
,Tb_veiculoDAO::selectAll('nome') // array de dados
,null
,null
,'ID'); // chave da tabela
// adicionando o objeto gride ao campo html criado acima, dentro da aba Listagem
$frm->set('html_gride',$g); // ou tambm, $frm->getField('gride')->add($g);

( atualize a p.$ina e clique na aba 9ista$em+ 7e j. existir dados na tabela, o 1ride dever.
aparecer conforme a tela abaixo, com seus dados0


( por padro, a classe 2Dride utiliza os nomes como t-tulo das colunas e os bot<es de alterar
e excluir+ 2ode ser utilizado o mtodo addColumn9< para definir a lar$ura, titulo entre outros,
de cada coluna, bem como addButton9< para adicionar bot<es+
( como o 1ride criou dois bot<es que $eram a<es para nosso formul.rio, precisamos tratar
estas a<es, que foram denominadas por padro0 id do 1ride E;-;E alterar e id do 1ride E
:-;Eexcluir, assim como definimos o id do $ride i$ual a H$dH A1 F neG 2Drid9C1dC" <, as
a<es a serem tratadas na pasta action$ sero0 1d-alterar e 1d-excluir+
Criando um CRUD com FormDin



Pgina
10

( crie o arquivo modulos$cad-#eiculo$action$1d-alterarp!p e adicione o se$uinte c/di$o0

<?php
// recuperar o veculo pelo id selecionado no gride
$dados = Tb_veiculoDAO::select($frm->get('id'));

// atualizar os campos do form com os dados do veculo
$frm->update($dados);

/* Obeservao:
como os nomes dos campos da tabela so os mesmos do formulrio
podemos utilizar o mtodo $frm->update($dados); caso contrrio
teramos que fazer campo a campo. Exemplo:
$frm->set('id',$dados['ID'][0]);
$frm->set('placa',$dados['PLACA'][0]);
$frm->set('nome',$dados['NOME'][0]);
...
*/

// definir a aba inicial para a aba Cadastro
$frm->getField('pc')->setActivePage('abaCadastro',true);
?>

( crie o arquivo modulos$cad-#eiculo$action$1d-ecluirp!p e adicione o se$uinte c/di$o0

<?php
Tb_veiculoDAO::delete($frm->get('id'));
?>

H Passo ( !riao do relat/rio utilizando a classe 42DF
4erminamos aqui o nosso CRUD" podemos a$ora fazer a nosso relat/rio em PDF com
a lista$em dos ve-culos+
( dentro do diret/rio modulos$ crie o subdiret/rio rel-#eiculo$ e dentro dele o arquivo
rel-#eiculop!p com o se$uinte c/di$o0

<?php
$frm = new TForm('Relatrio de Veculos',200);

// adicionar um grupo com 60px na primeira coluna virtual para os inputs ficarem
mais prximos dos rtulos
$frm->addGroupField('gpFiltro','Condio')->setColumns(60);
$frm->addTextField('marca','Marca:',30);
$frm->addNumberField('ano','Ano:',4,null,0);
$frm->closeGroup();

$frm->addButton('Visualizar',null,'btnVisualizar','gerarPdf()','Confirma a Criao
do Relatrio ?');

// processar a acao criar_pdf
$frm->processAction();

// exibir o formulrio
$frm->show();
?>
<script>
function gerarPdf()
{
// abrir janela modal para exibir o pdf dentro de um iframe
fwShowPdf({"titulo":"Listagem de
Veculos","acao":"criar_pdf","ano":"","marca":""} );
}
</script>
Criando um CRUD com FormDin



Pgina
11

( em se$uida crie o subdiret/rio action$ dentro do subdiret/rio modulos$rel-#eiculo$ e dentro
dele o arquivo criar-pd0p!p, esta ser. nossa ao para $erar o pdf+ "dicione o c/di$o
abaixo0

<?php
// vou fazer um exemplo de como executar uma comando sql diretamente na camada de
viso
// sem passar pela camada model. No faam isso, somente para exemplificar.
// O correto ser criar o mtodo relatorio(), por exemplo, no
// arquivo dao/Tb_veiculoDAO.class.php que retorna o array de dados

$sql = "select * from tb_veiculo where id > 0 ";
$parametros=array();
if( $_REQUEST['ano'] )
{
$sql.=' and ano = ?';
$parametros[] = $_REQUEST['ano'];
}
if( $_REQUEST['marca'] )
{
$sql.=" and upper(marca) like ?"; // para pesquisar pela marca em caixa alta
e baixa e em qualquer posio
$parametros[] = '%'.strtoupper($_REQUEST['marca']).'%';
}
// executa a consulta
$dados = TPDOConnection::executeSql($sql,$parametros);

if( !$dados )
{
echo '<h3><center>Nenhum veculo encontrado!</center></h3>';
die();
}
// criao do objeto pdf
$pdf = new TPDF('L');

// a classe TPDF procura pela funo cabecalho() e se existir ser executada
recebendo a instncia da classe TPDF
function cabecalho($pdf)
{
$pdf->setFont('','B',14);
$pdf->cell(0,5,'Sistema de Cadastro de Veculos - V-1.0',0,1,'C');
$pdf->setFont('','B',12);
$pdf->cell(0,5,'Listagem dos Veculos',0,1,'C');
$pdf->ln(1);
$pdf->setFont('','',10);
$criterio = '';
if( $_REQUEST['ano'] )
{
$criterio = 'Ano = '.$_REQUEST['ano'];
}
if( $_REQUEST['marca'] )
{
$criterio = ( ($criterio=='') ? '' : ' e ' );
$criterio .= 'Marca contem:'.$_REQUEST['marca'];
}
$criterio = ( ($criterio=='') ? 'Todos os veculos' : $criterio );
$pdf->cell(0,5,'Critrio de consulta: '.$criterio,0,1,'L');
$pdf->ln(1);
}

// a classe TPDF procura pela funo rodape() e se existir ser executada recebendo
a instncia da classe TPDF
function rodape($pdf)
{
$pdf->setY($pdf->h-10);
$pdf->cell(50,5,'Emisso: '.date('d/m/Y h:i:s') ,'T',0,'L');
$pdf->cell(0,5,'Pgina: '.$pdf->PageNo().' de {nb}' ,'T',0,'C');
Criando um CRUD com FormDin



Pgina
12

}

// adicionar o array de dados ao objeto pdf
$pdf->setData($dados);

// criao do corpo do reltrio, que neste caso ser uma listagem simples, tipo
tabela ( gride )

// adicionar as colunas que iremos listar da tabela.
$pdf->addColumn('Placa' ,15,'C', 'PLACA'
,'white',null,8,'black' ,'times');
$pdf->addColumn('Nome' ,50,'L', 'NOME'
,'white','B',8,'black' ,'arial');
$pdf->addColumn('Marca' ,20,'L', 'MARCA'
,'white',null,8,'black' ,'arial');
$pdf->addColumn('Modelo' ,20,'L', 'MODELO' ,'white',null,8,'black'
,'arial');
$pdf->addColumn('Ano' ,10,'C', 'ANO'
,'white',null,8,'blue' ,'arial');
$pdf->addColumn('Valor' ,20,'R', 'VALOR'
,'white',null,8,'black' ,'arial');
$pdf->addColumn('Aquisio' ,20,'C', 'AQUISICAO'
,'white',null,8,'red' ,'arial');
$pdf->addColumn('Observao' ,120,'J', 'OBSERVACAO' ,'white',null,8,'black'
,'arial');
$pdf->printRows(); // criar a gride no pdf
$pdf->show(); // enviar o pdf para o navegador;
?>

2ara testar o relat/rio, clique no boto 6isualizar+ " lista$em dever. aparecer conforme a tela
abaixo0



Oem pessoal, espero ter ajudado a compreender mel%or o funcionamento da
framework, no pr/ximo exemplo vou converter este exemplo todo para o padro "P"Q, ou
seja, todas as a<es que fizemos aqui, 7alvar, #xcluir, "lterar, imprimir no submetero a
p.$ina para servidor e nem recebero a pa$ina de volta, somente dados trafe$aro, tornando a
aplicao muito mais veloz e em conformidade com os padr<es atuais da R#O B+I, pois a
p.$ina montada uma Snica vez+

"brao,
9uis #u$Lnio+