Yii Framework Forum: Routes avec Yii - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Routes avec Yii Rate Topic: -----

#1 User is offline   ajaxian 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 168
  • Joined: 02-June 10

Posted 23 October 2010 - 03:54 AM

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 ?
0

#2 User is offline   ajaxian 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 168
  • Joined: 02-June 10

Posted 23 October 2010 - 05:58 AM

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...
0

#3 User is offline   Co-k-ine 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 97
  • Joined: 29-March 10

Posted 25 October 2010 - 02:47 AM

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 :)
0

#4 User is offline   yiimann 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 102
  • Joined: 19-December 09

Posted 30 October 2010 - 11:31 AM

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

0

#5 User is offline   ajaxian 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 168
  • Joined: 02-June 10

Posted 31 October 2010 - 05:28 AM

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

#6 User is offline   Clem 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 30
  • Joined: 15-November 10

Posted 21 March 2011 - 06:22 AM

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.
0

#7 User is offline   Clem 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 30
  • Joined: 15-November 10

Posted 21 March 2011 - 06:25 AM

Le remède est ici:
http://antoine.goute...ugify-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), $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?
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users