16th abr 2009
O POG nosso de cada dia #6
Mais um pra série; dessa vez, o requisito é uma funcionalidade em uma página para direcionar o usuário para uma ou outra página dependendo do estado/cidade que ele escolher – o cliente passa a lista das cidades que são excessão, umas 5, e redirecionam para uma url; as demais, mandam para outra url.
Implementei dois selects, um que de cara já lista todos os estados do Brasil e que, quando tem um estado selecionado, populo o outro select com as cidades desse estado usando requisição assíncrona via javascript pegando a lista do backend. Com isso, como fazer para redirecionar o usuário?
Solução bonita
Dar o submit no form para uma url para que o backend receba o id da cidade e verifique numa lista para qual url será feito o redirecionamento. Essa lista pode estar, por exemplo, numa tabela do banco relacionada com a tabela de cidades (que populou o select).
O Problema
Tempo e custo. Alterar o backend é sempre mais caro e mais demorado. E o cliente não queria aprovar dessa forma…
POG
Simples: tratar regra de negócio na interface. Nunca é correto, mas é mais rápido…
Tendo o select com as cidades (imaginando que esse é populado por javascript, requisição assíncrona):
<select name=”stateCities” id=”stateCities”>
<option value=”1″>cidade 1</option>
<option value=”2″>cidade 2</option>
<option value=”3″>cidade 3</option>
<option value=”4″>cidade 4</option>
<!– etc… –>
</select>
é só criar um listener no onchange desse select (fiz isso usando a Prototype) que verifica se o value da cidade selecionada está num array pré-definido (e hard-coded). Se estiver, direciono para uma url, senão, para outra…
Event.observe(“stateCities”, “change”, function() {
/*
lista das cidades que redirecionam para url 1
Campinas: 7
Ribeirão Preto: 54325
São José dos Campos: 78768
*/
var cities = ["7", "54325", "78768"];
//usa método member de Enum da prototype para verificar se existe elemento no array
if(cities.member($F(this)))
window.open(“http://www.minhaurl1.com”);
else
window.open(“http://www.minhaurl2.com”);
});

Pelo menos comentou no código de qual cidade são os IDs.
Comentar código é uma boa prática… até porque em algum momento terei que dar manutenção nisso e preciso me lembrar do que fiz!
Uma coisa dessas não acontece comigo. Sempre deixo bem claro para o cliente que não faço POG em hipótese alguma e que isso tem um custo adicional, se não gostar chame outro (e chamam, mas pelo menos eu economizo na dor de cabeça depois e não me exponho à críticas).
Eu tb gostaria que fosse assim, mas trampando em empresa não tem como ter que se sujeitar a fazer umas coisas dessas :-/
É por essas e outras que eu adoro ser freelancer! Posso até correr (bem) mais riscos, mas não tenho que me sujeitar a clientes Tio Patinhas…
Sinto sua dor!
[]s!
Gostei desta sequencia de post sobre “O POG nosso de cada dia”, com posts como estes da pra gente mostrar o nosso dia-a-dia de desenvolvedor onde as vezes somos submetidos a fazer POG por causa do TEMPO e CUSTO.
Valew..
Salve!
So uma duvida no script acima por exemplo esta “window.open()” por que nao usar somente open()?
Por que entre os proprios desenvolvedores JS nao usam um padrao do genero:
“alert(), prompt() e open() ou window.alert(), window.open() e window.prompt()”?
Muito bom o Blog Chris
=]
Olá Hard!
Essa é uma boa questão, a qual eu não tenho também uma boa resposta – eu mesmo não sigo um padrão.
E esse é o problema quando a linguagem dá abertura: se você pode fazer algo de duas formas, não tem como forçãr que se faça dessa forma apenas. É a mesma questão de usar ou não ponto-e-vírgula ao final de uma linha…
Mas, é algo para refletir a respeito!
[]s!
[...] #6: redirecionamento para uma url específica por javascript [...]