Read this post in english here
Nossa, faz tempo que não escrevo nada por aqui né? Bom, hoje eu fiz um pouquinho de código que fiquei com vontade de compartilhar.
No mundo da web, um(a) slug é a representação de um título ou conteúdo que pode ser adicionado à URL de uma página. Nos últimos tempos, o(a) slug tem recebido maior atenção por ser um ótimo fator na hora de otimizar o seu site para buscadores (SEO), por ele(ela) está sempre presente nos principais CMS’s por aí como, por exemplo, o Wordpress.
Eu estava fazendo um sisteminha simples de e-commerce em CakePHP e precisava criar slugs para as categorias e produtos da loja. Eu já havia escrito um código que fazia isso pra mim, mas estava solto no app_model.php. Eu sabia que já existia um behaviour que fazia exatamente isto. Era o Sluggable Behaviour, escrito pelo Mariano Iglesias, um grande desenvolvedor que trabalha com Cake.
Apesar de ser um behaviour muito bem escrito e flexivel, eu fiquei com vontade de tentar fazer minha própria versão dele. Algumas coisas, com a própria geração do(a) slug poderiam ficar por conta da função Inflector::slug() por exemplo, dentre outras pequenas mudanças que eu gostaria de ver no código. Por isso eu fui lá e tentei fazer meu próprio behaviour. Na verdade, eu usei o código do Mariano como base e fui trabalhando em cima, o que me ajudou muito a entender como behaviours funcionam e devem ser escritos. Se você comparar os códigos, vai ver muitas coisas similares.
Eu não tenho a mínima pretenção de dizer que o que eu fiz é melhor que o original, porque tenho quase certeza que não é, mas é uma solução mais simples e mais leve, então alguma vantagem tem. Se quiser usar, crie um arquivo com o nome “sluggable.php” dentro da pasta /app/models/behaviours e coloque o conteúdo deste link lá.
Exemplo: Digamos que você tem um model chamado “Post”, e nesta tabela você possui um campo chamado “title” e outro “slug”. Para usar o meu Sluggable Behaviour, basta adicionar a seguinte linha no seu /app/modesl/post.php
var $actsAs = array('Sluggable');
Pronto! Isto basta para que, toda vez que você salvar um novo post, um(a) slug seja criada a partir to campo title inserido. Se os campos no seu banco tem outros nomes, fica fácil configurar o behaviour para que ele responda a essas diferenças. Exemplo:
var $actsAs = array('Sluggable' => array(
'fields' => 'titulo',
'slugfield' => 'url'
));
Se você quiser concatenar as informações de mais de um campo para gerar a slug, basta indicar a chave ‘fields’ como uma array, assim:
var $actsAs = array('Sluggable' => array(
'fields' => array('titulo', 'codigo'),
'slugfield' => 'url'
));
Por padrão, se você escrever um título como “Este é meu título” o(a) slug vai ficar assim: este-e-meu-titulo. Se você quiser, pode modificar o separador das palavras:
var $actsAs = array('Sluggable' => array(
'fields' => array('titulo', 'codigo'),
'slugfield' => 'url',
'separator' => '_'
));
Dentre outras opções, você ainda pode configurar as seguintes chaves:
var $actsAs = array('Sluggable' => array(
'fields' => array('titulo', 'codigo'),
'slugfield' => 'url',
'separator' => '_',
'length' => 256, //define um tamanho padrão para o(a) slug - o padrão é "256"
'overwrite' => true, //se verdadeiro, modifica o(a) slug na hora da edição
//caso contrário, mesmo editando, o(a) slug permanecerá
//igual ao da adição - o padrão é "false"
'lower' => false //se verdadeiro, transforma todo(a) slug em caixa baixa - o padrão é "true"
));
É isso! Gostaria de deixar claro, mais uma vez, que este behaviour é totalmente inspirado pelo behaviour do Mariano. Mantive o mesmo nome não porque eu ache que o meu possa substituir o dele, mas simplesmente porque eu queria que este fosse o nome do behaviour no meu projeto, deixando o código mais bonito e coerente.
Tenho certeza que pode ter alguns erros e outras coisas podem ser melhoradas, por isso, sinta-se à vontade para sugerir, criticar ou elogiar! Se houver alguma dúvida também, é só comentar! Abraços!
Tags: behaviour, CakePHP, slugComentários /comments
-
Éber escreveu:Postado em October 8, 2009 às 8:53 am@Felipe
Você está correto! Eu já corrigi ali no artigo
Valeu! -
Mauro George escreveu:Postado em November 19, 2009 às 6:14 pmOlá Éber sou novo no cakePHP fui testar o seu behavior e encontrei um Big ao tentar incluir o caractere ã, ou º ª §, como você ja esta a mais tempo do que eu no cakePHP ve se tem como seguir a logica de que como definimos no core o charset que estamos trabalhando automaticamente ele o definir aqui, ao invés de como no do Mariano temos que definir ‘translation’ => ‘utf-8′ caso saiba como fazer aconselho ate passar isso ao mariano pois seria mais logico o sistema buscar do proprio core.
Boa iniciativa, abraço e sucesso,
Mauro George -
Éber escreveu:Postado em November 19, 2009 às 6:21 pm@Mauro
Poisé. O Behaviour que eu fiz usa o método do Core, em Inflector::slug(). Talvez seja o caso de enviar um ticket pro time e pedir que façam essas adições ao método.
Você pode enviar estes tickets aqui: http://code.cakephp.org/ticketsNa verdade, eu já divia ter feito isto porque sempre que sai uma versão nova, modifico o core pra suportar pelo menos o ã
-
Mauro George escreveu:Postado em November 20, 2009 às 3:27 amUma dica em relação ao behavior do Mariano no site ele diz
All future official releases will be posted on this article
, no entanto não sei se o projeto foi abandonado ou o que, só sei que estou utilizando a revisão 48 ao inve da anterior que ele fala que sempre mantera atualizada pois a que esta oficial é 36 e esta gera um problema de não adicionar um numero ao final da slug ou seja se criar meu-artigo, duas vezes, depois ele substituira e com a versão 48 ele criara meu-artigo-1 o link da ultima versão é http://cake-syrup.svn.sourceforge.net/viewvc/cake-syrup/trunk/app/models/behaviors/sluggable.php?view=markup
Olá gostei do seu behaviour porem nos seus exemplos esta errado quando for passar parametros para o behaviour você tem que assosiar
http://book.cakephp.org/view/90/Using-Behaviors
seu:
var $actsAs = array(’Sluggable’, array(
‘fields’ => ‘titulo’,
’slugfield’ => ‘url’
));
certo:
var $actsAs = array(’Sluggable’ => array(
‘fields’ => ‘titulo’,
’slugfield’ => ‘url’
));