viniciusaraujo.net

Bordas arredondadas sem imagem.

Vinícius Pitta Lima de Araújo

Agora a moda é Web 2.0 e até estilo já se atribuiu a este conceito. O layout Web 2.0 é composto por cores fortes, vivas, bordas arredondadas e letras grandes. Mas como fazer bordas arredondas? Existem várias maneiras:

Como criar bordas arredondadas
AbordagemPróContra
Substituir o elemento por uma imagem completa com bordas arredondadas. Não há a necessidade de adicionar novos elementos que não têm significado semântico na sua página. O elemento fica com tamanho fixo e caso seja redimensionado ficará distorcido
Utilizar imagem nos cantos da borda. Os elementos não precisam ter tamanho fixo e a borda não fica distorcida. Criação de elementos (div) extras sem significado(Antigamente, eram utilizadas tabelas para esse fim).
Utilizar javascript. Facilidade de implementação. Menor trabalho. Não necessita de imagens. São adicionados elementos à página dos quais você não tem conhecimento ou controle.

Eu gosto da terceira abordagem porque é a mais simples. Você pode se livrar das bordas ou altera-las facilmente sem ter que mudar a estrutura do seu código. Para criar bordas arredondadas usando javascript, eu recomendo o jQuery Corner que é um plugin para jquery. Com ele você poderá criar bordas dos mais diversos tipos sem utilizar imagens com uma linha de código! Basta invocar o método corner utilizando o jquery. Veja o exemplo abaixo.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
 <head>
  <title>Exemplo do jQuery Corner</title>
  <style type="text/css">
   .bordas_arredondadas { background: #CEE574; }
  </style>
  <script src='http://code.jquery.com/jquery-latest.js' type='text/javascript'></script>
  <script src='http://jqueryjs.googlecode.com/svn/trunk/plugins/corner/jquery.corner.js' type='text/javascript'></script>
  <script type="text/javascript">
   $().ready(function() {
    $(".bordas_arredondadas").corner();
   });
  </script>
 </head>
 <body>
  <div id="d1" class="bordas_arredondadas">
   Esse div terá bordas arrendondas
  </div>
 </body>
</html>

A linha 12 do código acima é responsável por criar o efeito de bordas arredondadas no div d1. Note que eu utilizei a classe do div bordas_arredondadas como seletor do jquery. Dessa forma você pode ter vários elementos na página e utilizar uma única linha para criar o efeito em todos. Visite a página do plugin e verá que existem diversos outros efeitos disponíveis. Você poderá criar classes diferentes para cada tipo de efeito que utilizar na sua página e reduzir as linhas de código utilizadas.

Referências
O que você achou dessa postagem?

5 Comentários

Tags: ,

Blogger adicionando linhas em branco extras ao seu post.

Vinícius Pitta Lima de Araújo

Se você edita suas postagens em HTML como eu, já se deparou com esse problema. O blogger adiciona linhas em branco (</br>) para cada linha em branco/quebra de linha que encontra na sua postagem, mesmo se estiver no código HTML. Esse é um comportamento padrão do blog. Isso termina bagunçando sua postagem por completo.

Eu quebrei a cabeça por um tempo e até bolei uma gambiarra usando o jquery para remover os tags </br> extras até descobri que bastava mudar uma configuração do blog. Fuçando a página de ajuda do blogger eu encontrei esta página que trata da situação que me permitiu notar o comportamento estranho do blog pela primeira vez, que foi quando eu usei uma tabela num artigo e apareceram várias linhas extras antes da tabela. Até então o problema tinha passado derpecebido. Isso estava me causando outro problemão: eu não conseguia usar nenhum destacador de sintaxe porque todos eles transformavam o meu código em uma única linha perdendo toda a formatação.

Para alterar a configuração vá no painel do seu blog e na guia Configurações clique em Formatação e marque não para a opção Converter quebras de linha. Lembrando que se você costuma postar usando o editor convencional do blogger e não mexe no código HTML é melhor manter a configuração original.

O que você achou dessa postagem?

0 Comentários

Tags:

Formatando datas nos templates do Blogger

Vinícius Pitta Lima de Araújo

O Problema

Aqueles que têm um blog no blogger e quiseram personalizar o template utilizado no blog provavelmente tiveram uma frustação com relação às datas. Acontece que, apesar de toda a flexibilidade de personalização do sistema de template do blogger, não é possível escolher um formato de data, nem através de código nem através da interface gráfica de configuração, que não esteja na lista padrão da interface gráfica do blogger. Os formatos oferecidos podem servir para muita gente mas acredito que, para nós brasileiros, não sejam os ideais.

Eu também me deparei com esse problema e desenvolvi uma solução relativamente simples que permite utilizar qualquer formato de data no seu template. A solução, infelizmente, requer um pouco de conhecimento de HTML, javascript e dos tags do widget Blog do blogger.

A solução

A solução consiste, basicamente, em se pegar a data fornecida pelo blogger e transforma-la num objeto javascript do tipo Date. Depois o objeto será inserido no código HTML da página utilizando o jQuery e formatado por um script desenvolvido por Matt Kruse.

OK, parece bastante complicado mas não se assuste, eu vou ensinar passo-a-passo como implementar essa solução no seu blog.

Implementando a solução

No guia de implementação eu alterei a data exibida em cada postagem do blog. No meu blog essa data é exibida logo abaixo do titulo da postagem. Para implementar a solução você deverá executar os seguintes passos:

  1. Escolher o melhor formato de data do blogger através da interface gráfica
  2. Disponibilizar os scripts de tercerios no seu blog
  3. Editar o seu template para inserir o código que vai alterar o formato da data
1. Escolhendo o melhor formato de data do blogger

Para nós, o melhor formato de data será aquele que tem a data completa (dia, mês, ano e hora) em formato númerico. Assim conseguiremos facilmente transforma-la em um objeto javascript do tipo Date.

Para mudar o formato da data da postagem no blogger selecione o painel do seu blog. Se você estiver logado na sua conta do blogger e na página principal do seu blog clique no link Personalizar que se encontra na barra superior do blogger no topo do seu blog. No painel do seu blog selecione a aba Layout e depois clique no link Elementos da Página. A página que será exibida mostra o layout do seu blog e todos os widgets instalados. Clique no link Editar do widget Postagens no Blog. Uma janela popup será exibida com as configurações do widget. Marque a terceira opção e selecione o formato de data como mostra a figura abaixo. O formato escolhido exibe a data no seguinte formato: mês(1 ou 2 digitos)/dia(1 ou 2 digitos)/ano(4 digitos) hora(2 digitos de 0 a 12):minutos(dois digitos):segundo(dois digitos) AM ou PM.

página de configuração do widget Postagens do Blog
2. Disponibilizando os scripts necessários no seu blog

A solução utiliza a biblioteca javascript jQuery e as funções desenvolvidas por Matt Kruse para manipulação de datas. Para disponibilizar estes scripts no seu blog vá novamente na aba Layout no painel do blog e clique no link Editar HTML.

Para importar o jquery no seu blog, localize o tag <head> do seu template e dentro dele insira o código a abaixo.

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>

Para inserir as funções de Matt Kruser acesse a versão compacta do código que está disponível na página dele e copie o código. Agora, novamente, dentro do tag <head> no seu template cole o código dentro de um tag <script> como no código abaixo. Desta vez, não será possível colar o código dentro do tag <head> porque o template do Blogger é um arquivo XML e o código javascript certamente terá caracteres que farão com que o processador XML interprete o documento como um documento inválido. A solução é adicionar um widget HTML/Javascript e colar o código. Para adicionar o widget vá na guia Layout e clique em Elementos da Página. Se o sey template permite a adição de novos widgets haverá um link Adicionar um elemento de página. Clique neste link, uma janela popup será exibida com um conjunto de widgets que podem ser adicionados ao seu blog, localize o widget HTML/Javascript e clique no botão Adicionar ao Blog, na tela de configuração do widget cole o código de Matt Kruser que você copiou na página dele no campo conteúdo e salve.

As funções desenvolvidas por Matt permitem que você valide e formate datas e converta datas no formato string em objetos do tipo Date. Porém, para que possamos utilizar as funções plenamente, precisamos traduzir os nomes dos meses e dias que estão, naturalmente, em inglês. Para isso substitua a primeira linha do código compacto que você acabou de copiar pelas duas linhas abaixo.

var MONTH_NAMES=new Array('Janeiro','Fevereiro','Março','Abril','Maio','Junho','Julho','Agosto','Setembro','Outubro','Novembro','Dezembro','Jan','Fev','Mar','Abr','Mai','Jun','Jul','Ago','Set','Out','Nov','Dez');
var DAY_NAMES=new Array('Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sabádo','Dom','Seg','Ter','Qua','Qui','Sex','Sab');
3. Inserir scripts para exibir as datas formatadas no seu template

O passo final para exibir a data das postagens em qualquer formato no seu blog é inserir um script que vai formatar as datas e injetar na página exibida. Esse código poderá ser utilizado com outras datas do seu blog. Este último passo será mais fácil se você tiver conhecimentos básicos sobre os tags de widget do template do blogger.

Acesse novamente a página Editar HTML dentro da aba Layou do painel do seu blog. Se seu blog utiliza um dos templates basicos do blogger deve ter duas sessões sendo que a primeira sessão é a main(Principal). Dentro desta sessão está o widget do tipo Blog cujo nome é Blog1. Dentro desse widget existe uma série de tags do tipo includable, que são partes de código HTML que poderão ser utilizados na montagem do widget Blog. Localize o includable com o id post, ele é o responsável pela formatação das postagens exibidas na sua página. Dentro desse includable localize o trecho de código que exibe o timestamp da postagem. Tente localizar o tag <data:post.timestamp/>.

Após localizar o trecho de código que exibe o timestamp da postagem, o próximo passo é inserir o código que irá transformar o timestamp em um objeto data e injetar a data formatada. Para que seja possível injetar facilmente a data formatada no código do seu blog, será preciso definir o atributo id do tag onde o timestamp está inserido. No caso do meu template, o timestamp é exibido dentro de um tag abbr, que é o tag utilizado para abreviações, então, eu atribui um id único a este tag. Abaixo, veja o código antes da alteração.

<b:if cond='data:top.showTimestamp'>
 <b:if cond='data:post.url'>
  <a class='timestamp-link' expr:href='data:post.url' title='permanent link'>         
   <abbr expr:id='"dataPostagemDisplay_" + data:post.id' class='date' title=''><data:post.timestamp/></abbr>
  </a>
 </b:if>
</b:if>

Agora o código depois da alteração e em seguida a explicação

<b:if cond='data:top.showTimestamp'>
 <b:if cond='data:post.url'>
  <script type="text/javascript">
   $().ready(function() {
    var dataPostagem = new Date(
     getDateFromFormat("<data:post.timestamp/>", "M/d/yyyy hh:mm:ss a"));
    
    var formatoExibicao = formatDate(dataPostagem, "yyyy, dd")
     + " de " + formatDate(dataPostagem, "MMM")
     + " às " + formatDate(dataPostagem, "HH:mm");
    
    var formatoUTC = formatDate(dataPostagem, "yyyy-MM-dd")
     + "T" + formatDate(dataPostagem, "HH:mm:ss")
     + "-0300";
     
    $("#dataPostagemDisplay_<data:post.id/>").html(formatoExibicao);
    $("#dataPostagemDisplay_<data:post.id/>").attr("title", formatoUTC);
   });
  </script>
  <a class='timestamp-link' expr:href='data:post.url' title='permanent link'>         
   <abbr expr:id='"dataPostagemDisplay_" + data:post.id' class='date' title=''></abbr>
  </a>
 </b:if>
</b:if>

Primeiro eu removi o tag <data:post.timestamp> do tag abbr. Em seguida eu atribui ao tag um id gerado utilizando o identificador da postagem que é único. Por fim inseri o tag <script> logo acima do tag <a> com o código que faz o processo de formatação e injeção da data.

Vamos analisar o código acima.

  • Na linha 04 eu criei uma função que será executada pelo jQuery assim que a página estiver carregada completamente. Por isso, enquanto sua página estiver carregando você não verá a data da postagem.
  • Na linha 05 eu transformo a data fornecida pelo widget em um objeto javascript do tipo Date usando a função getDateFromFormat que recebe como primeiro parâmetro uma string com a data e como segundo parâmetro uma string com o formato da data. Note que o tag <data:post.timestamp> foi transferido para cá. Se você escolheu o mesmo formato de data que eu, conforme mostrado na figura da página de configuração do widget Blog, pode utilizar a mesma string de formatação.
  • Na linha 08 eu criei a variável formatoExibicao que é uma string formada pela concatenação de outras strings estaticas e strings geradas pela função formatDate que recebe como primeiro parâmetro um objeto do tipo data e como segundo parâmetro uma string com o formato desejado. Para aqueles que têm conhecimento de Java, os formatos aceitos por estas funções são bem parecidos com os da classe SimpleDateFormat, entretanto, não existe um caracter de escape que permita fazer com que a função ignore um determinado caracter que representa um formato. Por isso foram usadas funções separadas para cada parte da data, caso contrário, a função interpretaria o "d" do trecho "de" e o "s" do trecho "às" como formatação da data. Esta variável será utilizada para injetar a data no formato que queremos exibir.
  • Na linha 12 eu criei a variável formatoUTC que será utilizada para definir o atributo title do tag abbr utilizado para exibir a data.
  • Nas linhas 16 e 17 eu injeto a data formatada no tag abbr e defino o titulo do tag com a data no formato UTC respectivamente utilizando o jQuery. Nessas linhas eu utilizo o id gerado para o tag abbr. O id é a combinação da palavra dataPostagemDisplay_ e o identificador da postagem. Note que eu utilizei o tag <data:post.id/> para obter esse id.
  • Na linha 21 eu defino o id do tag abbr utilizando a expressão expr:id='"dataPostagemDisplay_" + data:post.id'
Entendendo o código de formatação das funções de manipulação de data

O formato da data deve ser definido através de uma string que contém os códigos que representam seu formato. Cada código (letra) representa uma parte da data (dia, mês, ano, etc). A capitalização é importante, ou seja, M(mês) é diferente m(minuto). As representações, geralmente, possuem uma forma completa, que produz a representação integral da parte da data e uma forma abreviada que produz variações. Lembrando que o formato da data é utilizado tanto para formatar a data como para converter uma string em data, então, a descrição do código indica tanto o que ele gera quanto o que ele converte. Os formatos de partes númericas como hora, por exemplo, quando fixados em 2 digitos adicionam o zero (ou requerem no caso da conversão) antes dos valores menores que 10.

Tabela de formatos disponíveis (Baseada na documentação do código de Matt Kruse)
Parte da data Forma completa Forma abreviada
Ano yyyy (4 digitos) yy (2 digitos), y (2 ou 4 digitos)
Mês MMM (nome ou abreviação) MM (2 digitos), M (1 ou 2 digitos)
NNN (abreviação)  
Dia do Mês dd (2 digitos) d (1 ou 2 digitos)
Dia da Semana EE (nome) E (abreviação)
Hora em AM/PM (1 à 12) hh (2 digitos) h (1 ou 2 digitos)
Hora do dia (0 à 23) HH (2 digitos) H (1 ou 2 digitos)
Hora em AM/PM (0 à 11) KK (2 digitos) K (1 ou 2 digitos)
Hora do dia (1 à 24) kk (2 digitos) k (1 ou 2 digitos)
Minuto mm (2 digitos) m (1 ou 2 digitos)
Segundo ss (2 digitos) s (1 ou 2 digitos)
Simbolo AM/PM a
Exemplos

O código d MMM, y aceita qualquer uma das seguintes datas:

  • 01 Abril, 2008
  • 1 Abril, 2008
  • 01 Abr, 2008
  • 01 Abr, 08
  • 1 Abr, 08

Já o código dd MMM, yyyy só aceitaria as seguintes datas:

  • 01 Abril, 2008
  • 01 Abr, 2008

Na hora da formatação, a data utilizada no exemplo, usando o código d MMM y resultaria em 1 Abril, 2008. Note a diferença entra a formatação e a conversão. Na conversão um mesmo formato pode aceitar variações enquanto na formatação o resultado será sempre o mesmo.

O que você achou dessa postagem?

3 Comentários

Tags: , ,

Personalizando o modelo de dados do jGuard

Vinícius Pitta Lima de Araújo

Para utilizar um bancos de dados como backend dos mecânismos de autenticação e autorização do jGuard deve-se utilizar o JdbcAuthenticationManager e o JdbcAuthorizationManager respectivamente. Não é necessário utilizar os dois em conjunto já que a autenticação e autorização, no modelo de segurança do JAAS, são coisas 'separadas'. Não é necessário também utilizar o modelo de dados do jGuard. Nas empresas de desenvolvimento é comum existirem padrões de nomeclatura. Para o jGuard isso não é problema. Para personalizar os DDLs e DMLs utilizados pelo jGuard basta criar um arquivo properties com as propriedades adequadas e definir as propriedades authenticationDatabaseFileLocation e authorizationDatabaseFileLocation no arquivo e configuração do jGuard. Para saber como configurar o JdbcAuthenticationManager e o JdbcAuthorizationManager consulte os capitulos 3 e 5 da referência do jGuard respectivamente.

É importante observar que para que o jGuard possa manipular os DDLs e DMLs definidos no arquivo properties personalizado é preciso, além de definir as propriedades corretas, utilizar os alias equivalentes ao modelo original do jGuard.

Exemplo

Neste exemplo, vamos supor que o modelo de dados utiliza uma tabela Usuario com a seguinte estrutura:

Usuario (id, nome, login, senha)

No modelo original do jGuard existem as tabelas jg_user e jg_credential. A primeiro contém apenas o id do usuário e a segunda contém as credênciais públicas e privadas dos usuários cadastrados e a chave estrangeira user_id que estabelece a ligação com a tabela jg_user. No modelo do exemplo as duas tabelas foram agrupadas em uma única tabela e o nome das colunas está diferente. A tabela Usuario possui duas credênciais públicas (nome e login) e uma privada (senha). Agora é necessário personalizar o arquivo com as queries de banco. Vamos utilizar como exemplo o arquivo authentication.mysql.properties. Graças à nossa alteração na estrutura das tabelas será necessário alterar todas as queries que envolvam, de alguma forma, as entidades User e Credentials. Para fins de simplificação mudaremos apenas algumas queries.

#recupera as credenciais privadas de um usuário
PRIVATE_CREDENTIALS=select 'senha' as cred_name, usuario.senha as cred_value from usuario where usuario.id= ? 
#recupera as credênciais publicas de um usuário
PUBLIC_CREDENTIALS=select * from
((select 'nome' as cred_name, u1.nome as cred_value from usuario u1)
union 
(select 'login' as cred_name, u2.login as cred_value from usuario u2 )) as u
where u.id = ?

O exemplo acima altera as queries que o jGuard usa para recuperar as credênciais públicas e privadas de um usuário. Note que é importante manter o nome das colunas iguais às do modelo original do jGuard, ainda que suas colunas tenham nomes diferente, e o mesmo número de parâmetros das queries. Você pode utilizar também stored procedures e function.

O que você achou dessa postagem?

8 Comentários

Tags:

Validação cliente utilizando o plugin Validation do JQuery

Vinícius Pitta Lima de Araújo

Atualmente eu estou desenvolvendo uma aplicação WEB em JAVA utilizando o framework struts 2 e a biblioteca javascript YUI para a interface com o usuário. Apesar do trabalho inicial para deixar tudo redondinho (curva de apredizagem), os dois estão dando ótimos resultados. O struts 2, que não é baseado no struts 1, está mais simples e fácil de configurar além de ter ganhado mais flexibilidade e estar melhor estruturado. O ponto fraco é que a documentação deixa muito a desejar, possui poucos detalhes e os exemplos são muito simplistas. Isso me rendeu muitas dores de cabeça e bastante trabalho de pesquisa pra conseguir botar algumas coisinhas simples para funcionar. O YUI é uma ótima biblioteca javascript para montar interfaces com o usuário ricas. Funciona razoavelmente bem com a maioria dos navegadores e é simples de usar. Simplicidade pra mim é essêncial e o YUI tem uma grande vantagem: é possível criar os componentes (menus, dialogos, botões, etc) através do markup além da opção de fazer tudo via javascript. Dessa forma seu código fica mais légivel e semântico na hora do desenvolvimento e você tem um controle maior do HTML. O ponto fraco é que quando alguma coisa não funciona você tem que funçar com atenção para encontrar o erro e existem alguns poucos bugzinhos na versão 2.4.1 que atrapalham mas são contornáveis.

Combinando tudo isso eu consegui uma boa solução para minha interface com o usuário porém restaram algumas brechas. Apesar de o struts ter, desde a primeira versão, uma boa solução de validação que gera, inclusive, validação do lado cliente, eu não estava completamente satisfeito. Se você tem telas simples que funcionam com apenas uma action, o struts 2 te atende perfeitamente neste quesito. Porém quando as coisas começam a ficar mais complexas e sofisticadas, o custo de personalizar a validação cliente para atender às suas necessidades cresce. No struts 2 a validação cliente ficou nos temas. Se você quiser alterar o javascript de validação cliente terá que editar o arquivo form-close-validate.ftl do tema XHTML. Eu considerei muito trabalhoso edita-lo para atender meus requisitos de validação cliente. Eu precisava de uma solução mais prática e simples. Uma rápida busca no google e eu encontrei uma solução além das minhas expectativas: o plugin Validation do JQuery.

O JQuery é, basicamente, uma biblioteca javascript que facilita a manipulação do DOM via javascript. Ele permite a navegação (atravessamento) de forma simplificada através de uma linguagem simples de seleção. O JQuery dota seus objetos DOM de funcionalidades que facilitam seu acesso e manipulação e permite, através de plugins, a adição de fucionalidades de forma não intrusiva. O Validation é um plugin para JQuery para validação de formulários HTML.

Utilizando o Validation

A utilização do Validation consiste basicamente na definição das regras de validação do seu formulário. Você pode também personalizar as mensagens de erro, como elas são apresentadas e controlar a aparência dos campos com erro. Tudo no Validation pode ser personalizado, sua documentação é bem completa e a página do plugin possui uma coleção completa de demos com diversas situações comuns. O Validation faz validação por campos, porém você pode implementar suas próprias regras de validação criando validações mais complexas baseadas no estado do formulário. Existem 3 formas de definir as regras de validação de um campo:

  1. Javascript: Você define todas as regras de validação do formulário através do método validate e pode também personalizar outros comportamentos da validação;
  2. Class CSS: Associe ao campo classes CSS correspondentes aos métodos de validação (Ex.: required, number, date, etc);
  3. Atributos HTML: Se o validation encontrar no seu campo o atributo maxlength, por exemplo, ele irá transforma-lo automáticamente numa regra de validação.

Eu não vou me prender aos detalhes da utilização do Validation. Os exemplos da página do plugin são bastante instrutivos e você não terá dificuldade para acompanha-los. Irei abordar alguns pontos que podem ser armadilhas na sua utilização. Se você está usando o framwork struts 2, provavelmente está colocando seus beans, que representam objetos de dominio, nas actions e utilizando a notação OGNL para acessa-los. Nos exemplos do Validation o atributo id dos campos é sempre igual ao atributo name. No seus forms, provavelmente, isso não é verdade. Por isso fique atento para usar o name dos campos na definição das regras de validação caso você utilize a definição em javascript. Veja o exemplo abaixo:

<%@ taglib prefix="s" uri="/struts-tags" %>

<html>

 <head>

 <title>Exemplo validação com Validation</title>
 <script type="text/javascript" src="js/jquery-1.2.1.min.js"></script>
 <script type="text/javascript" src="js/jquery.validate.js" ></script>
 <script type="text/javascript">
  $().ready(function() {
  $("#pessoaForm").validate({
  rules : {
  "pessoa.nome" : "required",
  "pessoa.paisOrigem" : "required"
  },
  messages : {
  "pessoa.nome" : "O nome é obrigatório para o cadastro.",
  "pessoa.nome" : "O país de origem é obrigatório para o cadastro."
  }
  });
  });
 </script>
 </head>
 <body>
  <s:form id="pessoaForm">
   <s:textfield id="nome" name="pessoa.nome" label="Nome" required="true" />
   <s:select id="pais"  name="pessoa.paisOrigem" label="País de Origem"  required="true" list="paises" />
   <s:submit />
  </s:form>
 </body>
</html>

Você pode também personalizar as mensagens de erro utilizando markup. Para isso você deverá personalizar as propriedades errorContainer,errorLabelContainer e wrapper. Você pode ainda alterar a forma como as mensagens de erro são inseridas e a classe de erro que é adicionada aos campos com erro. Se você utilizar o elemento padrão para representar a mensagem de erro, o label, a relação entre a mensagem de erro e o campo será feita através do atributo for. O atributo for deve conter um id válido, por isso, neste caso, ao invés do valor do atributo name do campo, você utilizará o atributo id. Na verdade o Validation identificará a mensagem se você utilizar o valor do atributo name, porém esse seria um uso semanticamente incorreto do tag. Veja o exemplo abaixo:

<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
 <head>
 <title>Exemplo validação com Validation</title>
 <script type="text/javascript" src="js/jquery-1.2.1.min.js"></script>
 <script type="text/javascript" src="js/jquery.validate.js" ></script>
 <script type="text/javascript">
  $().ready(function() {
   $("#pessoaForm").validate({
    rules : {
    "pessoa.nome" : "required",
    "pessoa.paisOrigem" : "required"
    },
    errorContainer : $("#errosDeValidacao"),
    errorLabelContainer : $("#errosDeValidacao > ul"),
    wrapper: "li"
    });
  });
 </script>
 </head>
 <body>
  <div id="errosDeValidacao">
   <p>Não foi possísvel continuar devido ao(s) seguinte(s) erro(s) de validação </p>
   <ul>
    <li><label for="nome" class="error">O nome é obrigatório para o cadastro.</label></li>
    <li><label for="pais" class="error">O país de origem é obrigatório para o cadastro.</label></li>
   </ul>
  </div>
  <s:form id="pessoaForm">
   <s:textfield id="nome" name="pessoa.nome" label="Nome" required="true" />
   <s:select id="pais"  name="pessoa.paisOrigem" label="País de Origem"  required="true" list="paises" />
   <s:submit />
  </s:form>
 </body>
</html>
Exibindo a mensagem de erro com o YUI

Como estou utilizando o YUI para criar uma interface com usuário rica nada mais natural que exibir as mensagens de erro de validação como um dialogo do YUI. Para que isso seja possível é preciso estar atento apenas a um detalhe: o Validation exibe/esconde os erros de validação alternando a propriedade CSS display do errorContainer entre os valores block e none respectivamente. Isso não funcionará com nosso dialogo. Ao invés disso precisamos invocar os métodos show e hide do dialogo. Isso será feito personalizando o método showErrors do Validation. Observe os comentários no código.

<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
 <head>
  <title>Exemplo validação com Validation</title>
  <script type="text/javascript" src="js/jquery-1.2.1.min.js"></script>
  <script type="text/javascript" src="js/jquery.validate.js" ></script>
  <link rel="stylesheet" type="text/css" href="yui/build/fonts/fonts-min.css" />
  <link rel="stylesheet" type="text/css" href="yui/build/button/assets/skins/sam/button.css" />
  <link rel="stylesheet" type="text/css" href="yui/build/container/assets/skins/sam/container.css" />
  <script type="text/javascript" src="yui/build/utilities/utilities.js"></script>
  <script type="text/javascript" src="yui/build/button/button.js"></script>
  <script type="text/javascript" src="yui/build/container/container.js"></script
  <script type="text/javascript">
   YAHOO.util.Event.onDOMReady(function() {
    //registra o namespace
    YAHOO.namespace("net.viniciusaraujo.dialogos");
    //cria a instância do dialogo com 600px de largura, fixado no centro da tela com o icone de aviso.
    YAHOO.net.viniciusaraujo.dialogos.dlErros = new YAHOO.widget.SimpleDialog("errosDeValidacao",
     {  width: "600px",
      fixedcenter: true,
      visible: false,
      draggable: true,
      close: true,
      icon: YAHOO.widget.SimpleDialog.ICON_WARN,
      constraintoviewport: true,
      //cria um botão com o rótulo OK cuja ação é esconder o dialogo
      buttons: [    
        { text:"OK", handler: function() {this.hide();}, isDefault:true }
       ]
     });
    YAHOO.net.viniciusaraujo.dialogos.dlErros.render();
    //sempre que o dialogo for fechado todos os itens de erro serão escondidos
    YAHOO.net.viniciusaraujo.dialogos.dlErros.hideEvent.subscribe(function() {
     esconderErros();
    });
   });

   //essa função esconde os intes de erro da lista.
   function esconderErros() {
    //esconde todos os itens da lista de erro alternando a propriedade CSS display para 'none'.
    //isso é feito para evitar que erros que foram corrigidos apareçam novamente no dialogo de erro
    var itensListaErros = $("#errosDeValidacao > div.bd > ul > li");
    for (var i = 0; i < itensListaErros.length; i++) {
     $(itensListaErros[i]).css("display", "none");
    }
   }

   $().ready(function() {
    $("#pessoaForm").validate({
     rules : {
     "pessoa.nome" : "required",
     "pessoa.paisOrigem" : "required"
     },
     errorContainer : $("#errosDeValidacao"),
     errorLabelContainer : $("#errosDeValidacao > ul"),
     wrapper: "li",
     showErrors: function(errorMap, errorList) {
      //a mensagem de erro agora é personalizada de acordo com o número de erros.
      var erros = this.numberOfInvalids();
      if (erros) {
        var mensagem = erros == 1 ?
         "Foi encontrado um erro no formulário" :
         "Foram encontrados " + erros + " erros no formulário";
        $("#errosDeValidacao > div.bd p").html(mensagem);
        //esconde os erros anterios.
        esconderErros();
        //executa o procedimento padrão do Validation para exibir os erros de validação
        this.defaultShowErrors();
        //exibe o dialogo de erro 
        YAHOO.net.viniciusaraujo.dialogos.dlErros.show();
      }
     }
    });
   });
  </script>
 </head>
 <body>
  <div id="errosDeValidacao">
   <div class="hd">Erro</div>
   <div class="bd">
    <p>Não foi possísvel continuar devido ao(s) seguinte(s) erro(s) de validação </p>
    <ul>
     <li><label for="nome" class="error">O nome é obrigatório para o cadastro.</label></li>
     <li><label for="pais" class="error">O país de origem é obrigatório para o cadastro.</label></li>
    </ul>
   </div>
  </div>
  <s:form id="pessoaForm">
   <s:textfield id="nome" name="pessoa.nome" label="Nome" required="true" />
   <s:select id="pais"  name="pessoa.paisOrigem" label="País de Origem"  required="true" list="paises" />
   <s:submit />
  </s:form>
 </body>
</html>
O que você achou dessa postagem?

0 Comentários

Tags: , ,

Usando o charset UTF-8 com SciTE

Vinícius Pitta Lima de Araújo

Na hora de desenvolver aplicações WEB uma das coisas que pode causar muita dor de cabeça é o encode das páginas e do banco de dados. Certa vez eu tive um grande problema implementando criptografia de senhas em um banco de dados Oracle. O encode padrão do banco era diferente do encode padrão do JAVA. Quando eu criptografava a senha e armazenava no banco a string estava em um charset e era armazenada em outro. Quando a senha era recuperada e comparada com a senha criptografada que o usuário forneceu as duas não batiam porque estavam em charsets diferentes.

Acredito que todo desenvolvedor já passou por experiências parecidas. O problema mais comuns são as páginas que exibem os acentos gráficos e ç como caracteres estranhos ou coisa parecida. Por isso é importante entender bem os charsets e encodes. O artigo Charsets e Encodes - Tabelas de caracteres do site Tableless explica com clareza esses conceitos e sugere a utilização do UTF-8 como padrão.

Confesso que não tinha atentado para a idéia antes pois já estava habituado a utilizar o charset ISO-8859-1, mas gostei. Então fui procurar como gravar um documento em UTF-8 no meu editor padrão, o SciTE.

Se você quiser alterar o encode apenas do documento atual vá em File > Encondinhg > UTF-8. Porém se você quiser alterar o charset utilizado em todos os documentos é preciso editar o arquivo SciTEGlobal.properties(Opitons > Open Global Options File) e alterar a propriedade code.page, que por padrão tem o valor 0 para que o SciTE tente detectar automáticamente o charset utilizado na página, e character.set. No arquivo você encontrará as propriedades comentadas com os valores para UTF-8. Basta comentar a linha existente (com o #) para as propriedades e retirar o # das linhas comentadas.

Pronto! Agora você pode escrever páginas WEB que serão bem visualizadas em qualquer navegador. Algumas vezes o navegador não consegue detectar o encode utilizado e os acentos gráficos não aparecem corretamente. Utilizando o UTF-8 você não terá mais esse problema pois é o encode padrão da maioria dos navegadores.

O que você achou dessa postagem?

0 Comentários

Tags: ,

Palestra no III Festival de Software Livre da Bahia

Vinícius Pitta Lima de Araújo

Ontém (25/08) eu apresentei a palestra "Segurança Fácil de Aplicações WEB com o jGuard" no III Festival de Software Livre da Bahia as 20hs no auditório Raul Seixas. Se eu fosse um bom blogger teria divulgado a palestra antes. Como o meu endereço foi divulgado na apresentação é possível que algum dos presentes faça uma visita em busca de mais informações ou por simples curiosidade. Se você assistiu à palestra fica aqui o convite para dar seu feedback (sem maldade, é claro). Página do jGuard
O que você achou dessa postagem?

2 Comentários

Tags: , ,

Minha boa ação!

Vinícius Pitta Lima de Araújo

Pra pagar os meus pegados e, quem sabe, conseguir uma vaguinha no céu eu resolvi fazer minha boa ação. Depois de peder a paciência com incontáveis demonstrações de ignorância digital no Orkut, eu, que nem sou muito de frequenta-lo, decidi dar um jeito nisso. Ao invés de simplesmente reclamar, eu achei que seria melhor tomar uma providência. A internet é terra de ninguém. Território perfeito para os criadores de boatos e usuários mal intencionados. Muitas pessoas, por não dominar os conceitos básicos da tecnologia, deslumbradas com o mundo que se abre à sua frente, acreditam em tudo que lêem na Internet, como se fosse uma verdade dita por aquela professora do primário que acreditavamos saber tudo! É como se o fato de estar na Internet confirmasse a veracidade de qualquer informação. As pessoas perdem a malicia quando estão online! Os conceitos básicos de informática necessários para discernir melhor as informações que chegam pela WEB e evitar as armadilhas virtuais não são tão complexos. Porém muita gente não sabe disso e termina por não aprender porque se acha incapacitado. Já que a ignorância digital das pessoas estava me incomodando tanto eu resolvi acabar com o problema. Resolvi combater os usuários mal intencionados preparando os usuários inocentes contra seus truques. Eu decidi realizar uma alfabetização digital. Como o campo de batalha é o Orkut, eu criei uma comunidade onde escrevo tópicos (os quais denomino artigos) desmistificando assuntos relacionados a segurança na Internet. A comunidade está aberta para todos que queiram aprender ou ensinar. O importante é compartilhar o conhecimento pois conhecimento é poder! Eu estou feliz com minha iniciativa! Por enquanto a quantidade de membros é modesta e eu estou sentindo falta de um feedback para medir a efetividade de meu trabalho, mas trabalho voluntário é assim, nós fazemos sem esperar nada em troca! O importante é que eu estou fazendo minha parte.
O que você achou dessa postagem?

0 Comentários

Tags: