Escolar Documentos
Profissional Documentos
Cultura Documentos
Este documento visa expor uma metodologia específica para a criação de protótipos
de projetos para o Lumis Portal Suite (LPS, usado em servidores Microsoft) e para o
Lumis Portal Java (LPJ, usado em servidores Java), focando no desenvolvimento de
protótipos HTML prontos para serem usados no Lumis, com o mínimo ajuste de código
possível.
Na medida em que mais e mais desenvolvedores Lumis aderirem a essa metodologia,
ficará mais simples o intercâmbio de conhecimento (por exemplo, através do Lumis
Information Exchange, o LINX: http://linx.lumis.com.br) e as manutenções posteriores
ao lançamento dos projetos.
1. Interfaces de serviço
No Lumis entendemos por interface de serviço o resultado visual final que monta uma
dada interface. Como em HTML só podemos montar estruturas em caixas (sejam elas
em <div>, <table>, <p>, <h1>, etc.), a grande maioria das interfaces de serviço
montará visualmente uma caixa. E como o código HTML é lido de cima para baixo, a
“ponta” superior esquerda da caixa corresponderá ao início do código de uma
interface, e a “ponta” inferior direita corresponderá ao final do código de uma interface.
Talvez o entendimento fique mais simples visualizando a imagem abaixo:
Ou mesmo:
Uma interface precisa ser montada “dentro de outra” sempre que ela precisa aparecer
entre o início e o fim do código de outra interface. Nesse caso o entendimento fica
bem mais simples se visualizarmos através de imagens:
Imagem 1.2: Muitas vezes, por razões técnicas, precisamos montar um protótipo
HTML que considere interfaces complexas, quando uma interface precisa vir montada
“dentro da outra”. É sempre recomendável já prever todas essas situações ainda no
wireframe, de modo que o protótipo HTML já as levará em consideração.
A solução, nesses casos, é tentar separar a interface “que envolve a outra” em blocos.
Por exemplo, no caso do exemplo na imagem 1.2, a interface de Agenda do Dia
poderia vir separada em dois blocos: o primeiro bloco montaria apenas o ícone e o
título, e traria um <div> sem borda abaixo. O segundo bloco viria somente após o fim
da interface de Texto Simples, e montaria o calendário dentro de um <div> sem borda
acima.
Se o primeiro bloco não tiver conteúdo cadastrável (ou seja, se o título “Agenda do
Dia” puder ser escrito hard-coded diretamente no código), ele poderá até mesmo ser
montado por uma interface de serviço HTML no Lumis. Se, no entanto, o conteúdo
precisar ser cadastrável (ou seja, conteúdo dinâmico), não teremos como evitar o uso
de 2 XSLs para montar os dois blocos da interface. É preciso levar em consideração
que a mesma interface “visual” que vemos na imagem, será montada por duas
interfaces de serviços distintas no Lumis, correspondendo a cada bloco que
mencionamos acima.
O ideal nesses casos é que o código HTML do protótipo seja bem comentado,
explicando a necessidade de separação da interface em blocos:
Repare que esse tipo de situação também tem impacto na forma como é montado o
CSS do projeto. Seria inútil ter uma classe que montasse toda a caixa de Agenda do
Dia como um único <div>, por mais que esta fosse a melhor forma de montar, visto
que nesse caso não temos como passar por cima de uma limitação de arquitetura do
projeto. Então, a melhor solução é montar logo 3 classes distintas: “agenda_bloco1”
para o topo, “agenda_texto” para a interface de texto simples, e “agenda_bloco2” para
o calendário.
Alguns casos são tão complexos que não admitem sequer a solução dada acima (1.1),
de separar a interface em blocos. Nesses casos a única solução é o uso do
procedimento de “teleporte de HTML”, que no final das contas não é algo tão ruim
quanto parece, mas que ainda assim só deve ser usado em último caso.
Vejamos um exemplo:
<div id="showSource"></div>
<script type="text/javascript">
if(document.getElementById("showSource")) {
document.getElementById("showSource").innerHTML=document.ge
tElementById("source").innerHTML;
}
</script>
***
Uma variação desse código leva em consideração a questão de ele só funcionar com
o JavaScript do browser habilitado. Neste caso, é melhor não esconder o <div> de ID
"source" usando CSS, e sim JavaScript - dessa forma, com o JavaScript do browser
desabilitado, a interface não será “teleportada”, mas da mesma forma não será
escondida, o que possibilitará ainda alguma forma de interação e navegação no site,
mesmo que não seja a ideal.
Vejamos o código:
<div id="showSource"></div>
<div id="source">
<div style="margin:20px 0;border:1px solid
#ccc;background:#f2f2f2;width:200px;height:200px;padding:4px;">
 
<p><a href="http://www.lumis.com.br"
target="_blank">Link</a></p>
</div>
</div>
document.getElementById("source").style.display="none";
document.getElementById("showSource").innerHTML=document.getElem
entById("source").innerHTML;
}
</script>
<noscript>Você precisa ter o JavaScript habilitado no browser
para ter uma visualização ideal desta página.</noscript>
Caso o “teleporte de HTML” seja definido como solução final ainda no wireframe ou na
construção do protótipo HTML do projeto, o ideal é deixar o código já montado com os
<div>s e seus respectivos IDs, assim como os scripts de “teleporte” – Tudo o que pode
ser montado e testado ainda no protótipo HTML é preferível a opção de descobrir os
erros somente quando já estamos montando o projeto no Lumis, mexendo com
montagem e XSLs de serviços.
No entanto, essa será apenas nossa sugestão para a organização de arquivos. Muitas
empresas têm um procedimento específico para a criação de estruturas de arquivos e
suas nomenclaturas. Se não for possível seguir nossa sugestão, de qualquer forma
ainda é muito importante que sigam, em seu protótipo HTML, a mesma estrutura que
usarão no servidor final do projeto.
Os arquivos no LPS devem ficar organizados a partir da pasta root (no caso, a pasta
“/release”), que no servidor final será a mesma pasta onde encontramos o arquivo
“main.asp”, pois todas as chamadas para imagens e outros arquivos partem dali.
Todos os HTMLs criados para o protótipo devem ficar nessa mesma pasta, e a partir
dela criaremos uma outra pasta com um nome abreviado do projeto, podendo mesmo
ser um acrônimo (ex: um projeto para uma seguradora chamada “Big Bird Seguros”
poderia usar o acrônimo “bbs” para nomear a pasta com os arquivos do projeto).
Recomendamos que todos os nomes de pastas sejam escritos em caixa baixa.
Imagem 2.1: Estrutura final de pastas para arquivos de css, imagens, js e mídia no
protótipo HTML para um projeto em LPS. A pasta “release” é a pasta root, onde temos
o main.asp – o arquivo “home.html” é apenas um dos inúmeros HTMLs que poderão
ser montados para este protótipo, e todos eles precisam ficar na mesma pasta
“release”.
Repare que na imagem acima escolhemos um nome genérico para a pasta do projeto:
“project”. É este nome que precisa ser ajustado para refletir o nome do seu projeto (de
preferência abreviando nomes grandes).
Nos HTMLs de protótipo, é assim que chamaremos, por exemplo, uma imagem
intitulada “image.gif”:
Já um arquivo css intitulado “project.css” seria chamado da seguinte forma nos HTMLs
de protótipo:
Os arquivos no LPJ devem ficar organizados a partir da pasta root (no caso, a pasta
“/www”), que no servidor final será a mesma pasta onde encontramos o arquivo
“main.jsp”, pois todas as chamadas para imagens e outros arquivos partem dali.
Todos os HTMLs criados para o protótipo devem ficar nessa mesma pasta, e a partir
dela criaremos uma outra pasta com um nome abreviado do projeto, podendo mesmo
ser um acrônimo (ex: um projeto para uma seguradora chamada “Big Bird Seguros”
poderia usar o acrônimo “bbs” para nomear a pasta com os arquivos do projeto).
Recomendamos que todos os nomes de pastas sejam escritos em caixa baixa.
Quando terminar de criar a estrutura, ela deverá parecer assim no seu Windows
Explorer (ou algum programa similar no Linux):
Imagem 2.2: Estrutura final de pastas para arquivos de css, imagens, js e mídia no
protótipo HTML para um projeto em LPJ. A pasta “www” é a pasta root, onde temos o
main.jsp – o arquivo “home.html” é apenas um dos inúmeros HTMLs que poderão ser
montados para este protótipo, e todos eles precisam ficar na mesma pasta “www”.
Repare que na imagem acima escolhemos um nome genérico para a pasta do projeto:
“project”. É este nome que precisa ser ajustado para refletir o nome do seu projeto (de
preferência abreviando nomes grandes).
Nos HTMLs de protótipo, é assim que chamaremos, por exemplo, uma imagem
intitulada “image.gif”:
Já um arquivo css intitulado “project.css” seria chamado da seguinte forma nos HTMLs
de protótipo:
Após terminar alguns trechos de seus HTMLs, é recomendável ir validando online para
verificar se não existe algum erro de XHTML:
http://validator.w3.org/
Alguns programas de edição de código podem vir com validadores XHTML embutidos,
o que pode facilitar o processo.
Na realidade o Lumis monta muito mais código do que o exposto nos exemplos
abaixo, porém estamos focando apenas no código “mínimo”, ou seja, aqueles trechos
de HTML que realmente irão influenciar a estrutura da visualização final. Por exemplo,
em torno de cada interface no LPS e no LPJ em modo de layout Com Tabelas, são
montadas novas tabelas dentro das já existentes, e que são consideradas em nossos
exemplos abaixo; Porém, essas tabelas não interferem em nada na estrutura final do
layout, por isso optamos por ignorá-las, juntamente com todo o código adicional que
não influi no resultado final dentro do Lumis.
O LPS não possui modo de layout Sem Tabelas, como no LPJ; Portanto, qualquer
projeto feito nele não poderá ser Tableless, já que o Lumis montará automaticamente
tabelas em torno das interfaces de serviço inseridas nas páginas.
<div class="cEZTPage">
</td>
</tr>
</table>
</td>
<td width="580" class="cEZTPageArea1Column1">
</td>
</tr>
</table>
</div>
</body>
</html>
cEZTBody
Esta classe serve para que possamos aplicar layout css na tag <body>. Não é
possível adicionar outra classe nesta tag, nem utilizar outro título de classe, pois o LPS
não permite.
cEZTPage
Esta classe serve para que possamos aplicar layout css na tag <div> em torno de toda
a estrutura, ou seja: imediatamente após a tag <body>. Normalmente utilizado para
centralizar o layout por css, embora possa servir também para aplicar bordas e
espaçamentos globais. Não é possível adicionar outra classe nesta tag, nem utilizar
outro título de classe, pois o LPS não permite.
***
Finalmente, podemos falar sobre a lógica exposta no código. Reparem que na primeira
tabela temos somente uma única interface (“HEADER”), pois ali temos uma área com
uma única coluna. Já na segunda tabela temos duas interfaces (“MENU” e “NEWS
LIST”), cada uma em uma coluna em separado.
Dentro de uma coluna, contanto que insiramos uma interface abaixo da outra,
podemos ter virtualmente quantas interfaces diferentes quisermos. Porém, quando as
interfaces precisam vir uma ao lado da outra, teremos de prever a criação de novas
células de tabela em nosso protótipo.
Em nosso exemplo acima, a largura total do site é de 770 pixels. A primeira área, com
o cabeçalho, tem apenas uma única coluna e, portanto, também tem 770 pixels. Já a
segunda área (ou segunda tabela) vem com duas colunas: a coluna do MENU tem 190
pixels e a coluna de NEWS LIST tem 580 pixels. Geralmente a soma das colunas de
cada área será sempre a largura total do site, ou seja: 190px + 580px = 770px.
Veja abaixo um diagrama que mostra a lógica pela qual essas classes são
inclusas no código HTML final:
Nota: Usando JQuery, é possível aplicar estilos as áreas (<table>) e colunas (<td>)
montadas automaticamente pelo Lumis em torno das interfaces. Para tal você
precisará apenas de uma interface HTML que traga um marcador através do ID de um
<div>, por exemplo:
Usando esse método o layout das páginas ficará menos “preso”, e você poderá
futuramente adicionar novas áreas entre as áreas já existentes, sem precisar se
preocupar em alterar a numeração de suas Classes Genéricas (na verdade, nem
precisará mais utilizá-las).
No LPJ, nosso HTML de protótipo deverá ser criado de acordo com o tipo de layout
que será utilizado para as respectivas páginas no Lumis: Com Tabelas ou Sem
Tabelas (o que permite portais Tableless). Também existe a possibilidade do uso de
Template Files, o que permite um controle total do código HTML gerado, que
deixaremos para falar no final deste tutorial.
<div class="cLumPage">
</td>
</tr>
</table>
</td>
<td width="580">
</td>
</tr>
</table>
</div>
</body>
</html>
cLumBody
Esta classe serve para que possamos aplicar layout css na tag <body>. Não é
possível adicionar outra classe nesta tag, nem utilizar outro título de classe, pois o LPS
não permite.
cLumPage
Esta classe serve para que possamos aplicar layout css na tag <div> em torno de toda
a estrutura, ou seja: imediatamente após a tag <body>. Normalmente utilizado para
centralizar o layout por css, embora possa servir também para aplicar bordas e
espaçamentos globais. Não é possível adicionar outra classe nesta tag, nem utilizar
outro título de classe, pois o LPS não permite.
***
Finalmente, podemos falar sobre a lógica exposta no código. Reparem que na primeira
tabela temos somente uma única interface (“HEADER”), pois ali temos uma área com
uma única coluna. Já na segunda tabela temos duas interfaces (“MENU” e “NEWS
LIST”), cada uma em uma coluna em separado.
Dentro de uma coluna, contanto que insiramos uma interface abaixo da outra,
podemos ter virtualmente quantas interfaces diferentes quisermos. Porém, quando as
interfaces precisam vir uma ao lado da outra, teremos de prever a criação de novas
células de tabela em nosso protótipo.
Em nosso exemplo acima, a largura total do site é de 770 pixels. A primeira área, com
o cabeçalho, tem apenas uma única coluna e, portanto, também tem 770 pixels. Já a
segunda área (ou segunda tabela) vem com duas colunas: a coluna do MENU tem 190
<body class="cLumBody">
<div class="cLumPage">
</div>
</div>
<br class="cLumAreaSeparator" />
</div>
</div>
</div>
<br class="cLumAreaSeparator" />
</div>
</body>
</html>
B. Repare que o DOCTYPE está configurado para XHTML Transitional, se quiser usar
XHTML Strict em seu projeto, é recomendável que mude já no protótipo HTML, pois
algumas inconsistências podem aparecer quando mudar de um DOCTYPE para o
outro.
cLumBody
Esta classe serve para que possamos aplicar layout css na tag <body>. Não é
possível adicionar outra classe nesta tag, nem utilizar outro título de classe, pois o LPS
não permite.
cLumPage
Esta classe serve para que possamos aplicar layout css na tag <div> em torno de toda
a estrutura, ou seja: imediatamente após a tag <body>. Normalmente utilizado para
centralizar o layout por css, embora possa servir também para aplicar bordas e
espaçamentos globais. Não é possível adicionar outra classe nesta tag, nem utilizar
outro título de classe, pois o LPS não permite.
cLumArea
Esta classe é inserida automaticamente em todo <div> que monta uma área no Lumis.
Este <div> é o correspondente do <table> montado para cada área no layout Com
div.cLumArea {float:none;}
cLumColumn
Esta classe é inserida automaticamente em todo <div> que monta uma coluna no
Lumis. Este <div> é o correspondente do <td> montado para cada coluna no layout
Com Tabelas. Esta classe vem com o atributo float:left; aplicado pelo css padrão do
LPJ (portal.css), caso queira anular o float, use em seu css:
div.cLumColumn {float:none;}
cLumAreaSeparator
Esta classe é aplicada em tags <br /> ao final de cada <div class=”cLumArea”>
montado automaticamente a medida que adicionamos áreas novas a página pela
edição dentro do Lumis. Esta class vem com o atributo cler:both; aplicado pelo css
padrão do LPJ (portal.css), e serve para dar clear nos floats das tags <div> montando
colunas acima. Caso queira anular o clear, use em seu css:
br.cLumAreaSeparator {clear:none;}
Porém, o mais recomendado é simplesmente não mostrar essas tags <br />, evitando
causar espaçamentos indevidos entre as interfaces de serviço:
br.cLumAreaSeparator, br.cLumRowSeparator
{clear:none;display:none;}
Repare que o código acima precisa ser utilizado ainda que você não aplique o css
padrão do LPJ em seu projeto, já que as tags <br /> são montadas automaticamente
pelo Lumis. No HTML de exemplo acima não incluímos as tags <br /> com classe
cLumRowSeparator porque elas não interferem na visualização final do layout. Se
quiser “sumir” com essas tags <br />, entretanto, recomendamos que aplique o
display:none; logo em ambas, conforme o trecho de css logo acima.
***
Finalmente, podemos falar sobre a lógica exposta no código. A versão de layout Sem
Tabelas do LPJ tenta simular o layout criado com tabelas inserindo floats através de
classes css (float:left;). Basicamente toda área monta um <div> com classe cLumArea,
e toda coluna monta um outro <div> com classe cLumColumn dentro do <div> da área.
Isso até funciona bem para layouts básicos, mas dificilmente vai abranger layouts um
pouco mais complexos. Nesses casos, sugerimos que as classes vindas do css
padrão do LPJ sejam anuladas (ver letras C e D acima), ou preferivelmente que o css
padrão sequer seja aplicado no projeto (ainda assim é preciso “sumir” com as tags <br
/> de separação).
Outra questão importante a ser considerada no protótipo HTML – e isto vale tanto para
códigos formulados para o LPS quanto para o LPJ – é nunca usar o evento de onLoad
da tag <body>, ou seja, o <body onload=”javascript:someEvent();”>.
Isto porque o Lumis precisa deste evento para que os scripts padrão do produto rodem
normalmente. Eles são vitais para o correto funcionamento da edição F12, assim como
diversas funcionalidades padrão de certos serviços.
Caso precise usar este evento de qualquer maneira em seu projeto, recomendamos
entrar em contato com o suporte da Lumis. Antes, porém, verifique se não existem
outras possibilidades – por exemplo, muitos menus drop-down usam o evento de
onLoad no <body> para funcionar. Isso, no entanto, pode facilmente ser contornado se
inserirmos o mesmo script em uma tag <div> que esteja em torno do menu, porém
usando o evento de onMouseOver no lugar de onLoad. Como todo menu drop-down
depende de onMouseOver para iniciar a animação do drop-down, não há problema na
transferência.
Os Template Files são arquivos .html aplicados a páginas do Lumis que substituem a
geração automática de HTML do Lumis em torno das interfaces, colunas e áreas. Eles
representam uma customização completa de layout no produto, deixando o HTML
praticamente 100% livre para edição.
A lógica dos Template Files é simples: eles montam uma página .html comum,
podendo inclusive ser gerados diretamente a partir dos HTMLs originais dos protótipos
de projetos. Onde temos o HTML “hard-coded”, não-dinâmico, montando o layout das
interfaces de serviço, bastará substituir o bloco de código que monta a interface
correspondente por uma chamada específica para um ID (identificador único). Na
edição da página ou template de página do Lumis, editaremos uma coluna de modo a
inserir este mesmo ID, e todas as interfaces de serviço inseridas na coluna entrarão no
código final exatamente onde está a chamada para este ID.
Isso significa também que, para projetos onde usamos Template Files, apenas essas
regras se aplicam para a criação do HTML de protótipo:
A. Conforme dito em 4.3, continua sendo proibido utilizar o evento de onLoad da tag
<body>
***
Certamente, são bem menos regras a serem consideradas. Porém, o uso de Template
Files requer maior conhecimento de HTML e css da parte dos montadores no Lumis,
de modo que não irá adiantar muito facilitar a criação de protótipos HTML pelo uso de
Template Files, se na hora de passar o protótipo para o Lumis os montadores tiverem
dificuldades em lidar com os Template Files.
Ocorre que a lógica de trabalho quando estamos desenvolvendo HTML e css é bem
distinta da lógica de montagem dentro do Lumis. Na primeira, estaremos mais
preocupados em criar código HTML limpo e com css bem estruturado, testar o layout
localmente e em diversos browsers diferentes, sempre a procura de erros de layout a
serem corrigidos; Já na última, estaremos preocupados em criar estruturas de canais e
páginas, instanciar serviços e criar as respectivas administrações, criar XSLs com
chamadas dinâmicas a partir do código HTML estático do protótipo, verificar controle
de acesso de usuários, se todos os formulários estão funcionais, etc.
Sabemos que muitas vezes os prazos curtos impedirão que todos os procedimentos
sugeridos nesse tutorial sejam seguidos de acordo, mas em todo caso o importante é
compreender que um planejamento inicial, desde um wireframe que já leve em
consideração quais serviços Lumis serão usados em cada “bloco” de layout, até um
protótipo HTML previamente ajustado para o Lumis, serão sempre bem vindos, e
nunca um tempo gasto desnecessariamente.
Boa sorte!