Uploaded by marcelo.squier

um-mundo-de-possibilidades-utilizando-intraweb 3

advertisement
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido por Eduzz.com
Dedico este livro à minha família, aos meus amigos e todos que compartilharam um
pouco do seu conhecimento.
E a você, que a partir deste trabalho, busca ampliar seu conhecimento.
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido por Eduzz.com
Agradecimentos
Gostaria de agradecer ao Marcelo Giratto pelos ensinamentos e paciência no
início de minha jornada no desenvolvimento com IntraWeb; ao Chad Z. Hower, pela
confiança e convite para fazer parte de um grupo seleto de programadores que utilizam
e compartilham conhecimento de IntraWeb pelo mundo.
Agradeço também ao Dalton Coberta e ao Francisco Dueñas, pelas inúmeras
vezes que esclareceram minhas dúvidas. E ao Jackson Gomes e o Ederson Selvati por
suas contribuições com a comunidade Delphi, postando vídeos e realizando cursos.
Em especial, agradeço ao José Nilton Pace, por ter aceito meu convite para
participar dessa obra. Obrigado por contribuir com sua experiência e conhecimento na
criação de aplicações utilizando exclusivamente IntraWeb. Agradeço também ao
Eduardo Zanon e a Melissa Gobatti por permitirem o compartilhamento de parte de
seus trabalhos.
Por fim, agradeço a todos que direta ou indiretamente contribuíram para meu
aperfeiçoamento no desenvolvimento com o IntraWeb.
“Quem tem prazer em compartilhar o conhecimento que possui, aprende ainda mais, ao contrário,
mostra-nos aquilo que é obvio; a pessoa que não compartilha ou menospreza o conhecimento é porque
ouviu, mas ainda não aprendeu nada”
Léo Rodrigues (Espírito Santo)
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido por Eduzz.com
Sobre o Autor
Wallace Lara de Oliveira é desenvolvedor apaixonado por Delphi e inovações
tecnológicas. Sempre com o desejo de criar inovações para facilitar o desenvolvimento
e disposto a compartilhar seus conhecimentos com o outro. Iniciou na área de
programação com Delphi no curso técnico em 2005; em 2015 iniciou a graduação em
sistemas de informação, quando teve a oportunidade de ministrar um mini curso Delphi
na faculdade, ainda no segundo período. Essa experiência abriu as portas para o
trabalho em uma empresa pioneira no desenvolvimento de sistemas Delphi para postos
de gasolina, oportunidade que trouxe muito aprendizado para a carreira de
programador. Por suas contribuições e compartilhamento de conhecimento em
IntraWeb, em agosto de 2018, foi convidado por Chad Z. Hower da Atozed, para
participar do TeamZed1.
1
TeamZed é composto por insiders IntraWeb. A adesão é apenas por convite e consiste em longo prazo
e os usuários IntraWeb mais ativos. Atozed TeamZed é semelhante ao programa de MVP da Microsoft
Embarcadero ‘s TeamB.
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido por Eduzz.com
Sumário
Agradecimentos................................................................................................................ 3
Sobre o Autor.................................................................................................................... 4
Introdução ........................................................................................................................ 7
IntraWeb ..................................................................................................................... 9
Bootstrap ........................................................................................................................ 10
Case de sucesso .............................................................................................................. 11
Template Admin Bootstrap ............................................................................................ 18
Componentes Bootstrap ................................................................................................ 21
5.1 – Buttons ............................................................................................................. 21
5.2 – Cards................................................................................................................. 24
5.3 – Inputs ............................................................................................................... 25
5.4 - Form Control Sizeng.......................................................................................... 25
5.5 - Textarea ............................................................................................................ 26
5.6 – Select ................................................................................................................ 27
5.7 - Modal ................................................................................................................ 27
5.8 - Table.................................................................................................................. 29
Estruturação de Pastas ................................................................................................... 31
6.1 Pasta do projeto .................................................................................................. 32
6 .2– Pasta Bin ........................................................................................................... 32
6.3 – Pasta Project .................................................................................................... 34
6.4 – Source .............................................................................................................. 34
Pattern (Arquivos padrão) .............................................................................................. 36
7.1 – Template - Pattern ........................................................................................... 36
7.2 – Source - Pattern ............................................................................................... 36
7.2.1 – Formulário base ............................................................................................ 36
7.2.2 – Formulário Base Lista .................................................................................... 38
Configurando ambiente Front-end................................................................................. 40
8.1 – Configurando pasta templates ........................................................................ 40
8.2 – Configurando arquivo base HTML ................................................................... 41
Configurando o ServerController ................................................................................... 44
Configurando o UserSession........................................................................................... 46
Configurando Ebook.template ....................................................................................... 47
11.1 – Codificando GetLibHeadPage ........................................................................ 48
11.2 – Codificando GetLibFooterPage ...................................................................... 52
Configurando o projeto para utilizar o eBook.Componentes.Templates ...................... 56
12.1 – Configurando UserSession ............................................................................. 56
12.2 – Configurando FrmBase................................................................................... 56
Criando a Tela de Login .................................................................................................. 57
Criando a Tela Dashboard .............................................................................................. 67
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido por Eduzz.com
Criando Lista de Usuários ............................................................................................... 79
Criando Cadastro de Usuários ........................................................................................ 88
Criando API com IntraWeb ............................................................................................. 98
17.1 – Criação de um novo TcontentHandler ........................................................... 98
17.2 – Explicando a implementação ......................................................................... 99
17.2 – Demo ............................................................................................................ 100
Considerações finais ..................................................................................................... 101
Referências bibliográficas ............................................................................................. 102
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido por Eduzz.com
Capítulo 1
Introdução
Com a evolução tecnológica que está acontecendo, em que tudo está indo para
internet, muitos se perguntam “Como vamos fazer?”. Principalmente empresas e
programadores que dominavam o mercado de softwares desktop com sistemas
desenvolvidos em Delphi. Aplicações estas que contêm de sistemas simples às
automações mais complexas e módulos como “frente de loja/PDV”. Com essa evolução
não temos outra escolha, precisamos transformar nossos sistemas desktop em sistema
web.
Sei que existe diversas linguagens web, por isso mesmo alguns vão se perguntar
o porquê de não mudar direto para Angular, Vuejs, React ou até mesmo Php! Eu te
respondo: tempo e curva de aprendizado. Mas com certeza destaco a otimização do
tempo.
Neste livro vou ensinar um pouco do que apreendi nesses dois anos de
programação utilizando IntraWeb, como migrar sua aplicação desktop com o mínimo
esforço possível e aproveitando cerca de 70% do seu código.
“70% do meu código?”
Sim, isso mesmo! O back-end no desenvolvimento com IntraWeb é todo feito em
Delphi como estamos acostumados a fazer. Apenas implementaremos um pouco de
JAVASCRIPT e teremos um front-end que será um template comprado ou desenvolvido
por você, caso tenha conhecimento de Bootstrap, CSS e JAVASCRIPT para criar interfaces
intuitivas e com um belo design.
“Falando dessa forma parece fácil!”
Sim, é fácil mesmo! Basta ter apenas um conhecimento básico de HTML e
JAVASCRIPT. Ah! Uma coisa muito importante na utilização de template: é necessário
entender um pouco de cada classe CSS que for utilizar do template escolhido. Mas se
você não sabe nada sobre isso, esse e-book vai mostrar como trabalhar com template
AdminLTE , pois teremos exemplos práticos passo a passo.
Neste livro não abordarei, instalação do IntraWeb! Partirei do pressuposto que
seu Delphi Community Edition está devidamente com IntraWeb instalado.
7
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
por Eduzz.com
Outro requisito importante é utilizar o IntraWeb atualizado devido às grandes
mudanças já realizadas, por exemplo, os novos callbacks que utilizaremos para a criação
do Datatable server-side.
Temos um mundo de possibilidades com IntraWeb! Esta é a conclusão a que
cheguei a partir da minha experiência com desenvolvimento nessa linguagem. Podemos
fazer o que quiser com IntraWeb, seja um erp, um e-commerce, chat, API ou replicar
qualquer coisa que seja desenvolvida para web. E isso com um desenvolvimento muito
mais rápido e com pouco esforço. Você vai entender a expressão “otimizando o
desenvolvimento em minutos”, com uma base que pode ser utilizada para a criação de
qualquer outra aplicação e que eu ensino nesse e-book. Com a base criada, basta
replicar a tela de listagem e de crud e fazer os ajustes necessários.
8
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
por Eduzz.com
IntraWeb
O IntraWeb, que se encontra na versão 15.2.15, é um framework mantido pela
Atozed Software, e tem como objetivo simplificar o desenvolvimento de aplicações web
com Delphi. Com ele é possível criar sistemas simples ou complexos para web,
integrando frameworks e bibliotecas.
Atualmente são dois valores de licenças pagas, uma de 199 € (cento e noventa e
nove euros), com atualização de 6 meses e outra de 399 € (trezentos e noventa e nove
euros), com atualização de 12 meses.
Site da Atozed - https://www.atozed.com/IntraWeb/
Grupo no Facebook - https://www.facebook.com/groups/IntraWebBR
Grupo no Telegram (Português) - https://t.me/IntraWebPT
Grupo no Telegram (Inglês) - https://t.me/IntraWebEn
9
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
por Eduzz.com
CAPÍTULO 2
Bootstrap
Muitos que já se aventuraram no desenvolvimento com IntraWeb puro sabem
do design rústico. Porém, com o decorrer do tempo os programadores Delphi
conheceram e começaram a utilizar um framework chamado Bootstrap que leva uma
aplicação IntraWeb a outro nível, como veremos em algumas ilustrações de sistemas
feitos em IntraWeb.
“Mas o que é esse Bootstrap?
“
Ele é um framework de código aberto para desenvolvimento de componentes de
interface front-end para sites e aplicações web utilizando HTML, CSS e JAVASCRIPT, se
baseado em modelo de design para tipografia, melhorando a experiência do usuário e
deixando seu site ou aplicação mais amigável e responsivo. O Bootstrap foi lançando em
2011 e atualmente se encontra na versão v4.5.2 de acordo com o site getbootstrap.
Link para documentação do Bootstrap
https://getbootstrap.com/docs/4.0/getting-started/introduction/
Recomendo também a leitura e prática utilizando os exemplos da w3schools
https://www.w3schools.com/bootstrap/bootstrap_ver.asp
E, por fim, recomendo a leitura sobre a nova versão do Bootstrap 5
https://blog.getbootstrap.com/2020/06/16/bootstrap-5-alpha/
10 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
CAPÍTULO 3
Case de sucesso
Como o título mesmo já diz - Um mundo de possibilidades utilizando IntraWeb veremos a seguir sistemas variados, dos mais simples aos complexos, que utilizaram
templates admin para criar aplicações com interfaces intuitivas e economizar tempo na
criação de telas e componentes HTML. E temos a vantagem de criarmos apenas um
formulário totalmente responsivo para atender qualquer tamanho de dispositivo.
Nos cases ilustrados abaixo teremos:
➢ um sistema de helpdesk;
➢ um sistema de gestão para autopeças utilizando comunicação rest para
emissão de notas fiscais com certificado A3;
➢ um sistema de e-commerce;
➢ um API de boletos
➢ um API para download de xml;
➢ um sistema com inumeradas integrações, como mercado livre, receita
federal, correios, viacep, Telegram, Whatsapp e muito mais.
Figura 1 - disponível em: https://www.atozed.com/IntraWeb/nggallery/image/img_5a5930ef1536f
11 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 2 - disponível em : https://www.atozed.com/IntraWeb/nggallery/image/img_5a5930ef1536f
Figura 3 - disponibilizada por Wallace Oliveira
Figura 4 - Disponibilizada por Wallace Oliveira
12 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 5 - Disponibilizada por Wallace Oliveira
Figura 6 -Disponibilizada por Eduardo Zanon
Figura 7 - Disponibilizada por Eduardo Zanon
13 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 8 - Disponibilizada por Eduardo Zanon
Figura 9 - Disponibilizada por Melissa Gobatti
Figura 10 - Disponibilizada por Melissa Gobatti
14 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 11- Disponibilizada por Melissa Gobatti
Figura 12 - Disponibilizada por José Nilton Pace
Figura 13 - Disponibilizada por José Nilton Pace
15 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 14 - Disponibilizada por José Nilton Pace
Como evidenciado nas imagens, podemos criar sistemas com designs incríveis.
Inclusive, no sistema mostrado na Figura 05, além de um design moderno existem duas
integrações simples que foram realizadas para facilitar o dia a dia da empresa que o
utiliza. A primeira interação é passar o CNPJ a ser cadastrado para o webservice da
receita federal, para consumir o resultado via Json e carregar em seu formulário. Já a
segunda, passa o cep correspondente ao cadastro para o webservice da viacep e carrega
os dados. É possível realizar integrações com qualquer serviço de API, na Figura 05 foram
apresentadas duas integrações gratuitas.
Figura 15 - Disponível em: https://www.w3schools.com/bootstrap/bootstrap_ver.asp
16 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
No site w3schools, temos a possibilidade de conhecer como implementar
diversos componentes que utilizamos no dia a dia com Delphi para web.
No Delphi temos o Object Inspector que nos apresenta todas as propriedades
disponíveis do componente, por outro lado na web muitas dessas propriedades são
divididas em classes.
Para declarar um componente no Delphi, simplesmente arrastamos e soltamos
o objeto dentro do formulário. Com isso, conseguimos ver todas as propriedades desse
objeto pelo Object Inspector. No desenvolvimento com IntraWeb também
encontraremos muitas propriedades no Object Inspector, não se apavorem!
Quando falamos em desenvolvimento web com programadores Delphi, muitos
ficam receosos com a complexidade da criação de componentes web e sua utilização.
No entanto, da mesma forma que temos no Delphi o “arrasta e solta”, na web
encontramos centenas de exemplos prontos para implementarmos utilizando “Crtl+C e
Ctrl+V”, alguns desses exemplos estão disponíveis no w3schools e GitHub.
A seguir veremos um pouco sobre templates admin, posteriormente
apresentarei alguns componentes que mais utilizaremos no desenvolvimento com
Delphi e IntraWeb, porém em sua declaração HTML.
Abordarei como declarar os componentes web na criação de uma aplicação. Meu
intuito não é mostrar todos e sim os mais utilizados, para assim tentar quebrar esse
bloqueio que muitos têm quando o assunto é a migração do sistema para web.
17 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
CAPÍTULO 4
Template Admin Bootstrap
Template Admin Bootstrap é um modelo de apresentação visual que contempla
vários componentes criados, facilitando sua implementação, seja ela criada em
IntraWeb ou em outras linguagens web.
Uma das maiores dificuldades dos programadores que utilizam IntraWeb é a
troca de template. Ao meu ver, isto ocorre porque muitos dos programadores Delphi
são receosos em relação a adaptação em uma nova linguagem e não se dispõem a busca
de novos aprendizados em desenvolvimento web. Porém, é necessário reconhecer a
necessidade de evoluirmos e nos adaptarmos a nova tendência de os sistemas serem
disponibilizados nas nuvens.
O template admin nos ajuda com o desenvolvimento de nossas aplicações
IntraWeb, pois ele possui uma infinidade de elementos HTML já pronto para a utilização.
Apresentarei alguns templates admin que possuem interfaces modernas para a criação
de aplicações web. Primeiramente, apresentarei aqueles gratuitos utilizados pela
comunidade IntraWeb.
Admin LTE2 – Bootstrap 3
Figura 16 - Disponível em https://AdminLTE .io/themes/AdminLTE /index2.HTML
18 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Admin LTE3 – Bootstrap 4
Figura 17 - Disponível em https://AdminLTE .io/themes/v3/
Os templates admin apresentados a seguir são pagos.
Admin Color – Bootstrap 4
Figura 18 - Disponível em https://seantheme.com/color-admin/admin/HTML/index.HTML
19 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Nifty – Bootstrap 4
Figura 19 - Disponível em https://themeon.net/nifty/v2.9.1/
Apresentei a vocês quatro templates repletos de recursos que, com pouco
esforço, possibilitam a criação de aplicações incríveis e com visual inovador. Nesses
templates temos tudo que precisamos para montar nossos formulários de cadastros e
listagem de dados, além de diversos elementos para criarmos dashboard de resultados,
impressionando assim nossos clientes.
Um segredo que ninguém te contou: se você não conhecer o seu template, ou
seja, as classes base que irá utilizar nas suas aplicações, você continuará sem saber como
trocar seu template ou mesmo como utilizá-lo. Por isso, vou dar alguns exemplos de
classes que você utilizará.
Para quem ainda não conhece o básico de HTML recomendo que, antes de tentar
implementar um template admin com IntraWeb, visite o site w3schools.com, e conheça
a estrutura e as classes dos componentes que irá utilizar no desenvolvimento de sua
aplicação (seja utilizando Bootstrap 3 ou o 4). Mas se você já tem domínio sobre o
Bootstrap sugiro que utilize a última versão, Bootstrap 5.
20 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
CAPÍTULO 5
Componentes Bootstrap
5.1 – Buttons
O button tanto no Delphi quanto na web é simples de ser implementado. Existe
duas formas de implementar o evento no button utilizando o IntraWeb: click ou
asyncclick.
Na Figura a seguir temos o tipo de controle que representamos pela tag type e a
classe correspondente a implementação do botão:
Existem alguns tipos de controle do botão, para saber a respeito recomendo a
seguinte leitura: https://developer.mozilla.org/pt-BR/docs/Web/HTML/Element/input
A tag Class= “btn” -> é a classe que define um botão no Bootstrap. Criada para
ser utilizada junto com o elemento <button>. Porém, é possível utilizar com outros
elementos, como as tags <a> e <input>.
A tag Class= “btn-primary” -> é uma classe que define o a cor a ser utilizada.
Conforme esquema representado a seguir.
A tag Class= “btn-lg” -> é a classe que define o tamanho do botão a ser
renderizado conforme o esquema abaixo:
21 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
A tag Class= “Active ou disable” -> é responsável por desabilitar ou não um botão.
Agora exemplificarei como é simples e fácil implementar e exibir um botão
utilizando o IntraWeb, vejamos:
➢ O primeiro passo é adicionar um botão (IWBUTTON) dentro do Delphi como
fazemos dentro de nossas aplicações desktop.
➢ O segundo passo é, no Objector Inspector, alterar a propriedade Caption e
adicionar o nome do botão a ser exibido. Em seguida, na propriedade CSS,
adicionar a classe btn btn-primary.
Se você deseja apenas fazer um teste para saber o resultado em formulário
limpo, conforme vou apresentar na Figura abaixo, siga os seguintes passos:
➢ Definir o Bootstrap a ser utilizado.
➢ Adicionar suas bibliotecas no extrahead do formulário de exemplo.
Lembrando que não estamos utilizando o template, apenas testando os
recursos nativamente.
22 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 20 - Declarando as bibliotecas do BS4 a serem utilizadas
Figura 21 - Adicionando o IWBUTTON no formulário Delphi
Figura 22 - Alterando as duas propriedades para exibir o IWBUTTON no formato web
Figura 23 - Resultado a implementação
23 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Destaco que este é um teste para o estudo de funcionamento do componente.
Na grande maioria das vezes, apenas adicionaremos a tag “ID”, que receberá o nome do
componente declarado no Delphi em maiúsculo, conforme o esquema a seguir.
A segunda opção é utilizar a {%IWBUTTON%}, desta forma ele herdará todas as
propriedades e eventos adicionados dentro do Object Inspector. Conforme apresentado
no evento de teste.
5.2 – Cards
Em geral, os cards são utilizados no HTML, dentro de container, para exibir algo
para o usuário de forma separada, com cabeçalho, corpo e rodapé.
Figura 24 - Implementação do Card
Implementar um card em IntraWeb é bem simples, como podemos ver o HTML
a seguir:
Para exibir esse card utilizando IntraWeb é necessário adicionar um componente
IWLABEL, alterar a propriedade RAWTEXT para true. Para implementação do exemplo
acima, deve ser adicionado três IWLABEL substituindo as palavras Header, Content e
Footer. Em seguida, no HTML, é preciso trocar os textos pelos nomes dos componentes
implementados
no
Delphi
(IWLABEL),
conforme
a
{%NOMEDOIWLABEL%}.
24 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
tag
de
exemplo
5.3 – Inputs
O input no HTML, nada mais é do que o famoso IWEDIT ou IWDBEDIT.
Figura 25 - Input/IWEdit
Figura 26 - Estrutura HTML dos inputs
No Delphi, adicionamos o componente IWEDIT ou IWDBEDIT e alteramos a
propriedade CSS, que estará vazia para form-control. Para exibirmos o componente no
HTML existe duas formas. A primeira e mais utilizada é adicionar a tag
{%IWEDITNAME%} ou {%IWDBEDITNAME%}. A segunda forma, é adicionar a tag name
e id no input, com o nome declarado no Delphi em maiúsculo, conforme esquema a
seguir.
Figura 27- Implementando ID e Name
5.4 - Form Control Sizeng
A propriedade Sizeng é utilizada para definir o tamanho do input a ser exibido,
conforme a Figura abaixo temos o padrão, sm e lg.
25 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 28 - Definição de tamanho dos inputs
No HTML abaixo é apresentada a forma que se deve declarar a propriedade de
tamanho do input, lembrando que deve ser declarado na propriedade CSS, dentro do
Delphi. Conforme esquema a seguir.
5.5 - Textarea
O Textarea no Delphi é conhecido como memo ou dbmemo. Porém, no IntraWeb
utilizamos o IWMEMO ou IWDBMEMO, devemos adicionar a classe form-control da
mesma forma que implementamos o input.
Para adicionar as linhas ao Textarea devemos incluir a uses IWHTMLTag no
evento OnHTMLTag e adicionar a seguinte linha de comando:
Figura 29- Adicionando Atag
A forma mais utilizada de declarar o IWMEMO no HTML é a inclusão da tag
{%IWMEMO%} ou {%IWDBMEMO%}.
Figura 30 - Exibição do Textarea
26 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 31 - Implementação do Textarea no HTML
5.6 – Select
O Select do mundo web é conhecido no Delphi como IWCOMBOBOX ou
IWDBCOMBOBOX. Para implementarmos podemos fazer da mesma forma que fazemos
no desenvolvimento Delphi, lembrando que temos que alterar a propriedade CSS para
form-control.
Podemos declarar o Select de duas formas. A mais utilizada é a implementação
de tags {%IWCOMBOBOX %} ou {% IWDBCOMBOBOX%}, com o nome do componente
declarado no Delphi. Ou usar o id e name conforme explicamos na implementação do
input. Se tudo estiver certo, o resultado será a Figura a seguir.
Figura 32- Exibição do Select - Combobox
Figura 33 - Implementação do Select no HTML
5.7 - Modal
Podemos utilizar o modal para exibir alertas ou mensagens dentro de nossa
aplicação, conforme veremos no modelo.
Para abrir o modal é preciso adicionar um botão no Delphi e no evento Asyncclick
implementar o código conforme o esquema:
27 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 34 - Exibição do Botão do Modal
Figura 35- Implementação do Botão, inserindo o JAVASCRIPT
Para exibir um modal conforme o modelo abaixo, recomendo criar um IWLABEL
para o título e para o corpo, alterar a propriedade rawtext para true, carregar as
informações desejadas no IWLABEL e fazer as substituições dos textos pelas tags
{%IWLABEL%} correspondente de cada IWLABEL.
Figura 36 - Exibição do modal
O esquema declarado no HTML é apresentado a seguir, em sua implementação
é necessário trocar os textos pelos IWLABEL declarados.
28 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 37 - Implementação do HTML no modal
5.8 - Table
Para utilizarmos tabela no INTRAWEB, podemos utilizar alguns componentes IWGRID, IWDBGRID, e recentemente lançado o IWJQGRID e o IWJQGRID. Ainda não
testei os componentes mais novos, porém recomendo a utilização dos mesmos. Isto
devido a paginação dos dados, para que funcione igual ao Datatable.
Um dos aspectos de maior dificuldade na implementação do CSS no IWDBGRID
que eu encontrei foi é a inclusão das classes CSS, devido a existência de duas
propriedades no Objector Inspector do IWDBGRID. Como estamos acostumados a
trabalhar apenas com a propriedades CSS do Objector Inspector para quase todos os
componentes, não nos atentamos a propriedade innerTableCSS, na qual devemos
declarar as devidas classes CSS.
Vejamos como é implementado a tabela no HTML a seguir.
29 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 38- Estrutura HTML da Tabela - Datatable
Figura 39 - Exibição da tabela - Datatable
Geralmente não utilizo os componentes da Atozed para criar minhas tabelas, ou
gero ele via função e devolvo para IWLABEL que renderiza o HTML gerado por minha
função ou utilizo meu próprio componente de Datatable que está em desenvolvimento
(ele pode ser baixado para teste no link do svn a seguir, utilizando para acesso o usuário:
aluno e a senha: aluno. SVN: https://autopartsbh.com.br:8443/svn/ebook ).
30 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
CAPÍTULO 6
Estruturação de Pastas
Neste e nos próximos capítulos, veremos o quanto é simples trabalhar com
Delphi para web. As mudanças em nossa forma de desenvolver são poucas. Se você não
tem familiaridade com HTML, CSS e JAVASCRIPT, aconselho aprender e compreender o
básico dessas linguagens ou contrate alguém que faça a toda parte de Front-end, ou seja
a aparência de sua aplicação. Enquanto você só se preocupará com o back-end.
Entraremos agora em um assunto que vai mudar a sua forma de desenvolver
com IntraWeb, alguns já podem ter conhecimento, mas para a maioria deve ser
novidade. Irei ensinar como otimizei o desenvolvimento de minhas aplicações e todas
as configurações que não encontramos na internet, como por exemplo, as declarações
das classes nos componentes Bootstrap explicadas anteriormente.
Por muito tempo segui o que aprendi em um curso inicial, porém com percebi
que poderia mudar e desenvolver de forma mais rápida as minhas aplicações, conforme
veremos a seguir. Uma das primeiras etapas é estruturar as pastas da mesma forma que
vemos nas aplicações web.
A maiorias dos sistemas são compostos por mais de 70 % de listas e cruds
simples, com isso cheguei à conclusão que existe um padrão. Ainda que algumas vezes
tenha sua exceção. Com essa análise em mãos comecei a realizar testes de
desenvolvimento criando alguns modelos padrões para serem herdados, agilizando
assim grande parte do desenvolvimento.
Certamente aplicando o que já vimos até o momento e com o que iremos
aprender a partir de agora, seu desempenho com a criação de aplicativos e sistemas
IntraWeb mudará radicalmente.
31 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
6.1 Pasta do projeto
Nosso primeiro passo ao iniciarmos uma nova aplicação IntraWeb é criar três
pastas.
Figura 40 - Estrutura de pastas raiz
6 .2– Pasta Bin
Após criarmos as três pastas, entraremos dentro da pasta Bin e adicionaremos
as seguintes pastas:
Figura 41 - Subpastas da pasta Bin
A pasta Bin possuirá todo o arquivo final que deveremos subir para o cloud ou o
local onde for hospedar sua aplicação. Dentro desta pasta iremos adicionar duas pastas
que são obrigatórias no desenvolvimento com IntraWeb: template e wwwroot.
Inicialmente, não utilizava a pasta files, mas com o passar do tempo adicionei a
pasta files como obrigatória. Nela crio subpastas para organizar melhor todos arquivos
de minha aplicação que não são compartilhados com o usuário, conforme Figura a
seguir.
Figura 42 - Subpastas da pasta files
A pasta Config serve para guardar todos os arquivos de configuração de sua
aplicação. A pasta Clientes guarda tudo que é de clientes, por exemplo, certificado
32 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
digital, banco de dados. A pasta Report contempla todos os arquivos para gerar os
relatórios da aplicação.
Dentro da pasta template, que é obrigatória a criação no desenvolvimento com
IntraWeb, adotei como obrigatório a criação de pelo menos duas novas pastas,
dependendo da aplicação construída.
Figura 43 - Subpastas da pasta templates
Dentro da pasta admin estão todos os HTMLs de formulários de administração
da aplicação, podendo ou não ter novas subdivisões conforme apresentarei na pasta
app.
Figura 44 - Subpastas da pasta app
Na pasta app crio subpastas para dividir e facilitar a manutenção de cada HTML
de minha aplicação.
Descrevemos as pastas files e template, agora vamos falar sobre a pasta
wwwroot. Nesta pasta armazenamos tudo o que iremos compartilhar com nossos
usuários e todas as bibliotecas necessárias em nossa aplicação. Diferente de muitos
desenvolvedores, novamente tenho como padrão criar subpastas como a seguir.
33 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 45 - Subpastas da pasta wwwroot
Nesse caso, coloco na pasta administração, arquivos que disponibilizo para os
usuários que prestam suporte entre outros afins. A pasta cliente por sua vez, contém
arquivos gerados para o usuário e disponibilizado para download. Por fim temos a pasta
template, responsável por todos os arquivos compostos por nosso template, tendo por
sua vez as subdivisões necessárias para facilitar a manutenção e disponibilidade dos
arquivos.
Figura 46 - Subpastas da pasta template
6.3 – Pasta Project
A pasta Project armazena o projeto Delphi que, por sua vez, gera as pastas win32
ou win64, dependo de sua compilação do projeto. Nada a mais deve ser adicionado à
pasta Project.
6.4 – Source
A pasta Source armazena todos os fontes (.pas e .dfm) de cada formulário na
mesma estrutura utilizada na criação da pasta template, conforme podemos ver na
Figura abaixo.
34 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 47- Subpasta da pasta Source
35 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
CAPÍTULO 7
Pattern (Arquivos padrão)
Atualmente, em meus desenvolvimentos crio a pasta Pattern, nela adiciono o
que é comum em toda a minha aplicação.
7.1 – Template - Pattern
Na pasta Pattern, dentro de template, eu crio dois arquivos que utilizo em todos
os formulários. Um arquivo master, responsável por toda a visão HTML e utilizando o
mínimo de biblioteca HTML e JAVASCRIPT, que utilizaremos em formulário de cadastro
ou páginas comuns que não dependem de outras bibliotecas. O arquivo masterlista
contém todos as bibliotecas do master, porém, adicionamos as bibliotecas do Datatable.
Figura 48 - Arquivos HTML padrão
Para facilitar a mudança de template, já com o master e masterlista prontos,
aconselho você a criar uma unit chamada de templates com uma função onde você
retorna os head e JAVASCRIPT que será adicionada no footer no HTML.
7.2 – Source - Pattern
Na pasta Pattern dentro de Source criaremos um formulário base e um
formulário base lista herdado de base.
Figura 49 - Formulários base
7.2.1 – Formulário base
O formulário base é responsável por conter todas as variáveis que vamos exibir
em toda a aplicação.
Para que possamos trabalhar com templates em nossas aplicações iremos
adicionar um componente TIWTEMPLATEPROCESSORHTML, o qual renomeamos para
36 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
TPS e vamos alterar as seguintes propriedades: MasterFromTag para FALSE e
RenderStyles para FALSE. Com essa alteração nossa aplicação estará pronta para
utilizarmos o admin template.
Depois de adicionar e configurar o TIWTEMPLATEPROCESSORHTML é necessário
ir na LayoutMgr do form e “linkar” o template conforme esquema a seguir.
Figura 50 - Linkando template ao formulário
Dentro do evento TPsUnknownTag, no formulário base, devem ser adicionadas
as seguintes tags:
Figura 51- Tags formulário base
Pode ser que exista outras formas de declarar tags, no entanto, o mais
importante é chegar a um resultado gastando o mínimo de esforço e criando uma base
que possa ser reaproveitada para a construção de qualquer outra aplicação.
As tags AppName, AppVersion, AppDataUpdate e PageTitle são variáveis globais
do tipo strings, declaradas no UserSession. Observação diferente do Delphi para
desktop: devemos criar todas as variáveis globais no UserSession.
37 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Analisando o código anterior, vemos que fiz referência apenas a algumas
variáveis globais que necessito utilizar em todos ou quase todos os formulários. Mas
podemos ter dezenas de variáveis, facilitando assim o nosso desenvolvimento.
Como já citado, adotei um padrão de criar tudo separado para facilitar a
manutenção. Então, além de criar pastas dividindo todo o projeto, crio units com
funções de responsabilidade, como por exemplo, a unit ebook.templates que possui a
função GetLibHeadPage () e GetLibFooterPage (). As funções devolvem as bibliotecas
utilizadas no head e footer das páginas HTML. Nessas funções passamos por parâmetro
o nome do template e o tipo de página. Temos alguns tipos de página: Blank, Login, Lista,
Crud). De acordo com cada tipo de página é carregado apenas os CSS e JAVASCRIPT
utilizado neste tipo de página, otimizando assim o carregamento da página. Quando
necessária a utilização de qualquer outra biblioteca, seja ela CSS ou JAVASCRIPT,
adiciono no HTML da página. Caso esteja utilizando um HTML Pattern, recomendo criar
um HTML específico para o formulário em desenvolvimento.
Uma dica super importante, apesar de utilizar um template admin, quando for
criar seus formulários foque em utilizar componentes nativos do Bootstrap, a não ser
que seja muito necessário utilizar uma classe ou algo personalizado do template.
Fazendo isso você terá uma aplicação em que a única tarefa a ser feita é adicionar as
bibliotecas na unit de templates.
Da mesma forma que temos problemas com a alteração de templates, podemos
ter com a troca de bibliotecas. Por isso crio units com funções para devolver as
bibliotecas conforme utilizamos na função GetHeadSweetAlert2. Assim facilitamos as
manutenções e implementação de futuras novas bibliotecas a serem utilizadas dentro
da aplicação.
Outro detalhe que nos deparamos é na hora de criarmos o nosso menu, pois
cada template tem uma formatação diferente. O ideal é criar, dentro da unit templates,
uma função que retorne os menus de acordo com os templates utilizados na aplicação.
7.2.2 – Formulário Base Lista
O formulário base lista é herdado do formulário base, nele é adicionado um
botão com o nome BTNEXCLUIR, que será herdado por todos os formulários de lista da
aplicação, e assim reduzindo a nossa codificação com o botão BTNEXCLUIR em todas as
telas de listagem.
38 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Para facilitar esse processo é necessário que você declare em UserSession duas
variáveis: a primeira com o nome da tabela utilizada no formulário corrente e a segunda
que recebe a chave primária da tabela, como apresentado na Figura a seguir.
Figura 52 - Implementação do botão excluir
Uma observação a qual devemos nos atentar nesse código é que em minhas
tabelas utilizo o sufixo “COD_” mais o nome da tabela para formação das chaves
primárias e generators no Firebird.
39 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
CAPÍTULO 8
Configurando ambiente Front-end
8.1 – Configurando pasta templates
Neste capítulo faremos o download do template admin LTE e iremos preparar os
arquivos base - master e masterlista. Além disso, vamos adicionar dentro da pasta
wwwroot todos os arquivos de configuração do template.
Para realizar o download do template Admin LTE acesse gratuitamente o link:
https://github.com/ColorlibHQ/AdminLTE /archive/v3.0.5.zip. Após fazer o download é necessário
extrair os arquivos e depois copiar as pastas build, dist e plugins para dentro da pasta
“wwwroot/templates/AdminLTE”.
Figura 53 - Arquivos do template AdminLTE
40 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
A seguir apresentamos a pasta AdminLTE (wwwroot/templates/AdminLTE)
apenas com os arquivos necessários para que a aplicação funcione, sem gastar espaço
com arquivos desnecessários.
Figura 54 - Pastas necessárias do template AdminLTE
8.2 – Configurando arquivo base HTML
Realizada as configurações acima é necessário voltar na pasta do template
AdminLTE para pegar o HTML base. O arquivo que vamos utilizar como base encontrase dentro da pasta (Pages/examples/Blank.HTML).
Ao abrir a página Blank em seu navegador ela deve aparecer de acordo com a
Figura 44. Os templates admin possuem uma infinidade de recursos e configurações que
você pode utilizar da forma que preferir, de acordo com sua imaginação.
Figura 55 - Apresentação da página Blank
Como podemos ver na Figura 56, existem diversas personalizações que você
pode usar de acordo com seu gosto e conveniência.
41 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 56 - Apresentação das personalizações do template AdminLTE
Outro arquivo utilizado é o login.HTML, que encontra se dentro da pasta
(Pages/examples/login.HTML).
Figura 57 - Apresentação da tela de login.HTML
Após conhecer e saber a localização desses arquivos, eles devem ser copiados
para as suas respectivas pastas. O arquivo blank.HTML deve ser copiado para dentro da
pasta (bin/templates/app/Pattern), e ele será renomeado para master.HTML, conforme
Figura a seguir.
42 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 58 - HTML master
Agora vamos fazer o mesmo com o arquivo login.HTML que deve ser copiado da
pasta (Pages/examples/login.HTML) para a (bin/templates/app/login).
Figura 59 - HTML login
Com as pastas de arquivos configuradas a criação de todos nossos formulários
pode ser iniciada, pois já temos toda base necessária.
43 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
CAPÍTULO 9
Configurando o ServerController
O ServerController é o núcleo de nossa aplicação, ele é responsável por criar
todos as sessões solicitadas de forma síncrona. Enquanto a aplicação IntraWeb é
assíncrona, baseada em threads.
Uma dica importante: nunca crie nada de processamento dentro do
ServerController que possa parar a fila de solicitações de sessão.
No ServerController temos algumas propriedades que podem ser configuradas
para a publicação de sua aplicação.
➢ AppName - Nome da aplicação que será exibida na sua barra de tarefas.
Figura 60 – Nome da aplicação na barra de tarefa
➢ Description – Descrição de exibição.
Figura 61 - Descrição de exibição
44 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
➢ DisplayName – Descrição de exibição.
Figura 62 - Exibição do nome na barra de navegação
➢ Port -> Diferente do IIS/Apache
➢ RestartExpiredSession -> True: Reinicia a sessão expirada automaticamente.
➢ SessionTimeOut -> 30: Tempo de acesso da sessão de usuário inativo.
➢ SecurityOptions -> CheckSameIp -> False: Libera a execução das páginas por
vários IP's diferentes ao mesmo tempo.
45 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
CAPÍTULO 10
Configurando o UserSession
O UserSession é responsável por criar uma sessão para cada usuário
isoladamente, e pode ser utilizado também como um data module, pois ele é herdado
de TDataModule do Delphi.
Com base no modelo que será disponibilizado para download, iremos adicionar
a unit eBook.Componentes.Template, responsável pelo controle do template que será
utilizado na aplicação. No UserSession declaramos todas as variáveis globais conforme
a Figura a seguir.
Figura 63 - Unit UserSession
46 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
CAPÍTULO 11
Configurando Ebook.template
Ebook.Templates é uma unit responsável por devolver as bibliotecas JAVASCRIPT
e CSS de acordo com a página e o template escolhido. Isso facilita a mudança de
template em minutos, pois será necessário apenas adicionar as bibliotecas.
Mas pode ser que o template utilize classes diferentes, necessitando fazer
pequenos ajustes. Lembrando sempre de utilizar componentes com sua estrutura nativa
do Bootstrap para facilitar a alteração.
Esta unit inicialmente será composta por dois types - TTemplatesPage, em que
teremos os tipos de páginas de nossa aplicação; e o TTemplateName, no qual teremos
todos os templates disponíveis para utilização em nossa aplicação.
Podemos observar que essa unit possui duas funções – GetLibHeadPage, a qual
tem a função de retornar as bibliotecas que serão adicionadas no head do HTML, no
carregamento da página; e a GetLibFooterPage, função que retorna as bibliotecas que
serão adicionadas ao final do HTML antes de fechar a tag </body>.
Figura 64 - Unit eBook.Componentes.Templates
47 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
11.1 – Codificando GetLibHeadPage
A estrutura da função receberá dois parâmetros de entrada, e seu objetivo é
devolver as bibliotecas utilizadas em cada tipo de página. É bom lembrar que algumas
bibliotecas são comuns a todos os tipos páginas.
Figura 65 - Estrutura base da função GetLibHeadPage
48 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Com a estrutura montada é o momento de abrir o HTML da página Blank.
Figura 66 - Estrutura base do HTML Blank
Na estrutura head da página Blank temos quatro bibliotecas que declararemos
no back-end conforme Figura a seguir.
Figura 67 - Adicionando bibliotecas na função GetLibHeadPage
Observe a simplicidade de implementação do código: abrimos o HTML,
localizamos as bibliotecas e as adicionamos dentro de um stringlist, que ao final devolve
seu conteúdo para o result da função. Poderia ter criado apenas uma função e
adicionado o footer, porém acho a forma implementada mais organizado. Mas fica a
critério de cada programador.
Agora vamos fazer o mesmo com o head da página login. Abrindo o HTML da
página login, podemos observar que ele utiliza as mesmas bibliotecas head. Porém, se
observarmos, existe uma biblioteca que não é comum para ambas as páginas. Conforme
Figura a seguir.
49 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 68 - Identificação das bibliotecas head do login.HTML
Quando todas as bibliotecas forem padrões e existir uma exceção na
implementação dos tipos de páginas do template, é necessário implementar conforme
É necessário adicionar todas as bibliotecas comuns e tirar do case de verificação
Figura 69 - Implementação do padrão e exceção dos tipos de página
do tipo de página, deixando assim somente as bibliotecas exclusivas. Confome podemos
observar no tipo de página login.
Para finalizar as configurações da função, é preciso abrir uma página do template
que contém as bibliotecas de Datatable. Recomendo também muito estudo sobre
Datatable, pois com ele é possível criar listas interessantes. Vamos abrir o arquivo
Data.HTML ele esta localizado dentro da pasta (Pages/tables/data.HTML).
50 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 70 - Bibliotecas Datatable no data.HTML
Ao abrir o arquivo data.HTML podemos ver que existem duas bibliotecas
exclusivas para as páginas que utilizam Datatables. Então vamos implementar essas
duas bibliotecas excluivas em nossa função conforme Figura a seguir.
Figura 71 - Implementação do tipo de lista adicionando as bibliotecas Datatable
Com a implementação acima finalizamos a parte de configuração
GetLibHeadPage. Observe na Figura a seguir como ficou a implementação.
Figura 72 - Implementação final da GetlibHeadPage
51 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
de
11.2 – Codificando GetLibFooterPage
A estrutura da função GetLibFooterPage é idêntica a GetLibHeadPage. Ela
receberá dois parâmetros de entrada e seu objetivo é devolver as bibliotecas utilizadas
em cada tipo de página. Apenas uma observação: somente será adicionada nessa função
as bibliotecas que ficam antes de fecharmos a tag </body>. Vejamos sua estrutura
conforme Figura a seguir.
Figura 73 - Estrutura da função GetLibFooterPage
É possível observar que não há mudanças na estrutura da função, apenas dividi
a estrutura em duas funções para facilitar a manutenção do código. Poderíamos ter feito
tudo em uma única função. Iniciemos então a codificação abrindo o arquivo blank.HTML
para vermos quais as bibliotecas encontraremos para implementação.
52 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 74 - Scripts do template da página blank.HTML
É necessário localizar todas as bibliotecas antes de fecharmos a tag </body>,
conforme a Figura 74, e implementar as bibliotecas em nosso back-end conforme a
Figura a seguir.
Figura 75 - Implementação das bibliotecas Footer no tipo da página blank
De forma análoga, vamos abrir o login.HTML para ver as bibliotecas que
necessitamos declarar.
Figura 76 - Bibliotecas Footer da página login
A biblioteca demo.js que tem em Blank, ao contrário do que vimos na função
GetLibHeadPage, é comum a todas as páginas. Possivelmente ela será exclusiva a todas
que contêm o componente menu, mas é necessário analisar qual é a responsabilidade
dos JAVASCRIPT implementados nela. Agora, vamos implementar o back-end conforme
a Figura a seguir.
53 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 77 - Implementação do Footer login tipo blank
Acima temos implementado as bibliotecas dos HTMLs Blank e Login, faltando
apenas implementarmos as bibliotecas do data.HTML. Então basta abrir o arquivo
data.HTML e ver as bibliotecas que devemos implementar conforme a Figura a seguir.
Figura 78 - Bibliotecas Footer Datatable
Com isso, surgiram quatro novas bibliotecas da classe Datatable e voltamos a ver
a biblioteca demo.js. Implementemos as novas bibliotecas conforme a Figura a seguir.
54 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 79 - Implementação das bibliotecas Footer
Com a derradeira implementação do arquivo data.HTML finalizamos a
configuração da unit eBook.componentes.templates. Você pode estar se perguntando
o motivo pelo qual não implementei alguns tipos de página. O motivo pelo qual não
implementei alguns modelos é que você agora pode utilizar à sua maneira. Como por
exemplo, você poderia ter criado e implementado a página de dashboard, porém se
analisar o HTML que vem no template verá a quantidade de bibliotecas que eles
utilizam. Se você for utilizar tudo, é simples! Basta adicionar tpDashboard e as
bibliotecas como fizemos. Outra dúvida que pode surgir é o motivo pelo qual não
implementei o tpCrud. Simplesmente porque vou ter telas que utilizarei o que é padrão
e outras que precisarei utilizar novas bibliotecas. Com isso tenho duas possibilidades ou crio mais um tipo exemplo tpCrudExemplo ou declaro a biblioteca dentro do HTML
referente ao formulário que for utilizar, por exemplo, frmcrudpessoa.HTML.
55 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
CAPÍTULO 12
Configurando o projeto para utilizar o
eBook.Componentes.Templates
12.1 – Configurando UserSession
No evento oncreate vamos adicionar essa linha de código responsável pelo
template a ser carregado.
Figura 80 - Implementação da variável responsável pela seleção de templates
12.2 – Configurando FrmBase
Com nossa unit de eBook.Componentes.Templates devidamente configurada,
vamos fazer alguns pequenos ajustes antes de começar a criar os formulários.
A primeira configuração é adicionar em FrmBase, dentro da procedure
TPsUnknownTag, duas variáveis que serão responsáveis por adicionar as variáveis no
HTML, conforme a Figura a seguir.
Figura 81 - Variáveis utilizadas no eBook.Componentes.Templates
56 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
CAPÍTULO 13
Criando a Tela de Login
Para criar a tela de login iremos criar um novo formulário herdado de base e
adicionaremos dois IWEDIT e um IWBUTTON que utilizaremos para fazermos a
autenticação.
Outro detalhe importante, quando trabalhamos o IntraWeb utilizando template
não importa a posição onde os componentes foram adicionados no formulário, pois as
posições serão formatadas no HTML.
Vamos fazer algumas configurações nos componentes, o primeiro passo é
renomeá-los. Em seguida, recomendo adicionar a propriedade CSS a classe form-control.
E, por fim, se você está utilizando uma versão desatualiza do IntraWeb, pode existir a
necessidade de desmarcar todas as propriedades de renderização da propriedade
StyleRenderOptions localizada no Object Inspector, conforme Figura a seguir
Figura 82 - Configuração do StyleRenderOptions
Adicione à uses IWHTMLTag, para que possamos personalizar nosso IWEDITS. Na Figura
a seguir faço a personalização dos campos de login e senha.
57 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 83 - Personalização dos inputs
Você deve estar se perguntando como faremos para que o campo de senha exiba
como password. O IntraWeb vem ganhando atualizações fantásticas e uma delas é a
propriedade datatype com alguns types disponíveis para a utilização conforme a Figura
a seguir.
Figura 84 - Tipos de datatype
Depois de adicionar os componentes o resultado deve ser a Figura a seguir.
Porém, ainda devemos codificar o botão login, que pode ser feito de várias maneiras.
Prefiro trabalhar utilizando o máximo de funções possíveis, criando todos os
componentes em run-time.
Figura 85 - Formulário de login
58 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Agora vamos criar um Data Module. Parta isso basta ir em file->new->other. Irá
exibir uma janela chamada New Item, do lado esquerdo iremos selecionar Database e
do lado direito selecionaremos Data Module, conforme a Figura a seguir.
Figura 86 - Criando Data Module
Com o formulário aberto adicionaremos um TFDConnection e três TFDQuery
conforme Figura a seguir.
Figura 87 - DM da aplicação
Para concluir a implementação do DM, devemos abrir o UserSession e ir até uses,
declarar uDm. Mais abaixo, em private FDm: TDm; public declaramos property Dm: TDm
read FDm write SetDm; e para finalizar precisamos criar o componente Dm no evento
BaseCreate Dm := TDm.Create(nil).
No UserSession iremos criar uma procedure conforme Figura abaixo,
responsável por validar se o usuário está logado na mudança de página. Conforme
Figura a seguir.
59 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 88 - Implementação da procedure purl
Para finalizar implementaremos o código de autenticação de usuário no evento
onAsyncClick, conforme Figura a seguir.
Figura 89 - Implementação da autenticação do usuário
Atualmente, opto por trabalhar com funções, em que recebo as variáveis de
entrada, variável de conexão e as variáveis de resultado. Dentro da função, crio o que é
necessário em tempo de execução e após realizar seu processo libero da memória os
objetos criados.
Na Figura 89, se os dados passados por parâmetros forem verdadeiros dentro da
função, preencheremos o ID e o nome do usuário. Caso o usuário seja incorreto,
limpamos as variáveis e preenchemos apenas a variável de erro.
Para utilizar o sweetalert, você tem duas formas: uma é conforme a Figura 89,
utilizando a unit com os scripts do sweetalert, sendo devolvido; a outra forma é criar os
scripts manualmente. A unit está disponível no SVN do e-book.
E por fim, adicionamos esse trecho de código informando que este formulário
será o primeiro a ser inicializado na aplicação.
Figura 90 - Inicialização do formulário login
60 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Chegou a hora tão esperada por todos: implementaremos o visual do formulário
login. Estando prontas as definições citadas anteriormente, vamos implementar mais
algumas linhas de código, conforme a Figura a seguir.
Figura 91 - Configurando template formulário login
Vamos executar o projeto e vermos qual será o resultado, lembrando que ainda
não implementamos o HTML do formulário login, apenas exibiremos o HTML do
template AdminLTE da tela de login. Resultado apesentado conforme Figura a seguir.
Figura 92 - Renderização do login.HTML do AdminLTE
Vamos ajustar o HTML substituindo o Titulo pela tag {%Title%}, as bibliotecas
dentro da tag Head por {%LibHeadPage%} e as bibliotecas antes de fechamos o body por
{%LibFooterPage%}. Veja o HTML alterado nas duas imagens a seguir.
Figura 93 - Novo head
61 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 94 - Novo Footer
Compilemos nossa aplicação novamente para vermos o resultado apresentado.
Figura 95 - Renderização da tela login aplicando as configurações do template
O título que implementamos apareceu na janela do browser, porém o visual
Bootstrap ainda não. O que podemos fazer é clicar no F12 do teclado, com o browser
aberto e conferir se existe algum erro no console. Conforme a Figura a seguir.
62 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 96 - Erro de implementação de bibliotecas
Como podemos ver na Figura 96, nenhuma das bibliotecas foram encontradas.
Utilizando o Google Chrome, se você clicar com o botão direito do mouse sobre a linha
do erro irá abrir uma janela em que deverá ser selecionado Open in new tab. Em seguida,
abrirá uma janela conforme a Figura a seguir.
Figura 97 - Janela com o caminho do arquivo CSS
A Figura 82 mostra a tentativa de abrir o arquivo dentro da pasta plugin, porém,
essa pasta agora encontra-se dentro da pasta (templates/AdminLTE/plugin). Assim,
63 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
devemos abrir a unit eBook.Componentes.Templates e ajustar o caminho do arquivo.
Com a unit aberta basta ir no menu search/replace e fazer a alteração conforme a Figura
a seguir.
Figura 98 - Correção do caminho da biblioteca do template
Após realizar a alteração salve o projeto e recompile. O resultado deve ser como
o da Figura a seguir.
Figura 99 - Exibição da tela de login após as correções e implementação
Porém, na Figura 99 existem alguns componentes a mais do que no formulário
de login no Delphi. Na Figura a seguir veremos a exibição da tela de login conforme o
formulário Delphi, mais abaixo veremos passo a passo como realizamos as alterações.
64 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 100 - Tela de login da aplicação
Foram removidos os botões que não vamos utilizar. Fiz uma alteração na cor do
CSS do botão Entrar e adicionei a logo do livro, como podemos ver na Figura 85. Para
entender como isso foi feito, vamos ver as alterações realizadas.
1º) Alteração que encontraremos em head e alteração da cor do botão Entrar conforme
a Figura 100.
Figura 101 - Mudança de cor do botão login
2º) Alteração para inclusão da Figura do e-book, implementaremos o código conforme
a Figura 102.
Figura 102 - Inclusão da Figura do livro
Eu declarei o código da Figura 102 desse jeito apenas para facilitar a exibição
para você. Mas você pode implementar todas as propriedades em apenas uma linha.
Conforme a implementação do frmlogin na Figura 103.
65 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 103 - Implementação do HTML da tela login
66 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
CAPÍTULO 14
Criando a Tela Dashboard
Para criar a tela de Dashboard devemos herdar do formulário base. Para isso,
bastar ir em file->new->other->, após o clique irá abrir uma tela conforme a Figura
abaixo. Clique em inheritable Items, e do lado direito selecione o Frmbase.
Figura 104 - Tela New Items
Após esse passo, será criado um formulário herdado de nosso formulário base.
É necessário fazer algumas configurações: a primeira é renomear o formulário e salvar,
e a segunda é adicionar a uses uServerController, eBook.Componentes.Template.
Depois de fazermos as configurações acima devemos adicionar no evento
onCreate do formulário algumas linhas de código para carregamento do template e
adicionarmos o título da página conforme Figura a seguir.
67 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 105 - Preenchimento do evento onCreate
A primeira linha é o título que iremos apresenta no Browser. Na segunda linha
passamos quais as bibliotecas do template que queremos carregar. A terceira e a quarta
linhas são responsáveis por alimentar o componente TIWTemplateProcessorHTML,
passando qual é o HTML master que iremos usar e qual será o HTML do formulário.
Outra configuração que devemos fazer é localizar na estrutura HTML onde
iremos declarar o conteúdo da página. Como podemos ver na Figura abaixo.
Figura 106 - Localizando a classe responsável pelo corpo do HTML
Como podemos ver na Figura 106, o corpo da página começa em contentewrapper, logo abaixo vemos o contente-header, que é responsável por adicionar na
página o título do formulário que estamos. Na Figura 107, do lado direito, temos a
identificação da página anterior e a página atual, como podemos ver a seguir.
68 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 107 - Estrutura HTML do cabeçalho do formulário
Figura 108 - Resultado do HTML da Figura 92
Após a classe content-header, vem a classe content conforme podemos ver na
Figura a seguir.
Figura 109 - Implementação do card dentro da classe Content
Devemos localizar no master.HTML a classe content onde faremos a seguinte
alteração conforme a Figura 110.
69 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 110 - Adicionando tag $body no formulário master
Com o master.HTML inicialmente configurado, vamos criar o HTML
FrmDashboard.HTML, que será implementado conforme a Figura 96. Devemos salvar o
arquivo na pasta templates/app/dashboard.
Figura 111 - Estrutura HTML do FrmDashboard.HTML
Para finalizarmos a implementação são necessárias algumas implementações no
ServerController.
Como vamos utilizar Handlers, é preciso declarar as uses necessárias para sua
utilização, conforme a Figura a seguir.
Figura 112 - Uses para a utilização de Handlers
Para verificarmos se toda a implementação está correta devemos compilar o
projeto. Estando devidamente implementado, o resultado corresponde a Figura 113.
70 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 113 - Tela Dashboard
O dashboard foi carregado, porém como alteramos o caminho das bibliotecas
para templates/AdminLTE precisamos ajustar o caminho das imagens. Para isso, vamos
abrir o HTML master e fazer um replace de (../../) para (templates/AdminLTE /),
recompilando ou dando F5, caso a aplicação esteja em execução. Veremos que as
imagens agora foram carregadas como apresentado na Figura 114. Porém, por algum
motivo os ícones não exibiram.
71 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 114 - Exibição das imagens no formulário após a correção
Para tentar encontrar o problema podemos dar um F12 e ver se existe algum
erro no console de biblioteca ou JAVASCRIPT, conforme veremos na Figura a seguir.
Figura 115 - Localizando o erro no console do navegador
72 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Como podemos ver, no console do navegador a biblioteca responsável pela
inclusão dos ícones em nossa página não está sendo carregada. Podemos clicar com o
botão direito do mouse, ir até new in open tab e mandar abrir o arquivo no navegador
para vermos se o caminho do arquivo está correto. Caso seja apresentado o arquivo
conforme a Figura a seguir, podemos ver que o caminho da biblioteca está errado.
Figura 116 - Localização do arquivo all.min.CSS
Nesse caso, é preciso voltar a unit responsável pelo controle de template e ver
se por algum motivo erramos o caminho ou esquecemos de implementar. A Figura 117
mostra que a biblioteca não foi alterada, por isso é necessário corrigir a linha indicada
pela seta.
Figura 117 - Biblioteca do template
Para fazer a correção basta substituir (../../) por (template/AdminLTE /) e o
problema é resolvido, como mostrado na Figura a seguir.
73 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 118 - Correção da biblioteca de ícones
Para finalizar o dashboard, vamos substituir o nome Alexandre Pierce para o
nome do usuário logado. Para fazer isso, o primeiro passo é adicionar uma variável do
tipo string na unit UserSession com o nome de UserName. Em seguida, voltar ao
formulário base e adicionar a seguinte linha no evento TPsUnknownTag.
Para concluirmos a exibição do nome do usuário, o próximo passo é localizar em
nosso master.HTML o nome Alexandre Pierce e mudar para {%usuario%}.
Figura 119 - HTML original
Figura 120 - HTML alterado
Em seguida, recompilar a aplicação e assim obter o resultado final da figura 121.
Figura 121 - Exibição do nome do usuário
Nesse e-book não implementaremos o menu vindo da base de dados, pois cada
um pode implementar à sua maneira. Deixarei a função montada, explicando o que é
necessário fazer. Uma observação importante, no exemplo em questão estou utilizando
a class nav-item para implementar o menu. Para implementar os níveis no menu
74 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
recomendo abrir o demo e verificar o EXEMPLO MULT LEVEL contido no template
AdminLTE.
Iremos fazer a seguinte alteração no master HTML: localizar a classe “nav
class="mt-2” e substituir toda a classe pela a tag {%menuprincipal%} que vamos criar no
evento TPsUnknownTag em nosso formulário base, conforme a Figura 123.
Figura 122 - Declaração da tag menu principal
Figura 123 - Visualização da implementação da tag no HTML
O modelo de função que deixarei de exemplo para implementação é a função
Gerar_Menu_ByUser, que recebe como parâmetro de entrada o id do usuario e devolve
uma String com o menu, conforme a Figura 124.
75 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 124 - Implementação da função de menu principal
Como explicado anteriormente, é necessário conhecer a estrutura de níveis para
saber quais classes implementar na criação de seu menu com níveis e subníveis.
Após as implementações devemos compilar nossa aplicação e obter o resultado
apresentado conforme Figura a seguir.
Figura 125 - Exibição do menu implementado
Clicando no menu usuários podemos observar que o mesmo está sendo
redirecionado para a url correta. Conforme mostrado na Figura 126, precisamos agora
implementar a tela de listagem de usuários que veremos no capítulo a seguir.
76 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 126 - Url da tela de listagem de usuários a ser implementado
Com nossos master praticamente finalizado podemos alimentar as variáveis
nome da aplicação, data de compilação e versão no nosso UserSession. Para
alimentarmos essas variáveis vamos até a unit uUserSession, no evento BaseCreate
vamos implementar o seguinte código.
Figura 127 - Alimentação das variáveis globais
No HTML master a seguinte alteração deve ser realizada.
Figura 128 - Código do HTML original do template AdminLTE
Figura 129 - Código do HTML alterado do template AdminLTE com as tag do IntraWeb
77 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
A seguir é exibido a barra <footer> após as alterações.
Figura 130 - Exibição das implementações IntraWeb no HTML
78 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
CAPÍTULO 15
Criando Lista de Usuários
Para criar a tela de Lista de usuários devemos herdar do formulário BaseLista ao
contrário de nosso dashboard. Isto porque nessa tela utilizaremos as bibliotecas de
Datatable para que possamos fazer uma tabela bem apresentável.
Para criar a tela herdada de BaseLista basta ir em file->new->other->, então irá
aparecer uma tela conforme a Figura 131. Clique em inheritable Items e do lado direito
selecione o FrmbaseLista.
Figura 131 - Tela New Items
Da mesma forma que implementamos nos formulários anteriores, devemos
alimentar as variáveis responsáveis pelo carregamento visual da aplicação e as variáveis
responsáveis pela identificação do nome da página no browser.
Figura 132 - Alimentação das variáveis globais obrigatórias do formulário
79 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Após
a
implementação,
uServerController,
é
necessário
System.StrUtils,
adicionar
as seguintes uses:
eBook.Componentes.Template,
e
eBook.Functions.Firedac.
Para implementar o Datatable server-side iremos declarar a procedure
GerarJson(aParams: TStrings; out aResult: String). Ela é responsável por gerar Json de
acordo com o parâmetro vindo da tela de listagem. Você pode otimizar criando uma
função genérica que receba parâmetros como Fields e devolva resultado em Json. Mas
como meu foco é ensinar o máximo de pessoas e mostrar como é simples criar o
Datatable server-side, vou dividir o código em duas partes conforme a Figura 133 e 134.
Figura 133 - Estruturado código – parte 1
Na primeira parte do código fazemos apenas um select da tabela usuário,
passando os parâmetros vindos do front-end, que está contido em nossa variável
aParams conforme demonstrado na Figura 133.
A segunda parte do código é responsável por gerar o Json de resposta de acordo
com os dados encontrados a partir dos parâmetros vindos do front-end e executado na
primeira parte do código.
80 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 134 - Estrutura do código – parte 2
Dando continuidade na segunda parte do código, montamos o cabeçalho do
Json, e logo abaixo faremos a leitura do resultado pela query para devolvermos um array
de objetos.
Resumindo, precisamos devolver um array Json com os seguintes dados [código,
descrição, botões de ação]. Assim, devolver os resultados como código e descrição é
simples. É necessário maior atenção quando formos devolver componentes HTML,
como demonstrado na Figura 134:
➢ antes de uma dupla aspas adicionar a \
➢ antes de fechar as aspas duplas, adicionar a \
➢ declarar a função JAVASCRIPT e seus parâmetros, não esquecer das aspas
Para finalizar, verificamos se o Json precisa de alguma correção. Caso contrário,
seu resultado é devolvido para o Datatable.
Como vimos na segunda parte do código, na criação do Json declaramos um
componente button que possui uma função JAVASCRIPT. Esta tem o objetivo de chamar
uma procedure dentro do Delphi.
Todavia, antes de implementar a procedure
responsável pelas ações de crud, vamos criar as variáveis responsáveis pela exibição do
Datatable e seu JAVASCRIPT. Para isso, deve ser declarado no evento TPsUnknownTag
a implementação da Figura 135.
81 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 135 - Implementação das tags script e Datatable
Com o intuito de simplificar ao máximo o desenvolvimento, disponibilizarei
algumas unit no SVN do e-book.
Como trabalharemos com chaves primárias simples, vamos criar uma variável
com o nome GLBPK do tipo integer. Outra variável que criaremos é a TableCrudName
do tipo String, para adicionarmos o nome da tabela que estamos trabalhando no crud.
Relembrando que todas as variáveis globais devem ser declaradas no UserSession.
Primeiramente, devemos criar uma procedure com o nome de prc_crud, ou seja,
abreviando a procedure e o objetivo dela.
Novamente vou dividir o código em duas partes. Na primeira recebemos os
parâmetros de entrada: a ação a ser executada e a chave primária a ser localizada na
base de dados. Observe a Figura a seguir.
Figura 136 - Implementação da separação da ação e chave primária
82 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Na segunda parte do código implementaremos as ações cruds de alteração,
exclusão e inclusão. Irei fazer a inclusão da uses da unit do sweetalert2, que também
está no svn do e-book. Observe a Figura a seguir.
Figura 137 - Implementação das ações de crud
A diferença desse código para o que implementamos corriqueiramente no Delphi
é a excursão de um JAVASCRIPT que exibirá uma aleta perguntando se confirmamos a
exclusão do registro. Podemos observar que na função swalConfirm temos alguns
parâmetros:
➢ o título da notificação;
➢ a mensagem da notificação;
➢ a cor do botão;
➢ a descrição do botão de ação a ser executada;
➢ a descrição a ser exibida de o botão cancelar;
➢ o name em caixa alta do botão que será executado.
A seguir observe a implementação do botão de ação excluir no formulário
BaseLista.
83 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 138 - Implementação do botão de exclusão
Existe também, dentro da ação de inclusão e alteração, a chamada da procedure
UserSession.pUrl, que faz o direcionamento para página que dever ser carregada.
Observe que é necessário declarar a unit do sweetalert2, basta adicionar em uses
eBook.Componentes.SweetAlert2. Outro detalhe muito importante que não podemos
esquecer é declarar o botão excluir ocultamente no masterlista, conforme a Figura 139.
Figura 139 - Declarando o botão excluir ocultamente
Voltando ao formulário de listagem de usuários precisamos fazer mais alguns
ajustes no evento IWAppFormCreate. É necessário informar a tabela que usaremos no
crud alimentando a variável TableCrudName criada. Precisamos também registrar a
procedure responsável pelo crud e a responsável pela criação de Json do Datatable.
Observe isso na Figura 140.
Figura 140 - Inclusão dos registros das procedures
84 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Para finalizar a tela de listagem de usuário precisamos apenas implementar o
HTML padraolista.HTML, que utilizaremos para toda tela de pesquisa da aplicação.
Evidentemente haverá telas de listagem personalizadas. Nesse caso, utilize a base criada
e altere o caminho do TPs.Templates.Default para que seja utilizado seu HTML
personalizado.
Observe o código front-end da tela de listagem de usuários na Figura 141.
Figura 141 - HTML da base padraolista.HTML
Ao compilar a aplicação o resultado deve ser o apresentado na Figura 157.
Figura 142 - Exibição da tela de lista de usuário com o Datatable
Um detalhe que pode ser acrescentado é a possibilidade de criação de novas
variáveis no Delphi para a manipulação do nome do formulário que estamos. Também
podemos criar variáveis para manipular a navegação entre páginas, conforme podemos
ver nos links Home e Dashboard, localizados do lado direito na Figura 142. Porém, não
implementaremos isso nesse e-book. Lembrando que na web não podemos repetir os
nomes dos objetos, então recomento criar variáveis para cada objeto HTML que forem
criar.
Ao clicar no botão excluir deve ser exibido uma notificação, como podemos ver
na Figura 143.
85 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 142 - Exibição do sweetalert2
Se tentarmos executar o botão editar veremos que a página está sendo
direcionada. Porém, como não implementamos o cadastro, nos deparamos com o
seguinte erro.
Figura 143 - Erro ao tentar editar o cadastro
Para finalizar devemos implementar o botão Novo registro e alterar a variável
minha lista pela variável global TitleCard, conforme a Figura 145.
Figura 144 - Implementação da variável TitleCard e botão de inclusão
O resultado após a inclusão da nova variável e do botão para inclusão, é
apresentado na Figura 146.
86 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 145 - Exibição do TitleCard e do botão de Novo Registro
87 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
CAPÍTULO 16
Criando Cadastro de Usuários
Para criar a tela de Cadastro de usuários devemos herdar do formulário Base, da
mesma forma que fizemos no formulário de dashboard. Bastar ir em file->new->other>,
clicar em inheritable Items e depois, do lado direito, selecione o Frmbase.
Figura 146 - Tela New items
Com isso, será criado um formulário herdado do formulário base, necessitamos
fazer algumas configurações. A primeira é renomear o formulário e salvar. A segunda é
adicionar as uses: uServerController, e Book.Functions.Firedac,
eBook.Componentes.Template. A terceira configuração é adicionar no evento onCreate
algumas linhas de código para carregamento do template e inclusão do título. Observe
esses detalhes na Figura 148.
Figura 147 - Configurações iniciais da tela de cadastro
88 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
No evento IWAppFormShow, vamos verificar o estado da query e alimentar a
variável TitleCard, que será responsável por exibir a descrição do título de ação do
formulário da aplicação.
Figura 148 - Implementação da descrição do título de ação
Para que a variável fique acessível precisamos voltar no formulário base e
implementar o código a seguir.
Figura 149 - Inclusão de título do formulário
Depois de implementar a variável TitleCard, devemos voltar nos formulários
anteriores e adicionar o título do formulário em utilização.
Para finalizar o back-end, é preciso fazer o mesmo processo realizado no
formulário de listagem de usuário, criando a procedure responsável pelas funções crud
na tela de cadastro.
Assim como criamos uma procedure prc_crud na tela de listagem, criaremos
agora uma procedure com o mesmo nome para a tela de cadastro. Essa procedure
executará as ações de gravação e cancelamento do cadastro de usuários. Em minhas
aplicações mantenho como padrão o prc_crud para todas as ações de crud.
Antes de implementar todo o código da procedure vamos registrá-la no evento
onCreate do formulário. Como já implementamos alguns códigos neste evento, após a
alteração, ele deve apresentar o código conforme a Figura 151.
89 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 150 - Inclusão do registro de callback
Como visto anteriormente, a procedure prc_crud poder ser dividida em: entrada
de parâmetro, onde irei separar o que é ação e o que é a chave primária; e o que deve
ser executado a partir do parâmetro ação.
Na Figura a seguir veremos a implementação da ação de cadastro e
cancelamento do formulário.
Figura 151 - Implementação das ações
90 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
O que temos de diferente na procedure de crud é uma função que está na unit
ebook.Database.Firedac, que será disponibilizada no SVN. Esta função retorna o
próximo número do generator. Existe também, uma procedure responsável pelo
redirecionamento da página, o restante do código e o que o programador Delphi está
acostumado a trabalhar.
Para testar o formulário, após concluirmos as implementações, é necessário
adicionar
a
unit
do
formulário
no
ServerController.
E
na
procedure
IWServerControllerBaseCreate implementar sua inclusão conforme apresentado na
Figura 153.
Figura 152 - Implementação da utilização de Handlers
Com o nosso back-end todo configurado, podemos ver os campos em nossa base
de dados que podemos disponibilizar para o usuário, de acordo com a Figura a seguir.
Figura 153 - Campos no banco de dados
Adicione no formulário quatro IWDBEDIT para exibir e cadastrar os campos
acima. Adicione também um TDataSource para ligar a query de cadastro. Uma
observação, no IWDBEDIT responsável pelo cod_usuario, devemos desabilitar sua
91 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
propriedade, deixando disponível apenas para leitura. Para facilitar vou dar aos
IWDBEDITS os mesmos nomes dos campos na base de dados.
Como fizemos no Login, iremos alterar o datatype do IWDBEDIT que está com o
nome USU_SENHA para o datatype password. A visualização do formulário deve estar
conforme Figura 155.
Figura 154 - Formulário Cadastro do usuário
Entramos na parte final na criação do formulário, falta apenas criar o front-end
da aplicação.
No onCreate do formulário definimos que vamos usar o
FrmCadastroUsuario.HTML. Abra seu editor de HTML, crie a estrutura base do HTML
conforme
a
Figura
156
e
salve
na
pasta
cadastro
com
o
nome
FrmCadastroUsuario.HTML.
Figura 155 - Estrutura base HTML
Para facilitar seu entendimento de como funciona a estrutura HTML vou
desenhar primeiramente como desejo visualizar o meu formulário de cadastro no paint.
Observe a Figura 157.
92 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 156 - Desenho do formulário de cadastro
Com o formulário desenhado, recomendo a você analisar quantas linhas vai
precisar e quais componentes vai utilizar. Analisando a Figura 157 podemos ver que são
utilizadas 4 linhas, sendo:
➢ a primeira para o código;
➢ a segunda para o usuário e senha;
➢ a terceira para o e-mail; e
➢ a quarta para os botões.
A linha preta abaixo do e-mail é um componente web que usaremos. Ele é
declarado com a tag <hr>. Para facilitar o entendimento de como funciona grids
Bootstrap, recomendo que leia o material do link:
https://www.w3schools.com/bootstrap4/bootstrap_grid_system.asp.
Para deixar a aplicação com o visual mais moderno e apresentável vamos
adicionar um componente card conforme a Figura a seguir.
Figura 157 - Componente card
93 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Vamos alterar a descrição minha lista para a variável que criamos no formulário
base com o nome de {%TitleCard%}. Dentro de body, adicionaremos nossa primeira
linha e implementaremos o primeiro input.
Observação importante: é necessário adicionar a class form-control na
propriedade CSS no Object inspector do Delphi.
A Figura a seguir mostra a primeira linha e a alteração da descrição minha lista.
Figura 158 - Inclusão do título e implementação da primeira linha do formulário
O que temos no código da Figura 159 é a declaração de uma linha utilizando a
classe Row. Na linha seguinte, informamos o tamanho da coluna. Na próxima linha,
como vimos no capítulo Bootstrap, é a forma correta de implementar um input.
94 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 159 - Resultado da implementação do input cod_usuario
Implementemos a segunda linha. A partir do desenho do formulário (Figura 157),
é possível identificar que utilizaremos duas colunas - uma para o nome e a outra para o
password. Observe como implementar as colunas na Figura a seguir.
Figura 160 - Implementação da segunda linha do formulário
95 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Figura 161 - Resultado da implementação da segunda linha do formulário
Agora implementaremos a 3 linha e a tag <hr> para separar os campos de
cadastros e os botões, conforme o código na Figura a seguir.
Figura 162 - Implementação da terceira linha do formulário
Figura 163 - Resultado da implementação da terceira linha do formulário
96 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Para implementar a quarta e última linha do formulário de cadastro vamos
adicionar uma linha e dois componentes botões, conforme Figura a seguir.
Figura 164 - Implementação da quarta linha do formulário
Podemos observar que na declaração do componente botão existe uma
chamada a uma função JAVASCRIPT, na qual iremos passar o parâmetro ação e a chave
primária. Vamos declarar como chave o valor zero porque utilizaremos o valor que está
anexado à variável global internamente no formulário. Assim, aproveitaremos apenas a
ação a ser executada. Para finalizarmos, vejamos então se o resultado do HTML ficou
idêntico ao que apresentamos na Figura 157.
Figura 165 - Figura final do formulário de cadastro de usuário
97 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
CAPÍTULO 17
Criando API com IntraWeb
(Jose Nilton Pace)
O IntraWeb XIV introduziu um novo recurso chamado "Content Handlers".
Usando content handlers, você pode redirecionar uma solicitação para uma classe
descendente TContentBase. Essa classe é responsável por fornecer o conteúdo real da
resposta. Content handlers não são componentes. Eles são classes leves e devem ser
criados em tempo de execução.
17.1 – Criação de um novo TcontentHandler
Criar uma nova classe TContentHandler é muito simples. Este tutorial mostrará
como criar um novo manipulador de conteúdo para responder com um documento XML.
➢ Crie um novo servidor IntraWeb Stand Alone usando o assistente de projeto
IntraWeb. Em seguida, crie uma nova unidade, denomine IW.Content.XML e
adicione este código a ela:
Figura 166 - Criação do IW.Content.XML
98 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
➢ No ServerController, adicione este código à seção de inicialização:
Figura 167 - Adicionando a chamada GiveMeSomeXML
E no Uses do ServerController adicione este:
Figura 168 - Adicionando uses obrigatória
➢ Agora crie e execute seu aplicativo. Abra seu navegador e digite este URL:
http://127.0.0.1:8888/GiveMeSomeXML (observe que a porta pode ser
diferente). Você verá algo assim:
Figura 169- Resultado da Implementação
17.2 – Explicando a implementação
Primeiro, criamos uma nova classe descendente TContentBase. Cada content
handler customizado deve descender desta classe. Dentro do método Create(), devemos
definir mFileMustExist como FALSE. Quando TRUE, o método TContentBase.Execute()
irá procurar por este arquivo e se não for encontrado irá responder com o código HTTP
404.
99 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Então, tudo o que temos que fazer aqui é substituir o método
TContentBase.Execute() e escrever diretamente na instância do objeto aReply. A
primeira coisa que fizemos foi definir a propriedade aReply.ContentType. Na verdade,
isso altera o campo de cabeçalho Content-Type HTTP em nossa resposta. Neste caso,
queremos responder com um XML real (e não uma string XML dentro de um HTML),
então usamos uma das constantes predefinidas na unit IWMimeTypes.
Então, escrevemos um XML diretamente para a instância aReply, usando um
de seus métodos, e pronto!
Quão poderoso é isso? Você pode criar descendentes de TContentBase para
lidar com qualquer tipo de solicitação. Você também pode criar um cliente Indy para
postar solicitações para seu aplicativo IntraWeb implementando um protocolo
personalizado
e
sistema
de
mensagens.
As
possibilidades
são
infinitas.
17.2 – Demo
Uma demonstração totalmente funcional contendo este código pode ser
encontrada neste link:
https://github.com/Atozed/IntraWeb/tree/master/XIV/Delphi/CustomContentHandlers
100 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
CAPÍTULO 18
Considerações finais
Nos capítulos iniciais apresentei alguns aspectos do IntraWeb e do Bootstrap. No
capítulo três mostrei alguns cases de sucesso, que evidenciam um mundo de
possibilidades quando trabalhamos com o IntraWeb.
Nos capítulos seguintes ensinei como criar a base necessária para iniciar o estudo
ou até mesmo a migração de uma aplicação. Mais adiante, expliquei um pouco sobre
front-end e back-end para facilitar seu entendimento acerca da criação de aplicações
com o IntraWeb.
No capítulo dezessete, José Nilton Pace ensina como construir um API utilizando
o IntraWeb, mostrando a versatilidade dessa ferramenta.
O IntraWeb é fantástico, mas ainda temos muito o que estudar e apreender, pois
existe uma infinidade de recursos não abordados neste e-book e que exigem uma base
mais consolidada sobre HTML, CSS e JAVASCRIPT. Nesse material prestigiamos o ensino
da base necessária para que qualquer pessoa possa criar uma aplicação utilizando o
IntraWeb. Ensinei a criação passo a passo de:
➢ Tela de Login;
➢ Tela de Dashboard;
➢ Utilização de Templates admin
➢ Tela de Consulta de usuários utilizando Datatable Serve-Side;
➢ Tela de Cadastro de usuários;
➢ Utilização de url amigável;
➢ Navegação utilizando ajaxCall; e
➢ Implementação de API com IntraWeb.
Espero que este livro seja capaz de abrir novas possibilidades e que ajude você,
programador Delphi, a migrar ou criar sua aplicação web.
101 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Referências bibliográficas
Atozed. Disponível em: https://www.atozed.com/
Bootstrap 4. Disponível em: https://getbootstrap.com/
Input. Disponível em: https://developer.mozilla.org/pt-BR/docs/Web/HTML/Element/input
GitHub. Disponível em: https://github.com/
Template AdminLTE. Disponível em: https://github.com/ColorlibHQ/AdminLTE
/archive/v3.0.5.zip
Tutorialrepublic. Disponível em: https://www.tutorialrepublic.com/twitter-bootstrap-tutorial/
w3schools. Disponível em: https://www.w3schools.com/bootstrap
102 por Eduzz.com
Licenciado para - Marcelo Tavares Lima - 92469108004 - Protegido
Download