Criando um sistema em Ajax usando YUI - parte 1
Categories: Ajax, Engenharia de software, Software Livre, Tecnologia, WEB 2.0, YUI
-
Iniciarei uma série de artigos mostrando na prática como criar um sistema usando o framework Yahoo! YUI.
Nesse primeiro artigo usarei os templates "Grids CSS" para criar a(s) página(s) sem se preocupar com css (já iniciando dentro dos padrões web) e definirei os menus da aplicação usando os componentes de Menu do yui. Os modelos do framework são importantes principalmente se você não tem prática ou desconhece sobre Web Standards.
O framework
Primeiro vamos baixar e adicionar ao projeto as bibliotecas e templates do Framework. A pasta build contém as bibliotecas e folhas de estilo e a pasta examples contém modelos de usabilidade do framework.
Criando o modelo
Vamos criar uma página que será o front da aplicação. Crie um index.html e escolheremos um dos templates já disponibilizados.
O próprio Yahoo! recomenda o uso do modo Strict mostrando que se comprometem com os padrões. Indicam no Getting Started a seguinte assinatura doctype:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<!– layouts require "Standards Mode" rendering, hich the 401-strict doctype triggers –>
Precisamos acrescentar a referência para os arquivos css do yui:
<link type="text/css" rel="stylesheet" href="js/yui/build/reset/reset.css" />
<link type="text/css" rel="stylesheet" href="js/yui/build/fonts/fonts.css" />
<link type="text/css" rel="stylesheet" href="js/yui/build/grids/grids.css" />
Definindo o esboço da página
Para usar o Grid CSS espera-se que exista a seguinte estrutura, onde os elementos já sao definicos como:
<div id="doc">
<div id="hd"></div> <!– header –>
<div id="bd"></div> <!– body –>
<div id="ft"></div> <!– footer –>
</div>
Dividindo a página em 3 regiões: hd (Cabeçalho), bd (Corpo) e ft (Rodapé).
Escolhendo o template
Após criar-mos as marcações exigidas pelo Grids CSS escolheremos um dos templates definidos para controlar as regiões de conteúdo.
Esses templates controlam duas regiões de conteúdo pré-definidas pelo framework denominadas em região "primária" e "secundária" (ou sidebar) como na imagem ao lado.
O Grids CSS provê 7 templates onde 6 deles especificam a estrutura de conteúdo em região "principal" e "barra lateral". o Sétimo template define um layout sem a barra lateral onde a região principal ocupa toda a extensão da página.
A imagem ao lado exibe os templates com suas respectivas identificações.
Utilizarei o "yui-t2" nessa série.
Esse template escolhido está mais próximo de um sistema padrão com boa largura (180px) para a região lateral onde ficarão os menus e 550px para a região de conteúdo.
Especificando o template
Acrescente no div "doc" a referência ao "class" do modelo escolhido.
<div id="doc" class="yui-t2">
A página ficará assim:
…
<body>
<div id="doc" class="yui-t2">
<div id="hd"></div> <!– header –>
<div id="bd"></div> <!– body –>
<div id="ft"></div> <!– footer –>
</div>
</body>
…
Definindo o conteúdo
Escolhemos um modelo que tem duas regiões de conteúdo. Vou acrescentar duas regiões definindo a área de menus e de conteúdo principal no corpo da aplicação:
<div id="doc" class="yui-t2">
<div id="hd"></div>
<div id="bd">
<div id="menu" class="yui-b"></div>
<div id="conteudo" class="yui-main"></div>
</div>
<div id="ft"></div>
</div>
Observe que a disposição não tem importancia porque a ordem dos elementos que definem as regiões de conteúdo é controlada no css que determina que o estilo "yui-main"(o principal) será à direita (no caso do nosso template escolhido).
Acrescentarei na região do conteúdo principal (yui-main) mais duas regiões. Uma será para apresentar os formulários em cima da coluna "main" e os grids resultantes das ações dessess formulários na região de baixo, ficando assim:
<div id="doc" class="yui-t2">
<div id="hd"></div>
<div id="bd">
<div id="menu" class="yui-b"></div>
<div id="conteudo" class="yui-main">
<div class="yui-b">
<div id="formulario" class="yui-g"></div>
<div id="grid" class="yui-g"></div>
</div>
</div>
</div>
<div id="ft"></div>
</div>
Adicionando os Menus
Importarei os componentes usados para criar os menus dinâmicos. Acrescente:
<!– Dependências –>
<link type="text/css" rel="stylesheet" href="js/yui/build/menu/assets/menu.css" />
<script type="text/javascript" src="js/yui/build/yahoo/yahoo.js"></script>
<script type="text/javascript" src="js/yui/build/event/event.js"></script>
<script type="text/javascript" src="js/yui/build/dom/dom.js"></script>
<script type="text/javascript" src="js/yui/build/container/container_core.js"></script>
<!– Componente –>
<script type="text/javascript" src="js/yui/build/menu/menu.js"></script>
Escolhi usar um modelo de menu clássico, para isso definimos a estrutura deles:
<div id="bd">
<!– Menu –>
<div id="menu" class="yui-b">
<div id="basicmenu" class="yuimenu">
<div class="bd">
<ul>
<li class="yuimenuitem first-of-type">Documentos
<div id="doc_menu" class="yuimenu">
<div class="bd">
<ul>
<li class="yuimenuitem"><a href="#">Novo Documento</a></li>
<li class="yuimenuitem"><a href="#">Pesquisa</a></li>
</ul>
</div>
</div>
</li>
<li class="yuimenuitem">Processo</li>
<li class="yuimenuitem">Sair</li>
</ul>
</div>
</div>
</div>
<!– Fim Menu –>
</div>
Modifiquei alguns estilos padrões criando um outro arquivo css com as seguintes definições(aconselho a não alterar diretamente nos arquivos do framework, crie um outro arquivo de css e acrescente suas customizações porque no caso de um upgrade do framework você não as perde) :
div.yui-b p {
margin:0 0 .5em 0;
color:#999;
}
div.yui-b p strong {
font-weight:bold;
color:#000;
}
div.yui-b p em {
color:#000;
}
h1 {
padding:.25em .5em;
background-color:#ccc;
}
div.yuimenu {
position:absolute;
visibility:hidden;
border:0px;
}
div.yuimenu li a {
color: #3333FF;
}
#basicmenu {
position:static;
visibility:visible;
}
#bd{
height:400px;
/*background-color: #0059A5;*/
width: 760px;
margin-top: -13px;
}
#doc {
width:760px;
}
.yui-b{
width: 550px;
}
.yui-main{
width: 550px;
}
.yui-g{
width: 550px;
}
Instanciando o componente Menu
Acrescente os componentes:
<script type="text/javascript" src="js/yui/build/yahoo/yahoo.js"></script>
<script type="text/javascript" src="js/yui/build/event/event.js"></script>
Adicione um evento para carregar os menus ao carregar a página.
YAHOO.util.Event.addListener(window, "load", YAHOO.example.onWindowLoad);
A função YAHOO.example.onWindowLoad é um Listener para o evento "load" do objeto window.
Definiremos o objeto Menu na função YAHOO.example.onWindowLoad
/**
* @id YAHOO.example.onWindowLoad
* @classDescription Instancia Menus
* @param {Object} p_oEvent
*/
YAHOO.example.onWindowLoad = function(p_oEvent) {
function hideSubmenus() {
if(oMenu.activeItem) {
var oSubmenu = oMenu.activeItem.cfg.getProperty("submenu");
if(oSubmenu) {
oSubmenu.hide();
}
}
}
function cancelTimer() {
if(nTimeoutId) {
window.clearTimeout(nTimeoutId);
}
}
function onSubmenuMouseOut(p_sType, p_aArguments, p_oMenu) {
cancelTimer();
nTimeoutId = window.setTimeout(hideSubmenus, 100);
}
var nTimeoutId;
var oMenu = new YAHOO.widget.Menu("basicmenu", { position: "static" });
oMenu.render();
var doc = oMenu.getItem(0).cfg.getProperty("submenu");
oMenu.mouseOverEvent.subscribe(cancelTimer);
doc.mouseOverEvent.subscribe(cancelTimer);
doc.mouseOutEvent.subscribe(onSubmenuMouseOut, doc, true);
YAHOO.util.Event.addListener(document, "click", hideSubmenus);
}
Criei funções para controlar o aspecto de "tirar o mouse sobre um Menu" para ele se recolher porque por padrão isso não acontece e é chato.
Definindo a estrutura dinâmica
No próximo artigo mostrarei como fazer um cadastro com upload de arquivos, por enquanto ficamos com esse exemplo já chamando um formulário no menu documento -> Novo Documento.

(6 votes, average: 4 out of 5)

October 16th, 2006 at 5:57 pm
contato
January 15th, 2007 at 10:32 am
Mui bueno!
Valeu Milfont!
March 29th, 2007 at 9:54 am
teste
April 18th, 2008 at 4:56 am
[…] Em um artigo passado mostrei como usar o Yahoo YUI Grids para modelar o layout sem se preocupar com css e disposição dos elementos. A produtividade é grande quando se usa um framework desses que facilita o desenvolvimento de um layout web, mesmo assim ainda perdemos um bom tempo criando tags e adequando o padrão. […]
April 29th, 2008 at 12:15 pm
[…] É a segunda parte do tutorial que estou fazendo. […]
June 1st, 2008 at 10:38 am
péssima tentativa…não explica com clareza onde cada coisa deve ser colocada….
tutorial deve ser detalhado..