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 seguinte conteúdo 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!