segunda-feira, 18 de outubro de 2010

Uma maneira de reescrever GET usando JS


Eu andei procurando como reescrever o get method de um form no formato usado tradicionalmente do url rewrite, e para minha surpresa a resposta mais popular tratava esse problema simples de maneira pouco otimizada.
O primeiro link do google é do site do Matthew, assim como vários subsequentes que referenciam o proprio site do Matthew. A abordagem dele consistem em gerar um get para uma url que converte no lado do servidor a url para o estilo com barras e retorna o cabeçalho http com o location da url "ajeitada". A argumentação e motivação de porque esse é um assunto importante, para mim, é a mesma do Matthew. Então vou deixar essa parte para que vc leia no site do autor original.
Porém, é totalmente desnecessário fazer uma consulta para o servidor para gerar uma string. Então eu escrevi esse simples script usando dojo que converte os forms get para forms url rewrited.
<script type="text/javascript">
dojo.addOnLoad(function() {
   var form = dojo.query('form[method=get]');
   //pode existir mais de 1 form; Não foi tratado aqui!
   dojo.connect(form[0], 'onsubmit', function(e) {
       e.preventDefault();
       var location = '';
       var inputs = dojo.query('form[method=get] input[name]');
       for(i = 0; i < inputs.length; i++) {
           location += '/' + inputs[i].name + '/' + inputs[i].value;
           //sempre deve existir um campo hidden com name como controller e value como action
       }
       document.location = location;
   });
});
</script>

<form method="GET" >
<input type="hidden" name="paginator" value="index" >
<input type="text" name="q">
</form>
Eu não tratei múltiplos forms, mas você não vai ter dificuldade de descobrir como fazer isso certo? A mesma coisa vale se vc não gosta de dojo e quer esse script em jQuery ou mooTool.