Topic: Slug dinamico senza database
avendo la necessità di avere degli url "seo friendly", ma non potendo utilizzare il database per memorizzare la relativa stringa, mi sono creato un component che mi permette di ottenerli dinamicamente:
<?php
// /app/controllers/components/slug.php
/**
* Component per gestire gli url Seo-friendly (Slug) in modo dinamico, senza db
*
* @author ToX
* @todo Sistemare il redirect nella funzione check. Utilizza metodi amarognoli e non va bene con cake
*
*/
class SlugComponent extends Object {
var $separator = ";"; // separatore per suddividere l'id dalla stringa slug
var $spacer = "_"; // come ti converto gli spazi
var $path = "items/view"; // percorso a cui puntare (es. items/view)
function check($id, $title, $url) {
$slug = $this->buildSlug($id, $title);
if ($url!==$slug) {
$siteurl = Router::url("/");
header("location: {$siteurl}{$this->path}/{$slug}");
exit;
} else {
return false;
}
}
function buildSlug($id, $title)
{
$slug = preg_replace("/[^a-zA-Z0-9\s]/", "", $title);
$slug = preg_replace("/ /", $this->spacer, $slug);
$slug = strtolower($slug);
return $id . $this->separator . $slug;
}
function splitSlug($urlslug)
{
@list($id, $slug) = preg_split("/[{$this->separator}]/", $urlslug, 2);
return array('id' => $id, 'slug' => $slug);
}
}
?>tutto questo viene richiamato dai controller così:
function view($slugstr = 1)
{
$slugSplit = $this->Slug->splitSlug($slugstr);
$id = $slugSplit['id'];
$slug = $slugSplit['slug'];
$title = "titolo della pagina" // (oppure il tuo codice per recuperare il titolo normale, non sluggato)
$this->Slug->check($id, $title, $slugstr); // controlla se lo slug è a posto, se non lo è effettua il redirect
........et voilà... ora però vorrei poter accedere a queste funzioni anche da un element, è possibile secondo voi? ![]()
Last edited by ToX (10-09-2008 13:50:31)