

Hoje vou mostrar uma Function para converter o nome dos produtos, categorias, páginas e demais seções de um site em “nomes” para serem usados na url amigável do seu site.
Para quem não saber, url amigável é utilizado para deixar as url’s de um site mais “bonitas“. Exemplo: temos um produto TÊNIS, sem url amigável o seu sistema provavelmente iria ter como url algo como (http://www.seusite.com.br/index.php?product_id=123) que iria indicar o ID do produto para que você possa encontrar qual produto exibir na tela do usuário. Usando url amigável você transforma a url em algo que diz um pouco mais sobre o produto (http://www.seusite.com.br/produto/tenis) dessa forma conseguimos deixar uma url mais facil de decorar, entender e divulgar, sem contar que melhora a indexação do seu site em SEO(Search Engine Optimization), pois da mesma forma que fica mais fácil para um usuário entender do que se trata a url, também fica mais fácil para o Google ou qualquer outro sistema de busca categorizar as suas páginas.
Existem várias maneiras de fazer url amigável, a maneira que utilizo é guardando no banco de dados o nome que desejo para o produto como url. Então se o nome do produto é TÊNIS MARCA X PRETO no campo Url Amigável eu preencho tenis_marca_x_preto que será utilizado na url. No meu sistema eu deixo esse campo a ser preenchido pelo Cliente(olha o perigo rss) na própria adminstração do produto, porém como se é de imaginar, o cliente não tem visão de que esse é um campo importante e acaba deixando em branco ou pior, quando travo como um campo obrigatório e valido o campo para não permitir espaços, acentos e outros caracteres especiais o cliente simplesmente não consegue cadastrar o produto, pois não consegue gerar uma url válida.
Sendo assim resolvi criar uma FUNCTION em MySql que converta automaticamente o nome do produto, categoria, etc em uma url amigável válida. Também criei uma TRIGGER que valida se o usuário preencheu o campo, caso não tenha preenchido a trigger dispara a function convertendo o nome e gravando o campo url amigável.
Bom chega de histórinhas e vamos ao que interessa, como criar a tal função e o tal gatilho.
A FUCNTION funciona de uma maneira bem simples, basicamente troco os caracteres indesejádos por caracteres válidos para uma url e retorno o nome já convertido para ser usado.
CREATE FUNCTION urlAmigavel(name VARCHAR(255)) RETURNS VARCHAR(255) BEGIN DECLARE campo VARCHAR(255); SET campo = TRIM(UCASE(name)); SET campo = REPLACE(campo ,'Á','A'); SET campo = REPLACE(campo ,'À','A'); SET campo = REPLACE(campo ,'Ã','A'); SET campo = REPLACE(campo ,'Â','A'); SET campo = REPLACE(campo ,'É','E'); SET campo = REPLACE(campo ,'È','E'); SET campo = REPLACE(campo ,'Ê','E'); SET campo = REPLACE(campo ,'Í','I'); SET campo = REPLACE(campo ,'Ì','I'); SET campo = REPLACE(campo ,'Î','I'); SET campo = REPLACE(campo ,'Ó','O'); SET campo = REPLACE(campo ,'Ò','O'); SET campo = REPLACE(campo ,'Ô','O'); SET campo = REPLACE(campo ,'Õ','O'); SET campo = REPLACE(campo ,'Ú','U'); SET campo = REPLACE(campo ,'Ù','U'); SET campo = REPLACE(campo ,'Û','U'); SET campo = REPLACE(campo ,'Ü','U'); SET campo = REPLACE(campo ,'Ç','C'); SET campo = REPLACE(campo ,' ','_'); SET campo = REPLACE(campo ,' ','_'); SET campo = REPLACE(campo ,'+',''); SET campo = REPLACE(campo ,'_-_','-'); SET campo = REPLACE(campo ,'/',''); SET campo = REPLACE(campo ,'\\',''); SET campo = REPLACE(campo ,'?',''); SET campo = REPLACE(campo ,'&',''); SET campo = REPLACE(campo ,'__','_'); RETURN LCASE(campo); END;
OBS: Caso queria alterar a FUNCTION depois de já ter criado ela no seu banco de dados, é necessário apagar a função e criar novamente. O comando para apagar seria o (DROP FUNCTION `nomeDaFuncao`;)
Após criada a função podemos testar, executando a função na tabela de produtos e no campo nome, assim é possível visualizar como vai ficar os nomes antes de atualizar.
SELECT urlAmigavel(campoNomeProduto) FROM tabelaProduto
Veja que o retorno desta query é o nome do produto já retirando os espaços, acentos e caracteres especiais. Neste exemplo coloquei os caracteres que achei necessário, caso tenha necessidade de substituir mais algum outro caracter que não conste nessa lista, você pode adicionar seguindo como exemplo os outros caracteres que foram tratados na função.
No meu caso o data base do cliente já estáva com vários produtos cadastrados então tive que atualizar o campo url_amigavel do meu banco com o nome dos produtos antes de gerar a trigger que irá fazer isso automaticamente. Para atualizar todos os registro a sintaxe fica mais ou menos como mostrado abaixo, bastando trocar pelo nome dos seus campos e tabelas.
UPDATE tabelaProduto SET campo_url_amigavel = urlAmigavel(campo_nome_produto) WHERE campo_url_amigavel IS NULL
Dessa forma iremos atualizar os produtos já existentes. No meu caso as url’s ficam separadas em uma tabela e o nome do produto fica em outra tabela, mas por essa query vocês podem entender o funcionamento e adaptar para as suas necessidades.
Agora vamos criar a TRIGGER no evento BEFORE INSERT, ou seja, toda vez que um novo produto for cadastrado.
DELIMITER $$ CREATE TRIGGER trgGeraUrlAmigavel BEFORE INSERT ON tabela_produto FOR EACH ROW BEGIN IF(NEW.campo_url_amigavel IS NULL) THEN SET NEW.campo_url_amigavel = urlAmigavel(NEW.campo_nome_produto); END IF; END$$
Conforme pode ser visto na trigger, é validado se o campo veio nulo, caso sim, insere o retorno da função para ser inserido como valor para a url amigável.
Espero que tenham gostado do post, qualquer sugestão, dúvida ou até crítica sobre o conteúdo, fiquem a vontade para comentar, a medida do possível vou respondendo os comentário. Toda contribuição é válida.
Caso tenha uma sugestão para novos posts sobre MySql, ORACLE, PHP, CSS, Ajax ou Jquery por favor mandem e-mail para blog@roberson.com.br que se eu tiver domínio do assunto em questão, com certeza irei criar um post sobre, e se não tiver domínio sobre o assunto, provavelmente vou estudar sobre e postar meus comentários, quem saber até um post mais complexo.
Até o próximo post.


More Options ...
Categorias
Nuvem de Tags
Blog RSS
Comentários RSS

Void « Default
Life
Earth
Wind
Water
Fire
Light 