/* Lire un post */
'post/<slug:[A-Za-z0-9-]+>' => array('post/voir', 'urlSuffix'=>'.html'),
/**
* Retourne un modèle Post
*/
public function loadModel()
{
if($this->_model===null)
{
if(isset($_GET['slug']))
$this->_model=Post::model()->find('slug =:slug', array('slug'=>$_GET['slug']));
if($this->_model===null)
throw new CHttpException(404,'The requested page does not exist.');
}
return $this->_model;
}
echo CHtml::link('Mon post', array('post/voir', 'slug'=>'une-belle-aventure'));
L’url aura cette forme : /post/une-belle-aventure.html
-
Il faut ajouter une colonne slug dans la table Post
-
Pour generer le slug :
class Formatter extends CFormatter {
static function slugify($text)
{
// replace non letter or digits by -
$text = preg_replace('~[^\\pL\d]+~u', '-', $text);
// trim
$text = trim($text, '-');
// transliterate
setlocale(LC_CTYPE,'fr_FR.UTF-8');
$text = iconv("UTF-8","ASCII//TRANSLIT", $text);
// lowercase
$text = strtolower($text);
// remove unwanted characters
$text = preg_replace('~[^-\w]+~', '', $text);
if (empty($text))
{
return 'n-a';
}
return $text;
}
}
post = new Post();
post->titre = 'Une belle aventure';
post->slug = Yii::app()->format->slugify(post->titre)
post->save();
Il est possible de travailler sans colonne slug dans la table mais pour cela il faut ajouter l’id dans l’url :
/* Actualité */
'actualite/<id:\d+>-<slug:[A-Za-z0-9-]+>' => array('actualite/view', 'urlSuffix'=>'.html'),
echo CHtml::link($actualite->titre, array('actualite/view', 'id'=>$actualite->id , 'slug'=>Yii::app()->format->slugify($actualite->titre)));
L’url aura cette forme : /actualite/24-yii-is-the-best.html
Et charger sur l’id en verifiant le bon slug pour eviter du duplicate content si le slug tape est pas correcte :
/**
* Retourne un modèle Actualite
*/
public function loadModel()
{
if($this->_model===null)
{
if(isset($_GET['id']))
$this->_model=Actualite::model()->published()->findByPk((int)$_GET['id']);
if($this->_model===null)
throw new CHttpException(404,'The requested page does not exist.');
$slug = Yii::app()->format->slugify($this->_model->titre);
if($slug != $_GET['slug'])
$this->redirect(array('actualite/view', 'id'=>$this->_model->id, 'slug'=>$slug));
}
return $this->_model;
}