Routes avec Yii

Bonjour à tous, toutes

Je viens du monde CodeIgniter et je débute avec Yii.

Ce que je souhaite faire c’est :

monsite.com/post/voir/12 je ne veux pas dans mes pages avoir cette écriture mais plutôt monsite.com/post/une-belle-aventure

avec CodeIgniter c’est très simple, et je avec cakePHP idem.

Si j’utilise Yii et urlManager, en définissant une route je n’aurais pas ce remappage.

‘rules’=>array(‘post/une-belle-aventure’=>‘post/voir/12’)

ça me permet juste en utilisant CHtml::link d’avoir l’url monsite.com/post/une-belle-aventure mais si on suit le lien on a une erreur 400 “Your request is invalid.”

comment faire ?

Bon, petits progrès:

je fais du routing avec urlManager c’est à dire j’arrive à control/action remappé sur control/action2 par exemple

style : post/une-belle-aventure remappé vers post/unebelleaventure (c’est pas bien sorcier ;D )

Par contre post/une-belle-aventure vers post/voirpost/12 par exemple je n’y arrive pas, il me sort une erreur 400

c’est le “12” qu’il ne “voit” pas…

Bonjour,

Afin que ce message ne reste pas sans réponse je vais y poster ce petit message mais je n’ai aucune idée de comment cette fonctionnalité s’applique à yii.

En revanche si tu trouve comment faire je ne serais pas contre un tutoriel à ce sujet :)


/* 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

  1. Il faut ajouter une colonne slug dans la table Post

  2. 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;

	}



Merci pour ton aide précieuse et bien documentée

Pour ma part, la fonction preg_replace ci-dessus ne fonctionne pas sur le serveur de production.

Est-ce que quelqu’un sait d’où ça peut venir? la version de php du serveur est 5.3

En local je suis aussi en 5.3 et ça fonctionne parfaitement.

Le remède est ici:

http://antoine.goutenoir.com/blog/2010/10/11/php-slugify-a-string/

Il faut préférer cette fonction:


/**

 * Modifies a string to remove all non ASCII characters and spaces.

 * Note : Works with UTF-8

 * @param  string $string The text to slugify

 * @return string         The slugified text

 */

function slugify ($string) {

  $string = utf8_decode($string);

  $string = html_entity_decode($string);

 

  $a = 'ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ';

  $b = 'AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn';

  $string = strtr($string, utf8_decode($a), $<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='B)' />;

 

  $ponctu = array("?", ".", "!", ",");

  $string = str_replace($ponctu, "", $string);

 

  $string = trim($string);

  $string = preg_replace('/([^a-z0-9]+)/i', '-', $string);

  $string = strtolower($string);

 

  if (empty($string)) return 'n-a';

 

  return utf8_encode($string);

}

Mais d’où vient le mal exactement?